- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
很抱歉,如果这是一个 super 简单的概念,但我发现很难获得正确的心态才能正确使用 clang
提供的 sanitizer 。
float foo(float f) { return (f / 0); }
我用
编译了这个小片段clang++ -fsanitize=float-divide-by-zero -std=c++11 -stdlib=libc++ -c source.cpp -o osan
我还编译了我的对象的“正常”版本而不使用 sanitizer
clang++ -std=c++11 -stdlib=libc++ -c source.cpp -o onorm
我期待一些详细的输出,或者来自控制台的一些错误,但是当使用 nm
检查文件时,我只发现了 1 个不同
nm o* --demangle
onorm:
0000000000000000 T foo(float)
osan:
U __ubsan_handle_divrem_overflow
0000000000000000 T foo(float)
所以在净化版本中有一个 undefined symbol ,其名称类似于我在编译时使用的净化器;但一切都是真正的“沉默”,clang前端根本没有输出。
我应该如何使用 sanitizer 以及正确的工作流程是什么?那个 undefined symbol 有什么意义?
最佳答案
undefined symbol 是一个实现 sanitizer 检查的函数。如果您查看生成的代码:
没有 sanitizer :
_Z3foof: # @_Z3foof
.cfi_startproc
# BB#0:
xorps %xmm1, %xmm1
divss %xmm1, %xmm0
ret
使用 sanitizer :
_Z3foof: # @_Z3foof
.cfi_startproc
.long 1413876459 # 0x54460aeb
.quad _ZTIFffE
# BB#0:
pushq %rax
.Ltmp1:
.cfi_def_cfa_offset 16
movss %xmm0, 4(%rsp) # 4-byte Spill
movd %xmm0, %esi
movl $__unnamed_1, %edi
xorl %edx, %edx
callq __ubsan_handle_divrem_overflow
xorps %xmm1, %xmm1
movss 4(%rsp), %xmm0 # 4-byte Reload
divss %xmm1, %xmm0
popq %rax
ret
您会看到它添加了使用该函数进行检查的代码。
编译器应该自动链接到适当的清理库,然后对我来说下面的完整程序:
float foo(float f) { return (f / 0); }
int main() {
foo(1.0f);
}
执行时产生以下输出:
main.cpp:1:32: runtime error: division by zero
我使用命令 clang++ -fsanitize=undefined main.cpp && ./a.out
构建和运行
如果您想要编译时检查,您想要启用更多编译器警告或静态分析器。但是,对于浮点除零错误,似乎没有任何警告或静态分析检查。
这是一个生成分析报告的程序:
#include <malloc.h>
int main() {
int *i = (int*) malloc(sizeof(int));
}
使用 clang++ -std=c++11 main.cpp
编译它不产生任何诊断信息,但使用 clang++ -std=c++11 --analyze main.cpp
编译它报告以下内容:
main.cpp:4:10: warning: Value stored to 'i' during its initialization is never read
int *i = (int*) malloc(sizeof(int));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:5:1: warning: Potential leak of memory pointed to by 'i'
}
^
dead store 也可以用 -Weverything [-Wunused-value] 检测,但泄漏只能由分析器检测到。
默认情况下,完整的分析结果会写入 plist 文件。您还可以使用以下命令运行分析器:
clang++ --analyze -Xanalyzer -analyzer-output=text main.cpp
clang++ --analyze -Xanalyzer -analyzer-output=html -o html-dir main.cpp
分别在标准输出或通过带注释的源代码的 html 显示而不是在 plist 中获取检测到的问题的详细演练。
列出了分析器检查here .
请注意,为了达到最佳效果,分析器需要分析整个程序,这意味着它需要与构建系统相关联。通常的接口(interface)是通过 IDE (Xcode) 或 scan-build
与 make 的工具。 CMake 有一些 clang 特性,比如产生 clang JSON compilation database files但我不确定 CMake 是否内置了对 clang 分析器的支持。
关于c++ - 我应该如何在clang中使用 sanitizer ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22699881/
我目前使用以下代码在存储字符串之前对其进行清理: ERB::Util::h(string) 当字符串已经像这样清理后,我的问题就出现了: string = "Watching baseball `&a
我有几个版本的项目结帐和编译。如果我发现错误,我会比较版本以缩小问题范围。有时我会启用像 AddressSanitizer 这样的 sanitizer 。如果我重新使用一个可执行文件,我不记得它是否是
过去有人担心在某些环境中的生产中使用 ASAN:https://seclists.org/oss-sec/2016/q1/363 .评论来自 2016 年 - 今天的情况如何? 是否推荐使用 sani
过去有人担心在某些环境中的生产中使用 ASAN:https://seclists.org/oss-sec/2016/q1/363 .评论来自 2016 年 - 今天的情况如何? 是否推荐使用 sani
我正在使用 Google Caja HTML Sanitizer ( https://code.google.com/p/google-caja/wiki/JsHtmlSanitizer ),但它正在
我正在使用 goog.dom.safeHtmlToNode 动态更新包含内容的选项卡 由于较新版本的 google 闭包库删除了 dom 片段方法:goog.dom.htmlToDocumentFra
我正在使用 DOMPurify.sanitize()里面 dangerouslySetInnerHTML={{}}显示 innerHtml从数据库返回。对于最初的目的,我使用 getServersid
我不知道我需要做什么才能使这些选项不再被禁用。任何帮助,将不胜感激: 最佳答案 Thread Sanitizer 可用于以下准备条件: 关闭其他选项,例如 'Malloc stack' 需要64位模拟
我想知道是否有人使用过这个类并发现它可靠? http://www.phpclasses.org/package/3746-PHP-Remove-unsafe-tags-and-attributes-f
假设我复制了一些“恶意”输入,例如带有事件处理程序或其他 javascript 的 DOM 节点 如果我将其复制到我的剪贴板并将其粘贴到 contenteditable div 中,事件处理程序将被
这是我的一个表单(PHP+MySQL,textarea被TinyMCE取代)。它记录了带有段落、项目符号、标题和文本对齐方式(右对齐、左对齐、居中对齐和对齐)的描述。 提交后,记录显示为 Introd
我有以下代码片段,我在其中检查 soap 结果并将数据插入我的数据库。 Connection dbconn = null; Statement stmt1 = null; Statem
在以下示例中,我如何删除所有保留 html 内容的未知现有自定义标签: my header my Title my SubTitle 我想回去
我正在 Ubuntu 14.04 上使用带有 Clang 3.7.0 的 Memory Sanitizer。以下代码可以完美运行: #include int main() { double an
有哪些好的 PHP html(输入) sanitizer ? 最好是,如果内置了某些东西 - 我希望我们能做到这一点。 更新: 根据请求,通过评论,输入应该不允许 HTML(并且显然防止 XSS 和
我有以下数组,想知道验证和清理该数组以确保只允许整数的最佳方法是什么? if(is_array($_POST['taxonomy'])) { $term_ids = array_map('es
$sanitize 服务 tells me that All safe tokens (from a whitelist) are then serialized back to properly e
很抱歉,如果这是一个 super 简单的概念,但我发现很难获得正确的心态才能正确使用 clang 提供的 sanitizer 。 float foo(float f) { return (f / 0)
Clang有各种 sanitizer ,可以打开以在运行时发现问题。 但是,有些 sanitizer 我不能一起使用。这是为什么? clang++-3.9 -std=c++1z -g -fsaniti
一直在用fsanitize=address在编译 C 程序时,为了跟踪段错误大约一年了。我时不时地遇到一个奇怪的行为,如果编译没有我的程序会出现段错误 fsanitize=address但是当我用 f
我是一名优秀的程序员,十分优秀!