使用 char str[100] 类型的参数并将其传递给较小的字符串时,Gcc 11+ 警告 Wstringop-overflow

阿纳斯塔丘

编码:

#include <stdio.h>

void Print(char str[100])
{   
    printf("%s", str);
}

int main(void)
{
    Print("A");
}

使用 GCC 11.1 及更高版本编译时会产生警告

警告:“打印”访问大小为 2 的区域中的 100 个字节 [-Wstringop-overflow=]

当我传递一个较小的字符串时。这没有启用任何警告标志。

示例代码:https ://godbolt.org/z/nWs1PK9Y6

正如您所看到的,其他编译器对此并不满意。

我确实找到了一个有相关问题的线程,但是关于一个更奇怪的 int 数组:

GCC 11 在不使用字符串操作时给出 -Wstringop-overflow

然而,这绝对是一个错误,已得到纠正,并且在树干尖端版本中不再发生,而在我显示的代码中,它在树干中仍然有相同的警告。

我认为这是另一个错误,或者至少是一个不是很有用的警告,因为据我所知,该参数将衰减为指针,但我想确认这一点。


正如评论部分所述,这对于警告 API 用户正在传递一个较小的字符串作为参数很有用,但这真的有意义吗,至少在没有启用警告标志的情况下显示它?

在其他情况下,将字符串传递给更大的数组是微不足道的。对我来说,如果传递的字符串大于参数应该采用的值,警告用户会更有意义,但如果我传递的字符串大于 100,警告就会消失。

达斯代码X

-Wstringop-overflow=4选项使用第三类对象大小检查来确定目标对象的大小。在此设置下,该选项会警告溢出任何数据成员,并且当目标是多个对象之一时,它使用其中最大的对象的大小来决定是否发出警告。-Wstringop-overflow=3与此选项的设置类似,可能会导致良性代码的警告。

来源:https ://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

如果char str[100]char str[],则 gcc 会自动将其更改为char *.

-O2可以使用优化标志或来抑制此警告-O3

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

gcc-8 Wstringop截断

将字符串传递给 char* 时出现警告 359

将 char** 传递给 void** 函数参数时,与指针类型不兼容的指针类型警告

当使用operator =时,c ++ 11 unsigned char变成int

为什么即使使用`char *`时也会收到“类型错误”警告?

%s期望使用“ char *”,但参数为“ char [100]”

gcc-8 -Wstringop-truncation有什么好的做法?

在 C11 中,字符串文字为 char[]、unsigned char[]、char* 和 unsigned char*

如何摆脱GCC中从字符串常量到'char *'的过时转换警告?

警告:格式指定类型参数类型 const char *

使用[ngClass]时的警告

如何将使用char的字符串传递给Fopen C

使用DLL将C#StringBuilder /字符串传递给C ++ char *

qFatal参数:将QString转换为const char *会导致警告“格式字符串不是字符串文字”

当我具有可以同时使用可变和不可变char *的函数时,如何避免发出警告

将char **类型的数组传递为void **类型的参数会发出意外警告

未排序的修改警告在C ++ 11中成为未使用的结果警告

Gruntfile.js警告:“ path”参数必须为字符串类型。收到的类型对象使用--force继续

GCC:未使用的退货警告

函数警告C:“警告:'char_array'的类型默认为'int'”

警告:ISO C ++禁止为静态`constexpr char *`数据成员将字符串常量转换为'char *'

对C的char *字符串使用NULL

const char *与字符串文字的使用

禁用警告“不建议将字符串常量转换为'char *'[-Wwrite-strings]”

使用gcc编译时出现错误:警告:格式指定类型为'int *',但参数的类型为'double *'

将char分配给字符串时,如何解决W1047 / W1068警告?

具有std = c11 arg的GCC警告

使用python时的警告消息

使用gksu时的gtk警告