1 简述
下文为PC-Lint屏蔽告警的方法,包括单行屏蔽、代码块屏蔽和宏内嵌屏蔽。
PC-Lint( MISRA 2012) 告警号原因见 PC-Lint error messages
2 PC-Lint选项的语法
官方给出的PC-Lint语法如上图。
支持C90的"// … "注释方式和C99的“/* … */”注释方式。有以下几点需要注意:
- lint必须为小写且紧挨着“//”或“/*”
- lint后可跟一个或多个Lint选项,Lint选项由‘-’、‘+’、‘!’三种符号开头
- Lint选项后可以有自定义的注释内容(optional commentary),但不能是‘-’、‘+’、‘!’三种符号开头
3 代码中屏蔽告警的方法
3-1 代码单行屏蔽
下图为官方示例,给出的C90,C99注释规范下的两种行屏蔽方式,只对单行代码有效。
需要注意的是,不要对宏使用单行注释。因为PC-Lint在代码编译预处理前检查源文件中的‘!’,来实现快速扫描。
单行屏蔽示例1,屏蔽904告警(函数结束前调用了return)
void fetctl_process(const void *para)
{
if (para == NULL)
{
return; /*lint !e904 */
}
/* do something ... */
}
建议后面的可选注释中包含了对屏蔽告警的描述。为了阅读代码或代码评审时,知道屏蔽了哪些告警.
单行屏蔽示例2,下为改进后的代码,功能完全相同,但可读性更好。
if (para == NULL)
{
return; /*lint !e904 Note 904: Return statement before end of function 'fetctl_process(void)' [MISRA 2012 Rule 15.5, advisory]*/
}
3-2 代码块屏蔽
下图官方示例,在两条Lint注释之内的代码块(一行或多行),将屏蔽#621告警。
代码块屏蔽示例1,屏蔽730告警(简化版本和高可读性版本)
/*lint -save */
if (soft_i2c_write_bit(i2c_obj, !ack) == FALSE)
{
ret = FALSE;
}
/*lint -restore */
/*lint -save -e730 Boolean argument to function */
if (soft_i2c_write_bit(i2c_obj, !ack) == FALSE)
{
ret = FALSE;
}
/*lint -restore */
代码块屏蔽示例2,同时屏蔽了785和835两个告警
static const struct gpio_cfg gpio_cfg_list[] =
{
/*lint -save -e785 -e835
* Info 785: Too few initializers for aggregate 'unknown-name' of type 'const struct gpio_cfg'
* Info 835: A zero has been given as left argument to operator '<<'*/
{.io = PIN_TEST_LED, .mode = GPIO_MODE_OUT_PP, .state = GPIO_PIN_STATE_LOW, .speed = GPIO_SPEED_LOW, .alternate = GPIO_AF_NONE },
{.io = PIN_ADC_NTC1, .mode = GPIO_MODE_IN_AN, .state = GPIO_PIN_STATE_UNKNOW, .speed = GPIO_SPEED_LOW, .alternate = GPIO_AF_NONE },
/*lint -restore */
};
3-3 宏屏蔽
宏内嵌Lint注释的方式如图。
即对宏注释必须嵌入到宏定义内,在宏定义右侧使用单行注释的方式无效。