2016-11-10 19 views
2

我有一个庞大的代码库。它的声明如下所示:静态分析器检测两个后/增量运算符

int a = ((unsigned int) ((unsigned char) buffer[offset++]) << 8) | (unsigned int) (unsigned char) buffer[++offset]; 

最近我迁移到更高版本的编译器。随着编译器的迁移,如上所示的复杂语句的演变会导致不一致的结果。

我知道这是一种错误的编码习惯,希望纠正它。寻找可以标记这些错误的静态分析器。任何指向特定的静态分析器的赞赏。

+0

clang用'-Wunsequenced'检测,gcc用'-Wsequence-point' – deniss

+1

这不仅仅是坏习惯,它还是一个未定义的行为错误。工具推荐问题是无关紧要的,但是任何一半的体面静态分析器都会对此代码尖叫。如果你想确定,选择一个可以检查是否符合MISRA-C(其中大多数可以,现在)。在同一表达式中将++与其他操作混合使用会被MISRA-C禁止,从而避免了这个bug。 – Lundin

+0

此外,这些演员表明,编写此代码的人完全不知道隐式类型促销如何在C中工作。这也可以通过阅读MISRA-C解决,MISRA-C非常关注如何避免隐式类型提升错误。 – Lundin

回答

5

这不仅仅是错误的编码习惯。

这是可怕的。您正在向程序中引入未定义行为的绝对卡车负载。

|,不像||,是不是一个测序点。您同时在概念上增加两次offset。 C标准没有定义这种行为。

你需要立即解决这个问题。暂时搁置静态分析器。您的编译器警告标志套件可以帮助您。但是如果我处于你的位置,我会处于恐慌模式,我会搜索我的代码库++--,并检查每个表达式。

+0

编译器不需要警告未定义的行为,因此获取静态分析器仍然是一个好主意。 – Lundin

+0

嗯,市场上几乎所有的静态分析仪都以某种方式被破坏......但它们仍然比编译器警告或者根本就没有分析仪要好。 – Lundin