未初始化检测
未初始化检测功能是一种重要的内存安全保护机制,旨在识别并防止由于使用未初始化的变量而导致的内存异常。
支持的未初始化异常类型
异常名 |
描述 |
位置 |
支持地址空间 |
---|---|---|---|
内存申请后为未初始化状态,未对内存进行写入,直接读取未初始化的值导致的异常。 |
kernel,host |
GM、UB、L1、L0{ABC}、Private |
启用未初始化检测
运行msSanitizer工具时,执行如下命令,启用未初始化检测功能(initcheck)。
mssanitizer --tool=initcheck application // application为用户程序
- 启动工具后,将会在当前目录下自动生成工具运行日志文件mssanitizer_{timestamp}_XXX.log。
- 当用户程序运行完成后,界面将会打印异常报告,异常的具体含义请参见未初始化异常报告解析。
未初始化异常报告解析
未初始化检测异常报告会输出多种不同类型的异常信息,以下将对一些简单的异常信息示例进行说明,帮助用户解读异常报告中的信息。
未初始化的异常场景一般是算子读取了已申请但未初始化的内存,发生在GM、UB、L1、L0{ABC}、Private上。
====== ERROR: uninitialized read of size 224 // 异常的基本信息,包含读取的未初始化字节数 ====== at 0x12c0c0015000 on GM // 异常发生的内存位置信息,包含发生的地址空间与内存地址,此处的内存地址指一次内存访问中的首地址 ====== in block aiv(0) // 异常代码对应vector核的block索引 ====== code in pc current 0x77c (serialNo:10) // 当前异常发生的pc指针和调用api行为的序列号 ====== #0 ${ASCEND_HOME_PATH}/compiler/tikcpp/tikcfw/impl/dav_c220/kernel_operator_data_copy_impl.h:58:9 // 以下为异常发生代码的调用栈,包含文件名、行号和列号 ====== #1 ${ASCEND_HOME_PATH}/compiler/tikcpp/tikcfw/inner_interface/inner_kernel_operator_data_copy_intf.cppm:58:9 ====== #2 ${ASCEND_HOME_PATH}/compiler/tikcpp/tikcfw/inner_interface/inner_kernel_operator_data_copy_intf.cppm:443:5 ====== #3 uninitialized_read/ uninitialized_read_kernel.cpp:18:5
父主题: 异常检测(msSanitizer)