關(guān)于MISRA2012規(guī)則15.4-“應(yīng)該有不超過一個break或goto語句用于終止任何迭代statement.”,這個例子正確嗎?有人能用一些工具(MISRA檢查器)來確認(rèn)這一點嗎?
do {
retval = do_smth();
if (retval != OK) {
break;
}
retval = do_smth2();
if (retval != OK) {
break;
}
retval = do_smth3();
} while (0u);
這只是一個概念,但我在這里嘗試的是用break
的級聯(lián)替換goto
的級聯(lián)(不幸的是在本例中被禁止)。我的觀點是do { } while(0u);
不是迭代語句。你覺得呢?
首先,您的代碼確實沒有遵循規(guī)則15.4,因為在迭代語句1)中有3
break
。但這只是一個建議,只要代碼可讀且易于理解,像您這樣使用多個中斷并沒有錯。這些MISRA規(guī)則的主要原理是防止復(fù)雜代碼從多個嵌套的復(fù)合語句中分離出來的“復(fù)合語句意大利面”。在盲目遵循這些規(guī)則之前,理解其基本原理是很重要的。因此,在這種情況下,只需考慮保持代碼的原樣—咨詢規(guī)則不需要任何偏差。
否則,有以下幾個選項:
MISRA-C的一個問題是,它不允許函數(shù)多次返回,即使它使代碼更可讀。否則,最明顯、最具可讀性的解決方案是使用函數(shù):
我通常的解決方案是對multiple return規(guī)則做一個永久的MISRA-C偏差,并在使代碼更可讀的情況下允許它,就像在本例中一樣。
否則,第二個最好的選擇可能是舊的“on error goto”——禁止
goto
的規(guī)則在MISRA-C:2012中被放寬了,所以現(xiàn)在只是建議性的。如果以上兩種形式都不適用,因為您是super-strict和MISRA-C一起使用的,那么第三個選項可能是這樣的,我相信它是100%MISRA-C兼容的:
C語言不適合你。
1) 從C17開始: