Address Sanitizer 是否应该在启用优化的情况下工作?

Is Address Sanitizer suppose to work with optimizations enabled?

我想使用 Address Sanitizer 查找违规行为

int main()
{
    int v[] = {1, 2, 3};
    int val = v[3];

    printf("exiting main\n");
    return 0;
}
    

g++ -W -Wall -fsanitize=地址 -o my_bin main.cpp -> 我从消毒剂中得到很多输出

g++ -O2 -W -Wall -fsanitize=地址 -o my_bin main.cpp -> 只是“退出主要”

因此,添加 -O2 标志使得 Address Sanitizer 无法发现违规行为。这样对吗?

我在 Ubuntu VM 中试过,架构是 x86。

g++ --version
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

So, the adding of -O2 flag makes Address Sanitizer not finding violations

不完全是。添加 -O2 标志可以使 gcc 优化掉未使用的变量 val 并且 Address Sanitizer 在运行时不会看到数组下标越界错误。如果您确实在代码中使用 val 变量,优化和未优化的构建都会输出 Address Sanitizer 错误。

int main()
{
    int v[] = {1, 2, 3};
    int val = v[3];

    printf("exiting main\n");
    return val;
}

此代码将始终输出堆栈缓冲区溢出错误。