c++ - AddressSanitizer 仅在 OS X 上发现溢出

标签 c++ clang++ address-sanitizer

我们的一位开发人员在他的机器 (OS X) 上发现了 AddressSanitizer 的问题,但我们的 CI(Linux 上的 Jenkins)没有发现这些问题。

示例代码:

#include <vector>
#include <iostream>

int main() {
    {
        std::vector<int> tmp_vec{1, 2, 3};
        tmp_vec.resize(1);
        if(tmp_vec[1] == 123) std::cout << "#1" << std::endl;
    }
}

在 OS X 上用 clang 6 输出:

==9387==ERROR: AddressSanitizer: container-overflow on address 0x6020000000f4 at pc 0x00010fb5e4aa bp 0x7ffee00a2b90 sp 0x7ffee00a2b88
READ of size 4 at 0x6020000000f4 thread T0
    #0 0x10fb5e4a9 in main (a.out:x86_64+0x1000024a9)
    #1 0x7fff7eaa7014 in start (libdyld.dylib:x86_64+0x1014)
[...]

在带有 clang 6 的 Linux 上,没有任何反应。

为什么 Linux 上的 clang 没有捕获这些错误,我们可以做些什么来在我们的 CI 过程中发现这些问题?

最佳答案

要添加到 mrks 答案中,libstdc++ 默认情况下不会检测容器溢出(因为它可能会导致来自 Asan 的误报警告,请查看 wiki 了解更多详细信息)。您需要通过 -D_GLIBCXX_SANITIZE_VECTOR 显式启用它(您需要足够新的 libstdc++)。

关于c++ - AddressSanitizer 仅在 OS X 上发现溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51011673/

相关文章:

linux - 如何让 ASAN 忽略子进程?

c - gcc ASAN 不会因所谓的运行时错误而停止

c++ - 为什么 ulimit -v 在 clang 的地址 sanitizer 下不起作用?

c++ - 在 C++ 中声明长文字时是否需要长后缀和无符号后缀?

c++ - OpenGL 线被其他对象隐藏

c++ - 单元测试变量的真假

c++ - LTO for clang 可以跨 C 和 C++ 方法优化吗

c++ - 根据模板模板参数采用的参数数量部分专门化模板的语法是什么?

c++ - 对于在 C++ 中的头文件中定义函数所带来的陷阱,有点困惑

c++ - -Wundef 不会被 g++ 中的 pragma 忽略