【问题标题】:linux上的builtin_memcpy警告但在windows上没有
【发布时间】: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 下使用相同版本的相同编译器的可能性极小,因此收到不同的警告也就不足为奇了。

标签: c linux windows


【解决方案1】:

Linux 上的此警告暗示 GCC 将 memcpy() 替换为 GCC 内置函数,并且 GCC 可以检测并配置为检测此类错误。在 Windows 上可能不是这种情况,具体取决于编译器选项、版本、心情等。

您还比较了 Windows 和 Linux,它们是非常不同的平台,不要期望两者的行为相同。 GCC 也不是很面向 Windows(MinGW = Minimalist Gnu for Windows)。即使在 Linux 发行版之间,GCC 也不同,需要考虑大量变量,尤其是在涉及优化时。

总而言之,不同的环境会产生不同的结果、警告和错误。当你依赖环境特定的行为(通常不知道它),调整编译器选项或代码时,如果不修复你的代码,你真的不能做任何事情......通常答案是修复你的源代码,你的问题的根源〜 100% 的时间。

附带说明一下,在不同的环境中设置 CI 是一个很好的错误捕获系统,因为在一个系统上看起来很好的行为在另一个系统上却不会像在您的情况下那样 both Linux 和 Windows。

【讨论】:

    【解决方案2】:

    我没有足够的声望点来评论你的帖子。

    我认为在 Linux gcc 中启用了 -Wall 标志,您可以尝试在 Windows 上的 IDE 中添加 -Wall 标志

    另外, 我检查了一些我看到的编译器

    char string[] = "Short"; 仅分配给大小为 6 的字符串 您的代码使用字符串不正确,如果您尝试使用超过分配的空间程序可能会崩溃,您可以通过 Windows 上的 asm 代码验证这一点

    └─[0] <> gcc test.c -S
    test.c: In function ‘main’:
    test.c:18:5: warning: ‘__builtin_memcpy’ writing 21 bytes into a region of size 6 overflows the destination [-Wstringop-overflow=]
       18 |     strcpy(stringssss, "Too long to fit ahan");
          |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ┌─[longkl@VN-MF10-NC1011M] - [~/tmp] - [2021-12-22 07:00:36]
    └─[0] <> grep stringsss test.s 
            .globl  stringssss
            .type   stringssss, @object
            .size   stringssss, 6
    

    【讨论】:

    • 正如我上面写的,我知道代码中的问题,但我希望我的窗口编译器也像 Linux 一样给我警告,我需要解决的问题是警告问题和不是代码逻辑问题。
    • @ZBT248 是的,让我们尝试将 -Wall 标志添加到您的 IDE 中
    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多