问题标签 [memory-sanitizer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 将内存清理程序与 libstdc++ 一起使用
我希望使用-fsanitize=memory
clang 中的标志来分析如下程序:
据我所知,这个程序是正确的,但是当我使用clang++ san.cpp -fsanitize=memory
它时(在运行时)它失败了:
我怎样才能使它正常工作?
Clang 3.5 版,stdlibc++ 6 版
c++ - 我如何实际使用 AddressSanitizer 和 MemorySanitizer?
AddressSanitizer 和 MemorySanitizer 是非常有用的工具,但它们需要对整个程序进行适当的检测。(至少,对于 AddressSanitizer 的 Clang 版本;请参阅MemorySanitizer 文档中的此处和AddressSanitizerClangVsGCC的“为全局变量使用私有别名”部分。)
如果按其原意的话,这意味着所有库依赖项都需要使用适当的编译器标志来构建以启用 ASan 或 MSan。对于需要各种第三方依赖项的典型 Linux 应用程序,执行此操作的实用方法是什么?Sanitizers 显然是一个谷歌项目,我的印象是谷歌代码大多只是使用他们自己的 monorepo 和他们自己的构建工具,但这可能超出了普通开发人员的能力范围。有没有一种简单的方法可以在不投资大量额外基础设施或构建脚本的情况下使用 Sanitizers 构建库?
clang - 如何使 MemorySanitizer 在一个错误后不停止
Clang 的文档说“默认情况下,MemorySanitizer 在第一个检测到的错误时退出。”
有人知道如何使 MemorySanitizer 不会因错误而停止吗?上面这句话暗示有办法,但我在文档中没有找到任何东西。
c++ - 使用 Memory Sanitizer 检测 libc++
我已经构建了一个检测的 libc++,如此处所述。我已按照上述网站的建议设置了标志:
并试图建立这个:
与:clang++ ${MSAN_CFLAGS} m.cpp
。我有:
我还尝试clang++
使用与 build 相同的方法构建内存清理libc++
,但我得到了:
任何建议如何编译上述代码?
当然clang++ m.cpp
可以,但在这种情况下,可执行文件链接到libstdc++
.
valgrind - 内存/地址消毒剂与 Valgrind
我想要一些工具来诊断释放后使用错误和未初始化的错误。我正在考虑消毒剂(内存和/或地址)和 Valgrind。但我对它们的优缺点知之甚少。谁能说出 Sanitizer 和 Valgrind 的主要特点、区别和优缺点?
编辑:我发现了一些比较,例如:Valgrind 使用 DBI(动态二进制检测)和 Sanitizer 使用 CTI(编译时检测)。无论 Sanitizer 运行速度比 Valgrind (2x) 快得多,Valgrind 都会使程序慢得多 (20x)。如果有人能给我一些更重要的考虑点,那将是一个很大的帮助。
c++ - clang++ memory sanitizer 报告使用未初始化值
此代码取自IncludeOS github 页面。我对其进行了一些修改,以便在没有其他头文件的情况下进行编译。find
IncludeOS 的函数有点过于冗长,所以我想对其进行简化。但是修改后,代码的行为与我的预期不同。
这是一个简短的解释。此代码用于解析 HTTP 标头。标题字段是名称-值对。它表示为vector<pair<string, string>>
。find
函数用于查找字段名在表头中的位置,has_field
用于检查表头中是否存在特定字段名。
在main
函数中,四个元素被附加到字段中。six
不应该在字段中找到。但has_field
返回 true。
我试图用gdb
. 但我迷失在输出的海洋中。我确实发现了一个有点有趣的消息。
std::__uninitialized_copy<false>::__uninit_copy<__gnu_cxx::__normal_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std: :__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> const*, std::vector<std::pair<std::__cxx11::basic_string<char, std: :char_traits<char<, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> >, std::allocator<std: :pair<std::__cxx11::basic_string<char, std::char_traits<char<, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std: :allocator<char> > >>>>, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >*> (__first={first = "one" , 第二 = "1"}, __last=
{first = <错误读取变量:无法创建地址为 0x0 且长度非零的惰性字符串。>, second = ""}, __result=0x61bf00)
我用clang
消毒剂找出问题所在。只有内存清理程序会显示有趣的报告。跑步,
clang++ -std=c++17 -O1 -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer main.cc
/a.out
报道,
未初始化的值是由函数“_ZNSt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_EC2IRA6_KcRA2_S8_Lb1EEEOT_OT0_”的堆栈帧中的“ref.tmp”分配创建的。
但是,当优化级别设置为-O3
时,什么都没有显示。
c++ - 带有 ifstream 的 Memory Sanitizer 使用未初始化值
这是一个重现的最小示例-
用 - 编译它clang++ lol.cpp -g -fsanitize=memory
然后运行它会产生 -
指向-if(!names) {
线。也发生-stdlib=libc++
。
c++ - 内存清理程序错误:clang5 + msan + fwrite 的结构与填充字节
最小示例:
自 msan 的第 5 版以来的 clang 报告如下:
Field1_
这是因为和之间的填充字节Field2_
未初始化。
没关系,MSAN 是对的。
但是如果代码包含非常大的此类代码示例(将结构保存到二进制文件),是否有任何漂亮的方法可以大规模地使代码变得更好?
(打包结构不是我们的解决方案。)
clang - clang sanitize-blacklist 没有忽略一个函数
我正在使用带有 -fsatize=memory 和 -fsanitize-blacklist 的 clang 7.0.1-6 来忽略 libc 中的未初始化内存。
不幸的是,msan 似乎并没有忽略 cap_init,或者它的后代。
cmake - 无法构建仅针对 compile-rt(无 libgcc)链接的带有内存清理工具的 libc++?
我想在带有 llvm 工具链(libc++、libunwind、compiler-rt、clang ...)的代码仓库上使用 c++ memory sanitizer(msan)。所以我需要做的第一件事是构建msan-instrumented libc++。
从MemorySanitizerLibcxxHowTo 开始,我需要使用选项-DLLVM_USE_SANITIZER=Memory
或-DLLVM_USE_SANITIZER=MemoryWithOrigin
.
从组装一个完整的 llvm 工具链,在LLVM’s compiler runtime library
部分
如果使用 libc++ 和/或 libc++abi,您可能需要通过将 -DLIBCXX_USE_COMPILER_RT=YES 和/或 -DLIBCXXABI_USE_COMPILER_RT=YES 传递给 cmake,将它们配置为使用 compiler-rt 而不是 libgcc_s。否则,您最终可能会将两个运行时库都链接到您的程序中(这通常是无害的,但很浪费)。
由于我的目标是完整的 llvm 工具链,我认为我应该添加-DLIBCXX_USE_COMPILER_RT=YES
和-DLIBCXXABI_USE_COMPILER_RT=YES
所以我使用下面的脚本下载 libcxx 和 libcxxabi 并创建预期的目录布局并运行构建。
我得到的错误是:
此错误仅在两者都存在时-DLLVM_USE_SANITIZER=Memory
发生-DLIBCXX_USE_COMPILER_RT=YES
。删除其中任何一个都可以解决问题。
有什么办法可以解决问题并保留两个选项(msan 和编译器 rt)?提前致谢!