规则13.6规定:sizeof()运算符的操作数不应包含任何
具有潜在副作用的表达。我无法确定操作员是如何操作的
副作用会影响sizeof()运算符的结果
有人能用这个例子来解释吗?
void f(int32_t n)
{
size_t s;
s = sizeof(int32_t[n]); //Compliant
s = sizeof(int32_t[n++]); //Non Compliant
}
或者有人能举一个更容易理解的例子来解释吗?
不计算输入到sizeof
运算符的表达式。仅推导出表达式的类型,并将其用作sizeof
运算符的输入。这意味着,在不符合MISRA的情况下,n++
、n
将不会递增。由于这有点违背直觉,MISRA建议不要使用有副作用的表达,以避免出现错误。
sizeof
运算符是一种特殊情况,通常它只在编译时求值,并由常数代替。这意味着sizeof
操作数内的任何副作用("代码")实际上都不会被执行。此类错误的示例:
sizeof(i++) // Bad! i will not get incremented
sizeof(i=j) // Bad! i will not get a new value
sizeof(func()) // Bad! The function will not get called
(当在运行时评估sizeof
时,只有一个例外,即当操作数是可变长度数组类型时。)
MISRA文件提供了一个很好的理由来解释这一切。如果你阅读了细则,volatile
变量甚至有一个例外,因为在表达式中仅仅存在这样的变量就会产生副作用(读取变量)。