c++ - 地址 sanitizer 失败

标签 c++ g++ clang++ sanitizer

我正在使用 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.ccclang++ 一样: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/

相关文章:

c++ - 创建全局已知并自动删除的临时目录(C++)?

c++ - Visual Studio 2008 糟糕的性能

c++ - 在 C++ 中对队列使用交换方法时出现编译错误

c++ - gcc 错误?它莫名其妙地将数组衰减为指针,而clang没有

xcode - 使用clang++ 4.2时,“选择的构造函数在复制初始化错误中是显式的”

c++ - 如何获得 Sigma NcR mod 1000000007

c++ - 在 Debian 中为 C++ 应用程序使用 GPGME

c++11 - clang 链接错误 : DSO missing

c++ - 发生错误时在 if/else block 之间切换

c++ - 有人有用 C++ 包装函数的例子吗?