与ASAN构建时,是什么导致多重定义错误?
因此,我试图在大型代码库中识别一些内存损坏问题.首先,我首先构建了代码库,因为它已经设置了现有的Makefile配置.它效果很好,产生了二进制文件.现在,我在编译标志中添加了-g -fsanitize=address -fno-omit-frame-pointer -fno-common,在链接标志中添加了-fsanitize=address(如果有任何区别,也可以使用-lasan尝试),以用ASAN编译代码库.但是现在我在链接时间遇到了多个声明错误.在这一点上,我毫无头绪.这样做的原因是什么?如果有多个定义,那么在没有ASAN标志的情况下构建时,不应该弹出相同的错误吗?在Asan文档中,我什至找不到与此相关的任何内容. 我无法共享确切的错误跟踪,但是看起来很像: path/to/file/hdr.h:132: multiple definition of `myDataTable_type' path/to/file/hdr.h:132: first defined her
0 2024-04-09
编程技术问答社区
我怎样才能知道在编译时是否启用了Leak Sanitizer?
GCC和Clang编译器都支持 leaksanitizer 在C程序中查找内存泄漏.有时,不可避免的内存泄漏(因为在测试套件中进行了测试). 可以使用消毒器接口: #include void *p = create_new_object(); __lsan_ignore_object(p); 但是,这将破坏不支持LSAN的编译器.在地址消毒剂中,该结构可用于检测ASAN的可用性: /* __has_feature(address_sanitizer) is used later for Clang, this is for * compatibility with other compilers (such as GCC and MSVC) */ #ifndef __has_feature # define __has_feature(x) 0 #endif #if __has_feature(ad
2 2024-04-08
编程技术问答社区
发出SIGINT时,如何获得地址消毒剂的输出
当我编译这个简单的测试程序时,我会从地址消毒剂中获得明显的泄漏报告,但是当我编译相同的程序但使用无限循环时,请打破发射SIGINT我没有任何输出. 检查ASM输出,malloc没有优化(如果可能完全可以) 这是地址消毒剂的预期行为吗?我在其他发展中不会遇到这个问题. 工作示例: #include int main(void) { char *a = malloc(1024); return 1; } 不工作(用sigint杀死): #include int main(void) { char *a = malloc(1024); for(;;); return 1; } 编译:gcc test.c -o test -fsanitize=address 我在完整的程序中遇到了这个问题,但我将其简化为最小的示例. 解决方案 __ lsan_do_leak_che
4 2024-04-08
编程技术问答社区
如何使LeakSanitizer忽略程序结束时的泄漏?
我想使用LeakSanitizer检测泄漏的内存,但是在exit之前,我使用的程序的样式并不能免费.在我的经验中,这很普遍. 我想检测到此泄漏: int main(int argc, char const *argv[]) { char *p = malloc(5); p = 0; return 0; } 忽略此泄漏: int main(int argc, char const *argv[]) { char *p = malloc(5); return 0; } 解决方案 您希望LSAN仅报告无法实现的泄漏,即该程序保证泄漏的指针.问题在于,默认情况下,泄漏速度为程序结束时的检查,通常是在全局C ++ DTOR完成的,并且其内容不再可访问.因此,当LSAN最终运行时,必须假设许多东西不再可用.要解决这个问题,您可以添加 #include ... #ifdef __SANITI
0 2024-04-08
编程技术问答社区
advellySanitizer中的"阴影字节"是什么?我应该如何解释它们?
我正在调试C程序,并且在发现问题时,Am 严重混淆了.让我们以此为例: ==33184==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000005 at pc 0x55f312fe2509 bp 0x7ffc99f5f5c0 sp 0x7ffc99f5f5b0 WRITE of size 1 at 0x602000000005 thread T0 #0 0x55f312fe2508 in main /home/user/c/friends/main.c:20 #1 0x7fa5ea0e9b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96) #2 0x55f312fe21c9 in _start (/home/user/c/friends/cmake-build-debug/friends+0x1
4 2024-04-07
编程技术问答社区
我怎样才能在gdb中打破UBSan报告并继续?
GCC和Clang的最新版本不确定的行为消毒剂(UBSAN),它是添加运行时仪器代码的编译标志(-fsanitize=undefined).在错误上,显示了这样的警告: packet-ber.c:1917:23:运行时错误:54645397829836991乘8个位置的左移,无法用'long int' 的类型表示 现在,我想调试一下,并在上述线上进行调试.对于地址消毒剂(ASAN),有ASAN_OPTIONS=abort_on_error=1导致致命错误可捕.唯一可用的ubsan选项是 UBSAN_OPTIONS=print_stacktrace=1 导致呼叫跟踪转储的报告.但是,这不允许我检查本地变量,然后继续该程序.因此不可能使用-fsanitize-undefined-trap-on-error. 我应该如何在瑞银报告中打破GDB? break __sanitizer::SharedPrintfCode似乎有效,但名称看​​起来很内部. 解决方案 在打破检测
0 2024-04-07
编程技术问答社区
我如何用clang'的-fsanitize=address在调试输出中获得行号?
我试图用asan检测到clang检测到的内存错误,但valgrind错过了.但是我无法获得我的clang构建二进制文件,可以为我提供任何有用的调试信息.我可以通过一个简短的测试程序来证明这一点: #include #include int main(void) { char *a = malloc(8); memset(a, 0, 9); free(a); return 0; } (显然,此错误将由valgrind捡起,纯粹是用clang显示问题.) 我用clang 3.4-1ubuntu1汇总它: clang -fsanitize=address -fno-sanitize-recover -o test -O0 -g test.c 果然,./test中止,我看到了一些调试信息: ==3309==ERROR: AddressSanitizer: heap-buffer-over
0 2024-04-06
编程技术问答社区
当用gcc 4.8构建时,如何检测是否用地址净化器构建?
我正在研究用C编写的程序,该程序偶尔使用地址消毒剂构建,基本上是为了捕获错误.该程序从日志中打印出横幅,当时它以诸如:谁构建的信息,它建立的分支,编译器等.我认为如果使用地址消毒剂构建二进制文件,也很高兴拼出.我知道有__HAS_FEATURE(adversion_sanitizer),但这仅适用于Clang.我尝试了以下简单程序: #include int main() { #if defined(__has_feature) # if __has_feature(address_sanitizer) printf ("We has ASAN!\n"); # else printf ("We have has_feature, no ASAN!\n"); # endif #else printf ("We got nothing!\n"); #endif return 0; } 使用gcc -Wall -g -fsani
2 2024-04-06
编程技术问答社区
一个非常简单的程序触发与消毒剂编译时的"未手持指令"错误
我有这个微不足道的C代码(可能是C ++) $ cat .\main.c #include int main() { printf("Hello"); return 0; } 当我用地址消毒剂编译时. clang -fsanitize=address main.c 运行,我得到了这个错误. .\a.exe ==11224==interception_win: unhandled instruction at 0x7ff7d86bffd3: 4c 8d 15 26 00 f5 ff 49 AddressSanitizer: CHECK failed: sanitizer_common_interceptors_memintrinsics.inc:239 "((__interception::real_memcpy)) != (0)" (0x0, 0x0) (tid=8888) 没有地址消
12 2024-04-06
编程技术问答社区
应该如何阅读堆缓冲区溢出的错误信息?
我想知道应该如何读取以下错误消息.特别是: (1)诸如FA(heap左红区)和FD(释放堆区域)之类的东西是什么意思? (2)00s和05s的意义是什么. (3)指向(0x0C067FFF8010)的内存块的重要性是什么? (4)什么是野生指针? (5)为什么在线括号([fa])中带有箭头的内存块上的FA? 编译命令 clang++ test.cpp -fsanitize=address -D_LIBCPP_DEBUG=1 错误消息 Address 0x6030000000f0 is a wild pointer. SUMMARY: AddressSanitizer: heap-buffer-overflow (/home/tzadiko/randomStuff/a.out+0x4fa83d) in main Shadow bytes around the buggy address: 0x0c067fff7fc0: 00 00
0 2024-04-04
编程技术问答社区
我怎样才能用cmake来测试那些预计会出现异常的进程?(例如,由于clang'的地址消毒器而导致的失败)
我已经有一些测试测试,这些测试clang的地址消毒剂会发现特定的错误. (我想确保我对可能捕获的错误类型的理解是正确的,并且未来版本继续捕获我期望它们的错误类型.)这意味着我有几个测试,这些测试通过用一个而失败OTHER_FAULT,这似乎是Clang的运行时报告错误的固定方式. 我已经将WILL_FAIL标志设置为TRUE TRUE,但这似乎只能从成功的,无例外的故障中检查返回值.如果该过程终止例外,则CMAKE仍然将其归类为故障. 我还尝试使用PASS_REGULAR_EXPRESSION查看发生此错误时打印出的区分消息,但是再次,如果cmake终止了例外情况,则Cmake似乎将测试归类为失败. . 我有什么可以解决这个问题的吗? (特定于clang的答案也是一种选择! 解决方案 CTEST仅为测试程序结果提供基本的,常用的解释器.对于实施其他解释器,您可以编写简单的程序/脚本,该程序/脚本将测试包装并根据需要解释其结果.例如. C程序(用于Linu
0 2024-03-21
编程技术问答社区
std::string由char数组的子范围构建,调用strlen
它类似于 char []到字符串,投掷addresssanitizer:stack-buffer-overflow错误 代码是 #include int main() { char buf[10] = {6, 6, 6, 6, 6, 6, 6, 6, 6, 6}; std::string s{buf, 2, 3}; return 0; } 执行最终以地址消毒剂抱怨strlen's stack-buffer-overflow: $ clang++ -g -fsanitize=address foo.cpp ; ./a.out ================================================================= ==1001715==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffd76b2510a a
0 2024-03-07
编程技术问答社区
使用Android NDK使用地址消毒剂时的链接问题
我正在使用Android Studio构建一个包含使用NDK的模块的应用程序.有记忆损坏的证据,所以我正在尝试地址消毒剂,之后这些说明在NDK开发人员网站上.但是该应用不会构建. 我需要(a)确保我针对Android 27+(我将Minsdkversion设置为27;我正在为Galaxy S9,SDK 28构建调试构建),(b)添加编译器标志,我'完成: android { defaultConfig { externalNativeBuild { cmake { # Can also use system or none as ANDROID_STL. arguments "-DANDROID_ARM_MODE=arm", "-DANDROID_STL=c++_shared" cppFlags "-fsanitize=address
10 2024-02-17
编程技术问答社区
使用包装脚本时无法调试应用程序
我已经激活了应用程序代码的地址消毒剂,以检测一些内存泄漏.但是我有一个奇怪的问题. 在激活地址消毒剂之前,应用程序正常运行,我可以在没有任何问题的情况下进行调试.但是,在激活地址消毒剂之后,即使它运行良好,我也无法再调试应用程序.这是一个非常奇怪的行为,因为激活地址消毒剂后,"Waiting for Debugger..."消息不再显示,并且我在调试控制台中会出现以下错误: Could not connect to remote process. Aborting debug session. 同时,应用程序正常工作,如果我运行adb shell ps -A,我可以很容易地找到它,而我看不到"attach to process"菜单. 知道问题是什么? 解决方案 最后,在我的错误的这是完整的脚本: #!/system/bin/sh processname=$1 shift sdkversion=$(getprop ro.build.version.sd
4 2024-02-17
编程技术问答社区
使用build.gradle的android studio地址净化器
我正在尝试使用此处描述的地址消毒剂(看起来至少有3种启用它的方法: 1°)在第一个链接之后,T说您要做的就是这样做: 将-fsanitize=address添加到cppflags +可选-fno-omit-frame-pointer 将-fsanitize=address添加到链接器标志(是否必要?) 2°)遵循第二个链接,似乎您必须执行: 与第一个相同 root A设备然后通过ADB在其上运行Asan_device_setup 在某个地方添加LD_PRELOAD=libclang_rt.asan-arm-android.so?我想应该将其放在Gradle外部企业的"参数"部分中?但是该应用在哪里可以找到此库?我必须自己链接吗?还是设备上的某个地方? 3°)我还找到了一种"新"的方法,这不需要根源访问(嗯,但这是一个错误,因此在某个时候被纠正): 此方法实际上执行了第一点和第二点所做的事情,加上通过启动一个shell脚本来运行应用程序,该脚本
4 2024-02-15
编程技术问答社区
为什么在Xcode 7中禁用 "启用地址消毒器"?
I read about the Runtime Sanitization in the Apple Docs 在新的Xcode 7中,我在寻找它,发现它是禁用的.我正在使用Xcode 7 gm种子. 当我进入方案>诊断选项卡的运行操作时,Enable Address Sanitizer选项被禁用: 有一些解释说明其他选项如何被删除,但没有提及为什么会禁用消毒选项: 一些诊断工具可以与其他工具结合使用;选择不同的选项以帮助您选择选项组合,启用诊断窗格上的选项.例如,启用地址消毒剂和其他,不兼容的工具被禁用,无法选择 查看还发现了此如此答案,但是它很复杂,而且可能已经过时了,因为它回到了2013年. 解决方案 您当前无法一起使用Guard Malloc并一起使用Sanitizer.选择启用后卫Malloc复选框禁用启用地址消毒器复选框.如果要使用地址消毒剂,请取消选择启用警卫Malloc复选框. 其他解决方案 您还需要确保选择了MAC/iOS/TV模
16 2023-12-20
编程技术问答社区
Xcode地址消毒器与sockaddr的问题
以下代码用于将A sockaddr转换为sockaddr_in6获取IPv6地址: extension sockaddr { private var addressV6: String { var me = self var buffer = [Int8](repeating: 0, count: Int(INET6_ADDRSTRLEN)) withUnsafePointer(to: &me) { $0.withMemoryRebound(to: sockaddr_in6.self, capacity: 1) { var addrV6 = $0.pointee.sin6_addr inet_ntop(AF_INET6, &addrV6, &buffer, socklen_t(INET6_ADDRSTRLEN)) } } return String(cString: buffer
20 2023-12-19
编程技术问答社区
如何在Xcode中启用Clang地址消毒器?
正如WWDC 2015宣布的那样,Clang地址消毒剂将被带到Xcode和OSX. . session 413:高级调试和地址消毒剂 您如何为XCode项目启用Clang地址消毒剂? 解决方案 地址消毒剂已在Xcode 7中添加为新功能. 在您的方案中使用Runtime Sanitization> Enable Address Sanitizer标志启用选项. git将向您的.xcscheme文件显示此更改: enableAddressSanitizer = "YES" 来自 XCODE中的新功能7 文档: 地址消毒剂. Xcode 7可以使用旨在使用地址消毒剂捕获和调试内存损坏的仪器来构建您的应用程序. Objective-C和C代码容易受到内存损坏问题的影响,例如堆栈和堆缓冲区超支和无用的问题.当发生这些内存违规时,您的应用程序可能会不可预测或显示奇怪的行为.记忆损坏问题很难追踪,因为崩溃和奇怪的行为通常很难复制,原因可能与问题的起
4 2023-12-18
编程技术问答社区
地址消毒器无法在windows下的bash中工作
当前运行LLVM,Clang,Clang-Format和Windows上的Ubuntu bash上的叮当状态.我想使用Google发布的一组消毒工具,包括地址,内存和线程消毒. fsanitize选项似乎都没有用. 这是Asan的代码样本: #include int main() { char *x = (char *)malloc(10 * sizeof(char *)); free(x); return x[5];// purposely accessing deallocated memory } 这是Windows上的Bash中的叮当声: $clang++-3.5 -fsanitize=address -o1 -fno-omit-frame-pointer -g main.cpp -o main $./main 结果 ==70==Sanitizer CHECK failed: build/buildd/llvm-t
8 2023-12-05
编程技术问答社区