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

ana*_*ciu 1 c gcc parameter-passing

代码:

#include <stdio.h>

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

int main(void)
{
    Print("A");
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

然而,这绝对是一个错误,已被纠正,并且在 trunk 版本中不再出现,而在代码中我显示它在 trunk 中仍然有相同的警告。

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


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

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

Dar*_*deX 5

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

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

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

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