我们的一位开发人员在他的机器 (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/