2016-04-09 40 views
2

第13.6條規定:sizeof運算()運算符的操作數不應包含任何
表達其有潛力側affects.I很茫然,以確定如何操作
副作用會影響sizeof()運算符的結果。
有人可以用這個例子解釋嗎?MISRA規則13.6解釋需要

void f(int32_t n) 
{ 
    size_t s; 
    s = sizeof(int32_t[n]); //Compliant 
    s = sizeof(int32_t[n++]); //Non Compliant 
} 

或者任何人都可以舉一個更容易理解的例子,並解釋一下嗎?

回答

0

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文件提供了:這種錯誤的實例解釋所有這一切的好理由。如果你閱讀細則,甚至有一個例外的變量,因爲表達式中只有這樣一個變量存在副作用(讀取變量)。

+0

是的,我記得揮發性的例外。但無法得到這種副作用的全部想法。謝謝您的幫助。 –

+0

@NishrinTrunkwala在C標準中有一個術語副作用的正式定義5.1.2.2.3「訪問一個易失對象,修改一個對象,修改一個文件或者調用一個執行任何這些操作的函數都是副作用,「 – Lundin

3

輸入到sizeof運算符的表達式未被評估。只推導表達式的類型並將其用作sizeof運算符的輸入。這意味着,在不符合MISRA的情況下,n++,n將不會增加。由於這有點違反直覺,MISRA建議不要使用帶副作用的表達式來避免錯誤。

+0

s/non-compliant case/compliant case/ – wildplasser

+0

@wildplasser我發現它是正確的。不符合規定的情況是使用後增量運算符的情況,違反直覺'n'不會遞增。 – atturri

+0

它可能有點模糊。 「[non] compliant」:=符合**標準**,或符合** MISRA **? – wildplasser