第 100 / 120 课 · 调试与性能工具。返回课程合集。
机制与资源关系
ASan 检测多类越界和释放后使用,UBSan 检测部分未定义行为。它们需要工具链与运行库支持,覆盖不到所有逻辑错误。内存错误报告中的首次异常通常比后续连锁崩溃更有价值。
实际用法与观察入口
以下是操作说明;先确认执行环境、工具帮助和目标对象。设备名、PID、地址及项目名示例需要按实际替换,不能将整段命令当通用板端脚本执行。
|
输出解读与排查顺序
对输入长度、索引和整数运算分别建立边界测试。sanitizer 运行会增加资源使用,嵌入式板内存不足时可先验证可移植模块,再在目标工具链补充。
情境推演
正常输入通过 ASan,超长输入才触发越界,说明验证覆盖依赖输入集。修复应检查长度契约并增加边界用例,不只是把数组改大到当前样例能放下。
练习与参考分析
把解析器的长度检查写在复制前,测试空输入、边界长度和超长输入。参考结论:正常样例没有报告不能证明任意输入安全,需覆盖失败路径。
独立实验包
主机 ASan+UBSan 构建和边界输入验证;没有故意触发越界,不代表覆盖任意输入或真实板端。
本课独立 C 实验
查看完整代码:main.c
static int copy_payload(char *dst,size_t capacity,const char *src,size_t length) {
if (length >= capacity) return -1;
memcpy(dst,src,length); dst[length]='\0'; return 0;
}
int main(void) {
char target[8];
CHECK(copy_payload(target,sizeof(target),"",0) == 0 && target[0] == '\0');
CHECK(copy_payload(target,sizeof(target),"1234567",7) == 0);
CHECK(strcmp(target,"1234567") == 0);
CHECK(copy_payload(target,sizeof(target),"12345678",8) == -1);
puts("empty, boundary and oversized input checked; no intentional invalid memory access");
return 0;
}
在项目根目录执行;下载包解压后,在解压目录执行 sh run.sh。
cd 'content/posts/驱动、bootloader、文件系统/嵌入式Linux系统工程/100-ASan、UBSan 与内存错误/code' && sh run.sh
官方资料与版本边界
内核、工具和厂商 BSP 的支持范围需分别核对。参考资料可能对应较新版本;不要据此推定旧 BSP 支持所有接口。