Tag: 运行时消毒

未定义的行为消毒剂

在最近的文章“有关Thread Sanitizer的一些知识”中,我们讨论了Thread Sanitizer工具及其工作方式。 如果您仍然没有阅读它,建议您在开始阅读本指南之前先阅读它,以了解一些概念和参考。 在今天的文章中,我们将讨论Undefined Behavior Sanitizer或UBSan。 所以……让我们从问题开始: 什么是UBSan? 摘自Apple未定义的行为消毒器文档 Undefined Behavior Sanitizer或UBSan是用于C语言的LLVM工具,可在运行时检测未定义的行为。 未定义行为描述了具有未指定语义的任何操作的结果,例如除以零,从未对齐的指针加载内存或取消引用空指针。 UBSan可以检测到许多其他未定义的行为,例如对数组的越界访问,整数溢出,对浮点类型与其他类型之间或从它们之间的强制类型转换。 未定义行为是最难调试的错误之一,因为您永远不知道它是否会导致崩溃,或者只是从丢失的指针数据中返回垃圾数据,或者如果您很幸运,它可能就好像没有什么问题一样起作用。 怎么运行的 让我们使用一个简单的C代码示例 如您所见,结果似乎有点不可思议吧? 由于32位MAX_INT的值为2147483647,为什么结果等于INT_MIN? 那是因为二进制加法的方式。 但更重要的是,这不是运行时错误,而只是显示“错误”的输出。 现在让我们看看启用USan的工作方式 要使用UBSan进行编译,我们只需传递-fsanitize = undefined标志 clang ubsan.c -o ubsan -fsanitize =未定义 OBS:您可以启用UBSan进行特定检查。 例如,仅检查整数溢出,将标志更改为-fsanitize = signed-integer-overflow。 有关更多信息:启用未定义的行为清理器 现在,UBSan检测整数溢出错误并显示为输出。 太酷了\ o / XCode上的UBSan 在Xcode上设置UBSan非常简单。 让我们建立一个Objective-C项目,看看它如何工作。 首先,我们必须启用UBSan: 在“产品”>“方案”>“编辑方案”上,在“运行”操作的“诊断”部分中,只需选中“未定义行为消毒剂”。 因此,建立一个项目,从前放置相同的代码,启用UBSan并在Xcode上运行该项目,将给我们带来运行时错误,如下所示: 重要 Apple Core Diagnostics文档中的一件重要事情 Undefined Behavior Sanitizer对性能的影响很小,在Debug配置中平均有20%的CPU开销。 与TSan不同,UBSan对性能的影响最小,并且可以在设备上运行。 […]