ARM Compiler 5.06u7下Codesonar检测到cmsis_armcc.h未初始化变量问题求解
问题说明
使用Codesonar静态分析工具时,检测到cmsis_armcc.h文件中以下代码存在未初始化变量相关安全问题:
__STATIC_INLINE uint32_t __get_CONTROL(void) { register uint32_t __regControl __ASM("control"); return(__regControl); }
当前环境:Keil IDE中该文件为只读状态,使用ARM Compiler版本5.06 update 7。
可行解决方法
排除Codesonar误报
这段代码是ARM Compiler专用语法,__ASM("control")的作用是直接绑定CPU的CONTROL寄存器,变量__regControl并非真的未初始化,只是Codesonar无法识别这种寄存器绑定逻辑。可以在Codesonar的分析配置中,针对__get_CONTROL函数添加规则例外,将其标记为误报,避免后续分析再触发该提示。通过头文件重定义覆盖原实现
在项目自定义头文件中重新实现__get_CONTROL函数,覆盖CMSIS的原有代码。确保自定义头文件在cmsis_armcc.h之后被包含,或者通过编译器-include参数强制优先引入。推荐采用标准内联汇编写法,让Codesonar能正确识别寄存器读取操作:#undef __get_CONTROL __STATIC_INLINE uint32_t __get_CONTROL(void) { uint32_t reg; __asm volatile ("MRS %0, CONTROL" : "=r" (reg)); return reg; }这种方式不需要修改只读的系统文件,仅在项目自有代码中调整,兼容性更好。
升级CMSIS或编译器版本
检查是否有更新的CMSIS版本,新版本可能优化了代码写法以适配静态分析工具。另外,考虑升级ARM Compiler到更高版本(如ARM Compiler 6),新版本对语法的解析更规范,可能让Codesonar正确识别原代码的意图。注意升级前需验证项目兼容性,避免引入新问题。修改原文件权限后修复(不推荐)
若上述方法均不可行,可临时修改cmsis_armcc.h的文件权限为可写,将原函数替换为标准内联汇编的写法。但此方法存在隐患:后续Keil或CMSIS更新会覆盖修改,且修改系统文件可能导致项目在其他环境编译异常,仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者Vi007

