安装 splint:
sudo apt-get install splint
使用 splint 做静态分析:
splint -f lint/splint.rc app/*.c
- -f lint/splint.rc 指定从 lint/splint.rc 文件中读取命令参数,如果命令参数文件命名为 .splintrc ,那么不需要显式指定。
- app/*.c 对 app 目录下的所有源文件进行静态分析。
命令参数文件:
# splint.rc
-systemdirs /home/user/tools/gcc/gcc-arm-none-eabi-5_4-2016q3/arm-none-eabi/include:hal/STM32L0xx/CMSIS/Include:hal/STM32L0xx/CMSIS/Device/ST/STM32L0xx/Include:hal/STM32L0xx/STM32L0xx_HAL_Driver/Inc
-D__GNUC__
-DUSE_FULL_LL_DRIVER
-DSTM32L051xx
-Ilib
-Ihal/MyBoard/Inc
-Ihal/STM32L0xx/STM32L0xx_HAL_Driver/Inc
-Ihal/STM32L0xx/CMSIS/Include
-Ihal/STM32L0xx/CMSIS/Device/ST/STM32L0xx/Include
-I/home/user/tools/gcc/gcc-arm-none-eabi-5_4-2016q3/arm-none-eabi/include
-preproc
将命令行参数放到命令参数文件中,每行一个命令,# 开头的是注释行。splint 有一个示例文件:/usr/share/doc/splint/examples/splint.splintrc 。
- -systemdirs 将指定的目录作为系统头文件路径,默认不分析系统头文件,多个路径用冒号分隔。如果不希望分析某个目录下的头文件,那么可以将这个目录添加到这里。
- -Ihal/MyBoard/Inc 指定头文件搜索路径,这应该和编译时传给编译器的头文件搜索路径一致。搜索路径可以指定多个,就像给编译器指定多个搜索路径一样,特别要注意的是:最后要将编译器的头文件路径添加进去,就是
-I/home/user/tools/gcc/gcc-arm-none-eabi-5_4-2016q3/arm-none-eabi/include
这一行,这是将 splint 用在嵌入式软件上的最特别之处。默认情况下,splint 认为编译器的头文件文件路径是 /usr/include ,嵌入式软件的系统头文件并不在这里,而是在编译器的相关目录下。 - -DUSE_FULL_LL_DRIVER 定义宏,应该和编译时传给编译器的参数一致,除此之外还要添加编译器预定义的宏,比如
__GNUC__
,要获取编译器预定义的宏,参考打印GCC预定义宏。
参考资料:
- splint manual
- splint简要手册
- Splint介绍
rc: run command