clang sanitisers 是否检查未初始化的内存?

Do clang sanitisers check for uninitialised memory?

我有一个简单的例子:

#include <stdio.h>

int main()
{
    unsigned long int a;
    
    printf("a = 0x%lx\n", a);

    return 0;
}

demo

很明显,这段代码有UB。但是当我尝试用以下方法对其进行消毒时:

clang -fsanitize=undefined -O0 -xc main.cpp && ./a.out

它运行“很好”。这种行为是预期的吗?我应该为此使用另一种消毒剂吗?

更新:

更新:

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

中使用

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

#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