问题标签 [address-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++ - ARM 上的 C++ 结构成员对齐和打包要求
我想让结构表单/布局更“定义/固定”,而不是“由编译器自行决定”。在 x86_64 和 ARMv7-A 架构之间进行通信时,结构布局将被共享。是的,它通常不是可移植的,但对于这种更受限制的情况,字节序是相同的(如果决定在不同的平台上使用,可以转换)。
ARMv7-A 上是否有针对不同数据类型/大小的对齐要求?(即滥用它们是未定义的行为)
还是可以将它们打包成任何对齐方式?(即这是所有定义的行为)
某些对齐方式是否比其他对齐方式提供更好的性能?
我一直在阅读 ARM 的打包/对齐要求,但不幸的是,我注意到它相对于我的架构有点过时了。 http://www.aleph1.co.uk/chapter-10-arm-structured-alignment-faq
我一直在使用这样的标头,在两种架构上:
我正在为 ARM 使用 GCC 交叉编译器:gcc -Wall -Wextra -Wcast-align -march=armv7-a -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a9
当我调用foo abc; abc.bar2.data();
, 并编译时-fsanitize=undefined
-fsanitize=address
会产生运行时错误:
我喜欢相信消毒剂,这让我觉得这很糟糕。但是,如果我关闭消毒剂并将优化加速到-O3
,它的行为还可以。但是我可能只是(不)幸运,这种未定义行为的情况似乎工作正常。我记得早些时候我在执行 pack(1) 而不是 pack(4) 时触发了 -Wcast-align 警告,但我不记得我是如何访问它来触发它的。我认为这也表明它可能是未定义的行为。地址清理程序和 -Wcast-align 是否确实表明了此架构的未定义行为,即使它似乎有效?
是否建议增加 pack(8) 来修复未定义的行为?不幸的是,它确实增加了内存使用量。
最后,或者对于每个结构实体来说,这样做的首选方式是什么?pragma pack(n)
__attribute__((packed))
(__attribute__((packed))
是 GCC 扩展,遗憾的是无法指定包大小。)
gcc - 如何设置 ASAN/UBSAN 报告输出
我想运行我的单元测试套件-fsanitize=address,undefined
并将所有消毒剂错误写入report.txt
文件。默认情况下,所有 sanitizer 错误都会写入标准输出,但是软件也会将信息写入标准输出,因此很难检测到错误。我试过了:
我还尝试在运行测试之前调用 C API:
然而,似乎两者都不起作用,所有错误都被写入标准输出。我正在使用 Debian 测试:
是否有任何替代方法可以将我的单元测试中的消毒剂错误保存在某处?
c++ - AddressSanitizer GCC 4.8 出现双重释放错误
考虑以下玩具程序(prog.cpp
):
这在正常编译时(g++ prog.cpp -latomic
)工作正常。但是当编译为g++ -fsanitize=address -fno-omit-frame-pointer prog.cpp -latomic
执行时会产生 Double Free 错误。基于上述类似行的程序必须在多线程应用程序中使用,即使是正常编译也会产生 Double Free 错误。我阅读了三/五规则,这通常在 Double Free 的情况下被引用,以及各种其他文档,但没有任何效果。
此外,noexcept
从class A
的默认构造函数中删除说明符会产生这个奇怪的错误,我也想知道。
c++ - 为什么经过地址清理的 C++ 库构建会在 libcxx 类中产生不可重现的 ASAN 问题?
使用 -fsanitize=address 构建时,我有时会看到来自 libc++ 类的不良内存访问问题。
这些错误似乎在每次运行中都不可重复,有时根本不会发生。
怎么了?我怎样才能防止这种情况?
c++ - 如何更改 libasan 的默认动态库搜索路径
我有一个应该在各种平台上运行的应用程序,即 ARM、i386、amd64 等。我想检查任何可能的内存泄漏,我在 GCC 中启用了地址清理器,因为
-fsanitize=address
我们正在使用 buildroot 编译整个 OS+应用程序。为了确保每个开发者都安装了相同版本的库,我们将所有需要的动态库打包到ProjectX/lib
path 中,并将其设置为 LD_LIBRARY_PATH。如果地址清理程序关闭,一切正常。在使用 address-sanitizer 编译并运行应用程序时
`GLIBC_2.23' 已经存在,但打包在 $ProjectX/lib 下 但是,libasan 在 /lib/i386-linux-gnu/ 下查找它,并在找到不兼容的版本时抛出错误。
QS:我如何指示 libasan 在LD_LIBRARY_PATH
only 指定的路径中查找所需的库。
gcc - 类成员与全局变量重叠
我正在处理我的应用程序的不良行为......我最近将我的 g++-4.1 升级到 g++-4.8,并且我遇到了一些类实例的私有成员和主源中全局定义的一些变量之间的内存重叠.
用 gdb 捕获写入并查看变量指针,我可以清楚地看到它们共享相同的内存地址。
激活 4.8 中引入的 -fsanitize=address 我可以看到相同的结果。
代码非常庞大,当我尝试剪切部分代码以隔离问题时,重叠区域会向上移动以消失。
无论如何,一切都是静态定义的,没有实例定义运行时,所以,我认为,重叠是编译器或 gcclib 的一种错误,或者我不知道还有谁在同一地址上分配了两个不同的项目. 问题是:我可以通过哪些其他方式调查并生成更多有用的信息以跟踪此“错误”的原因?
c - gcc ASAN 不会因声称的运行时错误而停止
我希望地址消毒剂在捕获某些东西时中止。我认为它是默认设计的,但它似乎对我不起作用。我也试过ASAN_OPTIONS=halt_on_error=1
了,没有效果。以下是详细信息:
在我从事的一个项目中,我们使用了地址消毒剂,它在几周内发出了这个警告/错误,而没有人意识到这一点:
运行时错误:作为参数 xx 传递的空指针,它被声明为永远不会为空
尽管被称为运行时错误,但它不会停止程序或导致错误的退出代码。这是一个简单的程序来演示它:
argc 技巧只是让 gcc 不会优化 memcpy 调用,基本上在我们的代码中它最终memcpy(dst, NULL, 0)
会导致运行时错误/警告。
我希望在运行时错误之后不会输出'after',但它是并且程序退出代码为0。这是一个错误吗?手册说它应该停止。
c++ - Address Sanitizer 无法使用选项 -O 检测内存泄漏
当我使用 Address Sanitizer(clang v3.4)检测内存泄漏时,我发现使用 -O(except -O0) 选项总是会导致一个 no-leak-detected 结果。
代码很简单:
使用 -O0 编译时,
它会正确检测内存,
但是,当 -O 添加时,
什么都没有检测到!我在官方文件中没有找到任何关于它的信息。
c++ - 从 ASAN 获取新删除类型不匹配
我使用编译我的代码-fsanitize=address
并收到此错误:
示例代码:
c - LLVM libFuzzer rss 内存增加
我正在试验 LLVM 项目的 libFuzzer,试图为音频信号处理库生成输入。
为了简单起见,我从一个恒定为零的 64kb PCM 作为初始语料库开始,使用 -max_len=65536。每个库调用的内存消耗约为 200kB,应该按预期释放。
我想知道的是在模糊器日志中显示为 rss 的内存消耗:
为什么 rss 指标稳步增长?
请注意,增加似乎收敛(类似于cov和ft数量),因此每次 fuzzer 目标调用都不会泄漏内存。
是设置问题还是泄漏导致 rss 内存增加?
如果没有,如果在每次模糊器目标调用后没有设置内存消耗,那么为模糊器提供-rss_limit_mb选项的基本原理是什么?