有时,错误发现过程可能无法确定问题所在,当错误需要特殊设置或更高级的技巧(例如堆填充或利用争用条件)才能发现时,更是如此。其中许多错误并不能即时发现,可能需要检查数千条指令才能找到内存违例的真正原因所在。ASan 可针对所有与内存有关的函数执行仪器测试并为必须触发 ASan 相关回调才可访问的区域填充数据,可在发生内存违例时立即捕获违例,而不是等待崩溃导致数据损坏。这对于错误发现和根源诊断极为有用。此外,ASAN 还是一个非常有用的模糊测试工具,一直用于 Android 上的各种模糊测试工作。 UBSan UndefinedBehaviorSanitizer (UBSan) 执行编译时仪器测试,检查各种未定义的行为。设备制造商可通过将 LOCAL_SANITIZE:=default-ub 包含到生成文件或将 default-ub: true 包含到 blueprint 文件的 sanitize 块中,将 UBSan 加入其测试构建中。UBSan 可以检测多种未定义的行为,而 Android 的构建系统直接支持: bool integer-divide-by-zero return returns-nonnull-attribute shift-exponent unreachable vla-bound Android 的构建系统还使用了 UBSan 的整数溢出检查功能。UBSan 还支持 unsigned-integer-overflow,这不是严格意义上的未定义行为,但它包含在擦除器中。在生成文件中,可以将 LOCAL_SANITIZE 设置为 signed-integer-overflow、unsigned-integer-overflow 或 combination flag integer,启用 signed-integer-overflow、unsigned-integer-overflow、integer-divide-by-zero、shift-base 和 shift-exponent,以启用这些行为。在 blueprint 文件中,可以将 Misc_undefined 设置为所需的标志,启用这些行为。这些 UBSan 目标,尤其是 unsigned-integer-overflow,广泛用于 mediaserver 组件中,以用来消除任何潜在的整数溢出漏洞。 在 Android 中,当出现未定义的行为时,默认的做法是中止程序。但是,从 2016 年 10 月开始,Android 中的 UBSan 将提供一个可选的运行时库,其报告的错误信息将更加详细,包括出现的未定义行为类型、文件和源代码行信息。 在 Android.mk 文件中,可通过以下方式启用该库: LOCAL_SANITIZE:=unsigned-integer-overflow signed-integer-overflowLOCAL_SANITIZE_DIAG:=unsigned-integer-overflow signed-integer-overflow 而在 Android.bp 文件中,可通过以下方式启用该库: sanitize: { misc_undefined: [ "unsigned-integer-overflow", "signed-integer-overflow", ], diag: { misc_undefined: [ "unsigned-integer-overflow", "signed-integer-overflow", ], }, }, 下面是 UBSan 运行时库提供的信息示例: external/icu/icu4c/source/common/ucnv.c:1193:23: runtime error: unsigned integer overflow: 4291925010 + 2147483647 cannot be represented in type 'unsigned int'external/icu/icu4c/source/common/cstring.c:288:16: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'uint32_t' (aka 'unsigned int')external/harfbuzz_ng/src/hb-private.hh:894:16: runtime error: unsigned integer overflow: 72 - 55296 cannot be represented in type 'unsigned int'external/harfbuzz_ng/src/hb-set-private.hh:82:24: runtime error: unsigned integer overflow: 32 - 562949953421312 cannot be represented in type 'unsigned long'system/keymaster/authorization_set.cpp:500:37: runtime error: unsigned integer overflow: 6843601868186924302 * 24 cannot be represented in type 'unsigned long' SanitizerCoverage Sanitizer 工具内置一个非常简单的代码覆盖工具。SanitizerCoverage 可实现调用级、基本块级和边缘级的代码覆盖。此 Sanitizer 可用作独立的仪器测试工具,也可与其他任何擦除器配合使用,包括 AddressSanitizer 和 UndefinedBehaviorSanitizer 等。要使用这一基于 Guard 的新覆盖工具,请设置 fsanitize-coverage=trace-pc-guard。编译器将在每个边缘插入 __sanitizer_cov_trace_pc_guard(&guard_variable)。每个边缘均有各自的 uint32_t guard_variable。 (责任编辑:本港台直播) |