☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

不应存在没有副作用的语句

8.22 ID_missingSideEffect
目录 › next › previous

不能对程序状态产生影响的语句称为无“副作用(side effect)”的语句,往往属于笔误或调试痕迹,应当修正或去除。

示例(设 a、b、p 为变量或指针):

a == b;  // Non-compliant

单纯的判等是没有副作用的,很可能是赋值语句的笔误。

*p++;    // Non-compliant

单纯从某个地址进行读取是没有副作用的,这是一种对运算符优先级理解不当造成的常见错误,应改为 (*p)++;

p->fun;  // Non-compliant

由变量名或无实参列表的函数名作为一个语句是没有副作用的,此语句应改为正确的函数调用。

+a;      // Non-compliant

正号是没有副作用的,此句很可能应为 ++a;

如果语句为逻辑与表达式,左子表达式可以作为右子表达式的条件,故左子表达式可以无副作用,而右子表达式一定要有副作用,如:

p && p->fun();  // OK
p && p->fun;    // Non-compliant
p->fun() && p;  // Non-compliant

如果语句为逻辑或表达式,则要求其左右子表达式均有副作用,如:

p || p->fun();  // Non-compliant
p || p->fun;    // Non-compliant
p->fun() || p;  // Non-compliant

依据

ISO/IEC 9899:1999 5.1.2.3(2) ISO/IEC 9899:2011 5.1.2.3(2) ISO/IEC 14882:2003 1.9(7) ISO/IEC 14882:2011 1.9(12)

参考

CWE-482 CWE-1164 MISRA C 2004 14.2 MISRA C 2012 2.2 MISRA C++ 2008 0-1-9
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.