【问题标题】:Why does address sanitizer overlook seg faults sometimes?为什么地址清理程序有时会忽略段错误?
【发布时间】:2019-11-14 20:57:15
【问题描述】:

在编译 C 程序时一直在使用fsanitize=address,以便跟踪 seg 错误大约一年了。我时不时会遇到一个奇怪的行为,如果编译 without fsanitize=address 我的程序会出现段错误,但是当我编译 with fsanitize=address 时,这个段错误就会消失。我浏览了网络,但无法弄清楚为什么会发生这种情况。 我知道address sanitizer 不是一个完美的程序,但只是不知道它为什么会有这种行为。

【问题讨论】:

  • 当您的程序中有未定义的行为时,它或编译器选项中的任何更改都会改变观察到的行为。
  • 未定义的行为是未定义的。

标签: c gcc address-sanitizer


【解决方案1】:

AddressSanitizer 算法的一部分以 32 字节的间隙散布所有局部和全局变量(以及堆分配)以检测溢出。因此,用于破坏其他变量的逐一溢出(如果这些变量是指针或偏移量,可能会导致崩溃)可能不再这样做,相应的错误将消失。

Asan 仍应报告此类溢出的错误,而在您的情况下显然不会。这可能会发现 Asan 中的某些问题或(更有可能)您运行它的方式(例如,未将其与 -U_FORTIFY_SOURCE-fno-common 结合,如 FAQ 中所述)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2020-03-31
    • 1970-01-01
    相关资源
    最近更新 更多