Macos 如何使AddressSanitizer在一个错误(和其他问题)后不停止

Macos 如何使AddressSanitizer在一个错误(和其他问题)后不停止,macos,clang,llvm,address-sanitizer,Macos,Clang,Llvm,Address Sanitizer,我正在运行OSX,10.8.5;我已经通过自制安装了llvm 3.4(clang版本3.4(tags/RELEASE_34/final)),我正在使用-fsanize=address进行构建。我可以让asan使用简单的演示程序,但在基于我们的代码库进行构建时,我有几个问题(尽管我真的很想知道#1的答案): 第三方库正在生成asan错误,asan将在第一次出现时终止我的应用程序。我认为会有某种(运行时/编译时)选项告诉asan在发现错误后继续进行。具体而言,我认为: bash-3.2$ ASAN_

我正在运行OSX,10.8.5;我已经通过自制安装了llvm 3.4(clang版本3.4(tags/RELEASE_34/final)),我正在使用-fsanize=address进行构建。我可以让asan使用简单的演示程序,但在基于我们的代码库进行构建时,我有几个问题(尽管我真的很想知道#1的答案):

  • 第三方库正在生成asan错误,asan将在第一次出现时终止我的应用程序。我认为会有某种(运行时/编译时)选项告诉asan在发现错误后继续进行。具体而言,我认为:

    bash-3.2$ ASAN_SYMBOLIZER_PATH=/usr/local/Cellar/llvm34/3.4/lib/llvm-3.4/bin/llvm-symbolizer ./unit_test
    Start testing of PathTrieTest
    Config: Using QTest library 4.8.2, Qt 4.8.2
    PASS   : PathTrieTest::initTestCase()
    PASS   : PathTrieTest::pathTrieNodeTest()
    =================================================================
    ==76647==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x61600019e588 at pc 0x10891ddd3 bp 0x11312ba90 sp 0x11312ba58
    WRITE of size 48830 at 0x61600019e588 thread T3
        #0 0x10891ddd2 in wrap_readdir_r (/usr/local/lib/llvm-3.4/lib/clang/3.4/lib/darwin/libclang_rt.asan_osx_dynamic.dylib+0x11dd2)
        #1 0x10ac23571 in QFileSystemIterator::advance(QFileSystemEntry&, QFileSystemMetaData&) (/Volumes/ToolChain/qt-4.8/lib/QtCore.framework/Versions/4/QtCore+0xef571)
        #2 0x10abd86d3 in QDirIteratorPrivate::advance() (/Volumes/ToolChain/qt-4.8/lib/QtCore.framework/Versions/4/QtCore+0xa46d3)
        #3 0x10abd7a7f in QDirIteratorPrivate::QDirIteratorPrivate(QFileSystemEntry const&, QStringList const&, QFlags<QDir::Filter>, QFlags<QDirIterator::IteratorFlag>, bool) (/Volumes/ToolChain/qt-4.8/lib/QtCore.framework/Versions/4/QtCore+0xa3a7f)
        #4 0x10abd8b68 in QDirIterator::QDirIterator(QDir const&, QFlags<QDirIterator::IteratorFlag>) (/Volumes/ToolChain/qt-4.8/lib/QtCore.framework/Versions/4/QtCore+0xa4b68)
        #5 0x10abd7609 in QDirPrivate::initFileLists(QDir const&) const (/Volumes/ToolChain/qt-4.8/lib/QtCore.framework/Versions/4/QtCore+0xa3609)
        #6 0x10abd5394 in QDir::count() const (/Volumes/ToolChain/qt-4.8/lib/QtCore.framework/Versions/4/QtCore+0xa1394)
        #7 0x1084c205d in get_count(QFileInfo&) /Users/stebro/dev_vm/ui/ui/fsinfoprovider.cpp:36
    ...
    
  • 我无法让黑名单正常工作,-mllvm-asan globals=0或-mllvm-asan stack=0似乎不像我预期的那样工作。例如,后者不会抑制上面#1中列出的错误的生成,而创建类似下面的黑名单也不会抑制错误:

    fun:QDirPrivate::initFileLists
    fun:get_count
    fun:*opendir2*
    
  • 最后,使用这些asan选项生成的可执行文件会导致lldb崩溃。我正在使用XCode 5工具附带的lldb;homebew llvm包中没有部署lldb,我不知道如何构建它。构建指令有一个死链接,指向您应该使用的源;直接从svn存储库中提取源,使用:

    svn co http://llvm.org/svn/llvm-project/lldb/tags/RELEASE_34/final lldb
    
    导致无法编译的代码(根据请求提供错误)

  • 可寻址性错误(特别是像您提到的OOB写入这样的内存损坏)通常非常严重,值得担心。忽略它们无法撤消它们的效果,在跳过堆损坏后,程序很可能会在完全不相关的位置崩溃。 您可以尝试在禁用readdir\r中的检查的情况下构建自己的Clang,但我会首先尝试修复错误
  • 你能在这里提交一个带有复制步骤的bug吗
  • 黑名单仅通过不检测黑名单函数来禁用黑名单函数中的可寻址性检查,它们不检查某些帧的堆栈。您的特定检查发生在编译到运行库中的函数拦截器中,因此您甚至不能将其列入黑名单。如果#1中的错误在某些系统库中,并且无法轻松解决,我们可以考虑添加一个运行时选项来禁用readdir\r检查
  • 再次感谢您提供错误报告

  • 顺便说一下,如果您是从源代码构建的话,我发现了一种解决Qt中堆溢出问题的方法。我相信这个问题与32位/64位INODE有关(
    \u DARWIN\u FEATURE\u 64位\u INODE
    由于某种原因在构建Qt时没有定义)

    diff——git a/src/corelib/io/qfilesystemiterator\u unix.cpp b/src/corelib/io/qfilesystemiterator\u unix.cpp 索引029b989..76b176f 100644 ---a/src/corelib/io/qfilesystemiterator_unix.cpp +++b/src/corelib/io/qfilesystemiterator_unix.cpp @@-75,6+75,7@@QFileSystem迭代器::QFileSystem迭代器(常量QFileSystemEntry&entry,QDir::Fi 大小\u t maxPathName=::路径配置(nativePath.constData(),\u PC\u NAME\u MAX); if(maxPathName==size\u t(-1)) maxPathName=FILENAME\u MAX; +maxPathName=99999; maxPathName+=sizeof(QT_DIRENT)+1; QT_DIRENT*p=reinterpret_cast(::malloc(maxPathName));
    您可以使用
    -fsanize=address-fsanize recover=address
    标志构建项目,并使用环境变量
    ASAN\u OPTIONS=halt\u on\u error=0
    运行项目。
    来源:

    我找到了一种解决您看到的Qt堆溢出问题的方法。我将其作为下面的答案发布。谢谢。我们已经转移到Qt5,问题似乎已经消失。这似乎是我问这个问题后添加的一项新功能。感谢更新。
    如果“选项”
    在windows中不起作用,我尝试了上面的example,当我给它
    ASAN\u选项时,它会给它
    无法识别的选项
    。它在ubuntu上运行良好。如何在MAC上“使用环境变量ASAN\u OPTIONS=halt\u on\u error=0运行”?
    svn co http://llvm.org/svn/llvm-project/lldb/tags/RELEASE_34/final lldb
    
    diff --git a/src/corelib/io/qfilesystemiterator_unix.cpp b/src/corelib/io/qfilesystemiterator_unix.cpp index 029b989..76b176f 100644 --- a/src/corelib/io/qfilesystemiterator_unix.cpp +++ b/src/corelib/io/qfilesystemiterator_unix.cpp @@ -75,6 +75,7 @@ QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Fi size_t maxPathName = ::pathconf(nativePath.constData(), _PC_NAME_MAX); if (maxPathName == size_t(-1)) maxPathName = FILENAME_MAX; + maxPathName = 99999; maxPathName += sizeof(QT_DIRENT) + 1; QT_DIRENT *p = reinterpret_cast(::malloc(maxPathName));