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;
}
此代码将始终输出堆栈缓冲区溢出错误。
我想使用 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;
}
此代码将始终输出堆栈缓冲区溢出错误。