我正在使用 gcc 和 clang 嵌入式 sanitizer ,包括地址 sanitizer 。一切运行良好,但在下一个演示代码中,我没有得到与错误相关的输出,尽管它存在(更准确地说——根本没有输出):
#include <string>
#include <iostream>
using std::string;
using std::cout;
class Foo
{
string _member;
public:
Foo(): _member("just a string") {}
const string& get() const { return _member; }
};
const string& bar()
{
// returning reference to a temp object on stack
return Foo().get();
}
int main()
{
cout << bar() << '\n';
return 0;
}
我试过 g++ -O0 -g -fsanitize=address test.cc
和 clang++
一样:g++-version 什么都不打印,clang 一个打印垃圾很长时间时间。
Valgrind on non-instrumented binary 给出反馈:
系统调用参数 write(buf) 指向不可寻址的字节
。
这是内部问题还是我做错了什么?
版本:gcc 4.9.2,clang 3.6.0
最佳答案
最初我认为您在访问临时 Foo 对象时遇到返回后使用错误。由于高内存开销,默认情况下 ASan 不检测 UAR(请参阅 dedicated wikipage 中的更多详细信息)。
但现在我意识到情况更复杂:std::string
可以按原样存储输入指针(写时复制优化),将其复制到对象内部的小缓冲区(短字符串优化) ) 或新的堆分配缓冲区。实际行为取决于您使用的特定 STL 版本(例如,最近更改了 AFAIR libstdc++ 实现)。
我建议你举报给Asan's tracker在那里继续调查。
关于c++ - 地址 sanitizer 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29656109/