问题标签 [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.
ffmpeg - 使用 Android NDK r17 构建 C 库 (FFmpeg):未定义对“__mulodi4”的引用
我的问题恰好出在 FFmpeg 上,但我怀疑几乎所有 C 库都会发生这种情况。
问题描述
我的应用程序使用使用 NDK r10e 编译的 FFmpeg。我正在尝试将所有内容更新到 NDK r17,同时也切换到 clang,因为 Google 更喜欢我们使用它而不是 gcc。
我的第一步是构建 FFmpeg。
为此,我使用该make_standalone_toolchain.py
脚本为 x86 架构创建了一个独立的工具链,如下所示:
然后我配置FFmpeg构建如下:
然后我按如下方式构建它:
一切似乎都编译得很好,但我得到了几个链接器错误,它们都说同样的话:
未定义对“__mulodi4”的引用
我尝试过的解决方案
1. 链接 libclang_rt.builtins*
我在网上发现了一些地方,这表明这是由于 libgcc 不提供__mulodi4
. 一个名为 sitsofe 的 github 用户非常好,可以在这里发布一个解决方法。但是,我确定在哪里可以找到这个libclang_rt.builtins-i686.a
库。这是我在独立工具链目录中找到的内容:
./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-x86_64.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-i386.a ./lib64/clang/6.0. 2/lib/linux/libclang_rt.builtins-aarch64-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-mips64-android.a ./lib64/clang/6.0.2/lib/ linux/libclang_rt.builtins-x86_64-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-i686-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt。 builtins-arm-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-mips-android.a
图书馆libclang_rt.builtins-i686-android.a
看起来很近,但(我认为)没有雪茄。当我尝试链接到它时,我得到了同样的错误:
未定义对“__mulodi4”的引用
这是我的新 FFmpeg 构建配置命令:
我检查-v
以确保该行已添加到链接器标志中,并且确实如此。但是,我不知道这个库是否应该工作,更不用说我是否正确地将它添加到链接器标志中。无论如何,我在这里做的事情是行不通的。
2.切换到不同的消毒剂
我没有使用未定义的清理程序,而是尝试切换到地址清理程序。(坦率地说)这是一次彻头彻尾的暗中尝试,基于在本周 Google I/O 的 r17 中模糊地提到了 asan。
在这种情况下,FFmpeg 构建得很好!
但是,当我尝试将 FFmpeg 拉入我的测试项目(一个简单的带有 C++ 支持的 AAR,它只有一个调用 的 jni 方法时av_gettime()
,我得到了大量的链接器错误:
错误:错误:未定义引用“__asan_option_detect_stack_use_after_return”
错误:错误:未定义引用“__asan_stack_malloc_0”
错误:错误:未定义引用“__asan_report_load4”
错误:错误:未定义引用“__asan_report_load4”
错误:错误:未定义引用“__asan_shadow_memory_dynamic_address”
错误:错误:未定义引用“__asan_option_detect_stack_use_after_return”
错误:错误:未定义引用“__asan_stack_malloc_0”
错误:错误:未定义引用“__asan_report_load4”
错误:错误:未定义引用“__asan_report_load4”
错误:错误:未定义引用“__asan_shadow_memory_dynamic_address'
错误:错误:未定义引用“__asan_option_detect_stack_use_after_return”
错误:错误:未定义引用“__asan_stack_malloc_0”
错误:错误:未定义引用“__asan_report_store4”
错误:错误:未定义引用“__asan_report_store4”
错误:错误:未定义引用“__asan_init”
错误:错误:未定义对“__asan_version_mismatch_check_v9”的引用
所以似乎找到了FFmpeg库就好了,说明我的CMake文件的那部分是正确的,但是它找不到这些asan引用中的任何一个。
这似乎是人们遇到的一个常见问题,但我找不到真正适合我的解决方法。
clang - 我应该默认使用三种互斥的 Clang 消毒剂中的哪一种?
Clang 有许多清理程序,可以在运行时检查可疑行为。不幸的是,它们不能一次全部启用。
不能在同一程序中组合多个
-fsanitize=address,
-fsanitize=thread
, 和检查器。-fsanitize=memory
更糟糕的是,这三个似乎都太有用了,不能忽略。AddressSanitizer 检查内存错误,ThreadSanitizer 检查竞争条件,MemorySanitizer 检查未初始化的读取。 我担心所有这些事情!
显然,如果我预知虫子在哪里,我可以据此选择消毒剂。但如果我不这样做呢?更进一步,如果我想将消毒剂用作预防工具而不是诊断工具,以指出我什至不知道的错误怎么办?
换句话说,鉴于我没有特别寻找任何东西,默认情况下我应该使用哪种 sanitizer 进行编译? 我是否只希望编译和测试整个程序三次,每种消毒剂一次?
angular - html 电子邮件内容中的 angular sanitizer 和孤立尖括号
在我的 Angular 应用程序中,我应用了 Angular 清理,因此无效的 html 被剥离(使用 getTrustedHtml mathod)和有效的 html 去(HttpPost)到 web api。由于其他原因,不推荐使用 web api 中的 HtmlSanitizer;所以只有客户端我必须做。
在我的 Angular 应用程序中发送 html 电子邮件时,我在 QA 测试期间遇到了 HTML 场景中的孤立尖括号:并且孤立尖括号导致错误为“错误:[$sanitize:badparse] http://errors.angularjs.org /1.4.8/ $sanitize/badparse?p0=%3C%2Fh"
要删除孤立的尖括号(“<”或“<<..”或“>”或“...>>>>>....”或 />)我开始搜索正则表达式但找不到工作例子。
如果有人知道任何想法/工作,请提供帮助。
gcc - Address Sanitizer 可以在检测到错误后立即中止吗?
我正在结合使用系统调用检查器,-fsanitize=address
当 ASAN 发现错误时,它会在打印出报告时调用一些系统调用(ioctl(ISATTY)
等)。系统调用检查器会中断 ASAN 的 ioctl,并且错误报告未正确收集。
我希望 ASAN 在不打印报告或失败的情况下简单地中止,这是一种确定(可能使用 libasan4 API 调用)ASAN 发现错误的方法,因此我可以阻止系统调用检查器拦截系统调用。
不幸的是__asan_error_report
,从 libasan4 开始,在 ASAN 收集报告之后:__sanitizer_set_death_callback
__asan_set_error_report_callback
并且系统调用检查器没有ioctl()
正确处理 ASAN 的调用,所以它正常退出()s,而我希望保持 ASAN 的行为abort()
。
gcc - AddressSanitizer 抑制
我正在尝试禁止来自 clang/gcc 中的地址清理程序的警告
我的源文件如下所示:
显然第 3 行有溢出。
抑制文件 (myasan.supp) 包含:
编译(clang 也会产生警告)并运行:
但是地址清理程序仍然抱怨溢出。
编译器是clang7。我也测试了clang6、gcc7。
知道如何进行这项工作吗?
c++ - C ++中的AddressSanitizer黑名单不起作用
我正在尝试让地址清洁剂黑名单在 C++ 项目中工作,但它没有按预期工作。我在他们的网站上试过这个例子,如果我用 编译clang
,它工作正常。
但是一旦我使用clang++
它,它就会被忽略。
我正在使用来自 release.llvm.org 的 clang-7
这在 C++ 下不支持吗?
c - 1 << 31不能用'int'类型表示?
为什么会-fsanitize=undefined
扔
运行时错误:不能以“int”类型表示 1 到 31 个位置的左移
在这段代码上
?
fortran - gfortran -fcheck=bounds,pointer错误报告怎么出来的
我正在尝试使用该gfortran
选项-fcheck=bounds,pointer
在某些代码中查找运行时错误。错误报告是什么样的,它们出现在哪里/何时?它们是写入标准错误、输出还是某个文件?它们是在发生时写入并刷新,还是在执行结束时?错误报告是否会终止执行?
c++ - 未定义的行为或误报
我有一些 C++ 代码,当在 Xcode 上运行时,未定义的行为清理器打开了报告:“ runtime error: store to misaligned address 0x7f8bcc403771 for type 'int', which requires 4 byte alignment
”。
所以我创建了一个小的 Catch2 测试用例来重现我必须检查 windows/x64 (MSVC) 和 Mac(Xcode 11/clang) 上的运行时行为的代码,但即使使用不同类型的优化编译,一切都按预期运行( -O2、-O3、-Ofast 等)。
有问题的代码是(Catch2 测试用例):
所以我的问题是:这是一个未定义的行为误报,还是由于默认编译器标志的一些更改,代码中的某些内容将来可能会中断?