gpt4 book ai didi

c++ - clang sanitisers 会检查未初始化的内存吗?

转载 作者:行者123 更新时间:2023-12-04 07:33:26 24 4
gpt4 key购买 nike

我有一个简单的例子:

#include <stdio.h>

int main()
{
unsigned long int a;

printf("a = 0x%lx\n", a);

return 0;
}
demo
显然,这段代码有 UB。但是当我尝试使用以下方法对其进行 sanitizer 时:
clang -fsanitize=undefined -O0 -xc main.cpp && ./a.out
它运行“正常”。这种行为是预期的吗?我应该为此使用另一种 sanitizer 吗?
更新:
  • doesn't seem也可以使用 -fsanitize=memory 为 c++ 工作.
  • 对于动态分配 as well .

  • 更新:
    我知道我的例子是微不足道的。一个好的编译器可以检测到这样的问题。我只是写了一个简单的例子来了解该功能是否有效。编译器无法检测到的未初始化内存错误范围很广。例如,如果在一个 .cpp 中分配了一个未初始化的内存块。并用于另一个 .cpp .

    最佳答案

    这里的问题是标准库没有在启用 sanitizer 的情况下编译。未初始化的变量在 printf 中被引用.在同一个函数中读取这个变量就足以触发 sanitizer :

    #include <stdio.h>

    int main()
    {
    unsigned long int a;

    if (a == 42) {
    printf("a = 0x%lx\n", a);
    }

    return 0;
    }
    clang++ -fsanitize=memory -O0 main.cpp && ./a.out
    ==28857==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x494af6 in main (/tmp/1622902848.6385949/a.out+0x494af6)
    #1 0x7fefc72bc82f in __libc_start_main /build/glibc-Cl5G7W/glibc-2.23/csu/../csu/libc-start.c:291
    #2 0x419de8 in _start (/tmp/1622902848.6385949/a.out+0x419de8)

    SUMMARY: MemorySanitizer: use-of-uninitialized-value (/tmp/1622902848.6385949/a.out+0x494af6) in main
    Exiting
    demo
    是的,正如@Alan Birtles 所说,它需要 -fsanitize=memory .

    关于c++ - clang sanitisers 会检查未初始化的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67849768/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com