misrac2012規(guī)則15.4并用break替換goto

關(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)中有3break。但這只是一個建議,只要代碼可讀且易于理解,像您這樣使用多個中斷并沒有錯。

這些MISRA規(guī)則的主要原理是防止復(fù)雜代碼從多個嵌套的復(fù)合語句中分離出來的“復(fù)合語句意大利面”。在盲目遵循這些規(guī)則之前,理解其基本原理是很重要的。因此,在這種情況下,只需考慮保持代碼的原樣—咨詢規(guī)則不需要任何偏差。

否則,有以下幾個選項:


MISRA-C的一個問題是,它不允許函數(shù)多次返回,即使它使代碼更可讀。否則,最明顯、最具可讀性的解決方案是使用函數(shù):

type do_stuff (void);
{
  type retval;

  retval = do_smth();
  if (retval != OK) { return retval; }

  retval = do_smth2();
  if (retval != OK) { return retval; }

  retval = do_smth3();

  return retval;
}

我通常的解決方案是對multiple return規(guī)則做一個永久的MISRA-C偏差,并在使代碼更可讀的情況下允許它,就像在本例中一樣。

否則,第二個最好的選擇可能是舊的“on error goto”——禁止goto的規(guī)則在MISRA-C:2012中被放寬了,所以現(xiàn)在只是建議性的。

  retval = do_smth();
  if (retval != OK) { goto error; }

  retval = do_smth2();
  if (retval != OK) { goto error; }

  retval = do_smth3();
  if (retval != OK) { goto error; }

  goto everything_ok;

  error:
    /* error handling */

  everything_ok:

如果以上兩種形式都不適用,因為您是super-strict和MISRA-C一起使用的,那么第三個選項可能是這樣的,我相信它是100%MISRA-C兼容的:

typedef type do_stuff_t (void);

do_stuff_t* const do_stuff[N] = { do_smth, do_smth2, do_smth3 };
type retval = OK;

for(uint32_t i=0u; (i<N) && (retval==OK); i++)
{
  retval = do_stuff[i]();
}

我的觀點是do{}while(0u);不是迭代語句。

C語言不適合你。

1) 從C17開始:

6.8.5迭代語句

Syntax

iteration-statement:
while ( expression ) statement
do statement while ( expression ) ;

主站蜘蛛池模板: 无码精品人妻一区| 老熟妇仑乱视频一区二区| 无码精品久久一区二区三区| 精品一区狼人国产在线| 69久久精品无码一区二区| 2018高清国产一区二区三区| 亚洲制服丝袜一区二区三区| 欧美激情一区二区三区成人| 国精产品一区一区三区MBA下载| 国产精品一区二区三区高清在线| 波多野结衣在线观看一区| 国产午夜精品一区理论片飘花 | 亚洲一区二区视频在线观看 | 无码囯产精品一区二区免费| 无码av免费毛片一区二区| 国产精品成人99一区无码| 国产亚洲一区二区精品| 国产在线一区二区视频| 久久精品国产一区| 国模大胆一区二区三区| 久久91精品国产一区二区| 国产91精品一区| 波多野结衣一区二区三区| 国产精品高清一区二区三区| 正在播放国产一区| 日韩精品无码中文字幕一区二区 | 精品人妻一区二区三区四区| 亚欧在线精品免费观看一区| 国产午夜精品一区二区| 国产一区二区精品久久岳√| 亚洲一区二区三区高清视频| 亚洲熟妇av一区二区三区漫画| 日韩一区二区三区视频久久| 中文字幕乱码人妻一区二区三区| 久久精品道一区二区三区| 国产亚洲无线码一区二区| 亚洲日本一区二区| 97se色综合一区二区二区| 无码丰满熟妇一区二区| 色窝窝免费一区二区三区| 国产日韩精品一区二区在线观看|