调试内核内存问题:UBSAN与Clang编译器的使用
1. 使用UBSAN内核检查器查找未定义行为
在C语言等编程语言中,编译器通常会为正确的代码情况生成代码。然而,当源代码出现意外或错误操作时,编译器往往不知如何处理,常常直接忽略这些情况。这种做法虽有助于生成高度优化的代码,但可能会引入(安全)漏洞。常见的例子包括数组越界、算术缺陷(如除零、有符号整数溢出或下溢)等。更糟糕的是,有时有问题的代码似乎能正常运行,或者在优化情况下表现不同,这些无法预测的情况被称为未定义行为(Undefined Behavior,简称UB)。
内核的未定义行为检查器(UBSAN)可以捕获多种运行时的UB。与KASAN类似,它使用编译时插桩(Compile Time Instrumentation,CTI)技术。当完全启用UBSAN时,内核代码会使用 –fsanitize=undefined 选项进行编译。UBSAN能捕获的UB类型包括:
- 算术相关的UB :
- 算术溢出/下溢/除零等。
- 位运算时的越界访问。
- 内存相关的UB :
- 数组越界访问。
- 空指针解引用。
- 未对齐的内存访问。
- 对象大小不匹配。
部分UBSAN捕获的缺陷与通用KASAN捕获的缺陷有重叠。虽然UBSAN插桩后的代码体积更大、运行速度更慢(约慢2 - 3倍),但在开发和单元测试阶段,它对于捕获UB缺陷非常有用。实际上,在生产系统中启用UBSAN也是可行的,只要能接受更大的内核文本大小和处理器开销(对于非小型嵌入式系统,通常是可
超级会员免费看
订阅专栏 解锁全文
636

被折叠的 条评论
为什么被折叠?



