需要 MISRA 规则 13.6 解释

MISRA rule 13.6 explanation needed

规则 13.6 规定:sizeof() 运算符的操作数不应包含任何
具有潜在方面 affects.I 的表达式不知所措,无法确定运算符
有副作用会影响 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 操作数内的任何副作用 ("code") 实际上都不会被执行。此类错误的示例:

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 变量也有例外,因为在表达式中仅存在这样的变量会引入副作用(读取变量)。