使用clang-tidy对armcc编译的C代码做静态分析时,如何规避armcc语法引发的clang诊断错误?
嗨,我之前也踩过这个一模一样的坑!clang-tidy底层是基于Clang的,对ARMCC那堆专属编译选项和语法的支持确实拉胯,给你分享几个亲测有效的解决思路:
拆分编译参数,只给clang-tidy喂它看得懂的
你可以在构建脚本(比如Makefile、CMakeLists.txt)里把ARMCC独有的那些选项(像--apcs=interwork、--cpu、--c99这些)和通用的编译参数(比如头文件路径-I、宏定义-D)分开,只把后者传给clang-tidy。毕竟clang-tidy根本认不出ARMCC的专属选项,硬塞给它肯定报错啊。用预处理宏把ARMCC专属代码隔离开
要是代码里有ARMCC特有的语法(比如专属的汇编指令、编译器扩展),就用__ARMCC_VERSION__这个宏把它们包起来。clang-tidy分析的时候因为没定义这个宏,就会自动跳过这部分代码,自然不会报错了。举个实际代码例子:#ifdef __ARMCC_VERSION__ // 这部分是只有ARMCC才认的汇编代码 __asm__ volatile ("ARMCC_SPECIFIC_ASM_INSTRUCTION"); #else // 这里可以留空,或者写clang能识别的替代逻辑(如果有的话) #endif让clang-tidy别揪着“不支持选项”的错误不放
你可以给clang-tidy加个参数,让它忽略那些“不支持选项”的诊断错误。具体就是在clang-tidy命令的最后,用--传递给Clang的参数里加上-Wno-unsupported-option,比如:clang-tidy your_source_file.c -- -Wno-unsupported-option不过要注意哈,这个办法有点“一刀切”,可能会漏掉其他有用的错误,所以最好和前面拆分参数的办法配合着用,效果会更好。
指定ARM目标架构,提升clang的兼容性
给clang-tidy传递-target arm-none-eabi这类参数,让Clang切换到ARM目标架构的分析模式。这样它对ARM相关的语法和选项的支持会更到位,能减少不少无意义的“不支持选项”报错。
我当时就是把拆分参数和宏隔离这俩办法结合起来用的,基本把ARMCC相关的诊断错误都搞定了,你可以根据自己项目的情况调整试试!
备注:内容来源于stack exchange,提问作者Snaily

