静态分析类型字符

问题描述

我的库具有以下功能行:

int
lwip_stricmp(const char* str1,const char* str2)
{
  char c1,c2;

  do {
    c1 = *str1++;
    c2 = *str2++;
...

我有这样的MISRAC2012-Rule-10.3错误

Implict conversion of '*str1++' from essential type unsigned 8-bit to different or narrover essential type character

Implict conversion of '*str2++' from essential type unsigned 8-bit to different or narrover essential type character

如何解决错误或如何抑制此错误

解决方法

如果代码如前所述,则该工具给出了错误的诊断。 c1 = *str1++;行中没有隐式提升,也没有不同的基本类型,c1str都是“本质上是字符类型”。

但是,这里还有另一个(更严重的是)MISRA违规。强烈建议不要将++与同一表达式中的其他运算符组合在一起,尤其是这种情况下,还应避免其他副作用(例如,参见13.3)。也许这个问题使您的工具愚蠢地产生了错误的诊断结果。

还有关于复杂表达式和括号等的规则。使代码与MISRA-C兼容,如下所示:

c1 = *str1;
c2 = *str2;
str1++;
str2++;

如果在上述修复后该工具仍在抱怨,那么那是IAR静态分析器中的另一个错误。