c-需要对MISRA规则13.6进行解释



规则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变量甚至有一个例外,因为在表达式中仅仅存在这样的变量就会产生副作用(读取变量)。

最新更新