【发布时间】:2022-01-23 11:03:56
【问题描述】:
在尝试复制大于“字符串”变量的字符串时,我知道收到此警告的原因,这是因为我试图将 21 字节字符串放入 6 字节区域。但是为什么我感到困惑是为什么我没有在 windows 编译器上收到警告。
在 Windows 上,我使用 Mingw、Visual Studio Code,它运行循环但没有任何警告,而在 Linux 上显示此警告。
rtos_test.c: In function 'main':
rtos_test.c:18:5: warning: '__builtin_memcpy' writing 21 bytes into a region of size 6 overflows the destination [-Wstringop-overflow=]
18 | strcpy(string, "Too long to fit ahan");
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <stdio.h>
#include <stdint.h>
#include <pthread.h>
#include <string.h>
uint8_t test = 0;
char string[] = "Short";
int main()
{
while (test < 12)
{
printf("\nA sample C program\n\n");
test++;
}
strcpy(string, "Too long to fit ahan");
return 0;
}
【问题讨论】:
-
您是否在 Windows 上启用了警告?
-
/Wall /permissive- -
可能没有打开正确的警告,可能使用了没有该检查的旧编译器版本,有时警告仅在打开优化时才显示...
-
如何在 Visual Studio 代码中打开警告?我知道这些标志在某种程度上与 makefile 相关,但任何帮助都会很好。
-
@ZBT248 不同的编译器,甚至同一个编译器的不同版本,在生成此类警告的承诺方面存在很大差异。在默认情况下是否发出此类警告或必须使用各种命令行选项显式请求此类警告也存在很大差异。您在 Linux 和 Windows 下使用相同版本的相同编译器的可能性极小,因此收到不同的警告也就不足为奇了。