地址清理器仅在OS X上找到溢出
AddressSanitizer only finds overflow on OS X
我们的一位开发人员在他的机器(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;
}
}
带有 clang 6 的 OS X 上的输出:
==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++
(。
这与编译器或操作系统没有太大关系。如果两台计算机具有两个不同的 std 实现,则结果可能会有所不同。在 Linux 计算机上显式设置clang++-6.0 -stdlib=libc++ -fsanitize=address sanitizer.cpp
会导致 ASan 发现相同的问题。
因此,CI 中的 clang 构建应显式使用libc++
。
相关文章:
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- "ostream &os"有什么用?
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何在 MAC OS c/c++ 中阻止 USB 存储设备
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- C++ 对象数组堆栈溢出
- 地址清理器仅在OS X上找到溢出
- OS X组件中的Zerofill尺寸溢出