【问题标题】:Is Address Sanitizer suppose to work with optimizations enabled?Address Sanitizer 是否应该在启用优化的情况下工作?
【发布时间】:2021-09-15 08:46:35
【问题描述】:

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

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

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

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

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

因此,添加 -O2 标志会使 Address Sanitizer 找不到违规行为。是这样吗?

我在 Ubuntu 虚拟机上试过,架构是 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.

【问题讨论】:

  • 可能是因为它被优化掉了(val 从未实际使用过)。

标签: gcc optimization address-sanitizer


【解决方案1】:

因此,添加 -O2 标志会使 Address Sanitizer 找不到违规行为

不完全是。添加 -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;
}

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

【讨论】:

  • 确实 .. 这很有意义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2014-06-06
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多