MISRA 14.5說不能使用continue語句。任何人都可以解釋原因嗎? 謝謝。爲什麼「繼續」在MISRA C:2004中被視爲C違規?
回答
這是因爲ancient debate about goto
,無條件分支和意大利麪條代碼,這已經持續了40年左右。 goto
,continue
,break
和多個return
陳述都被認爲差不多相同。
世界編程界的共識已大致結束了是這樣的:我們認識到,如果你知道你在做什麼,你可以使用的語言的這些功能,而無需編寫代碼的意大利麪條。但我們仍然不鼓勵他們,因爲很有可能有人不知道他們在做什麼會在可用時使用這些功能,然後創建意大利麪條。我們也勸阻他們,因爲他們是多餘的功能:你顯然可以編寫程序而不使用它們。
由於MISRA-C是旨在實現關鍵系統,MISRA-C:2004年已經禁止儘可能多的這些無條件分支部件儘可能的辦法。因此,goto
,continue
和多個退貨被禁止。只有在同一個循環內有一次中斷時才允許使用break
。
但是,在目前正在評估的「MISRA-C:2011」草案中,委員會考慮再次允許所有這些特徵,並且只允許跳轉到下一個跳轉向上。委員會的理由說,現在有工具(即靜態分析器)足夠聰明,可以發現不好的程序流程,因此可以允許關鍵字。
其中goto爭論依然強勁...
用C語言編程使得難以跟蹤多個執行分支。如果您在某處分配資源,則必須在其他地方(非本地)釋放它們。如果您的代碼分支,您通常需要爲每個分支單獨使用分配邏輯或退出範圍。
continue
聲明增加了另一種方式退出for
循環的範圍,從而使得這樣一個循環更難推理和理解控制可以通過它的所有可能的方式,這反過來使其更難確定您的代碼在所有情況下的行爲都是正確的。
這是對我而言只是猜測,但我想,試圖限制從複雜此額外分支行爲來是你提到的規則驅動的原因。
國際海事組織,如果繼續讓一個循環難以理解,那麼循環代碼太長.... –
@MitchWheat:是的。您應該遊說MISRA以添加「無長循環」規則! (但個人而言,在C++中,我發現當用一個簡單的'continue'解析輸入時,可以跳過註釋行,但C++對於「早期退出」慣用語更適合) –
毫無意義:從經驗來看,像他們這樣的編碼標準往往因爲最低的共同標準而被忽略。我在C/C++/C#中繼續使用它是一個非常好的構造。 –
與所有MISRA規則,如果你能證明它,你可以從(MISRA-C的4.3.2部分:2004)的規則偏離
MISRA(以及其他類似的指南)背後的要點是要捕捉通常會導致問題的事物......是的,continue
可以正確使用,但證據表明它是問題的常見原因。
因此,MISRA創建一個規則,以防止其(AB)的使用,以及評價社區批准的規則。用戶社區的觀點通常支持該規則。
但我重申,如果你真的想使用它,你可以把它證明你的公司的層次結構,偏離。
- 1. MISRA C 2004和c99
- 2. MISRA違規規則10.1和枚舉
- 3. 爲什麼bzr分支繼續被殺?
- 4. PC-皮棉:違反MISRA C++ 2008必需規則5-0-12
- 5. 爲什麼goto語句在C++中被視爲禁忌?
- 6. 爲什麼bool在C++中不被視爲boost :: true_type?
- 7. 爲什麼C中的轉換方法繼續失敗?
- 8. 爲什麼程序繼續?
- 9. C++訪問違規?
- 10. 爲什麼C中的嵌套函數違背C標準
- 11. 爲什麼會發生EDT違規?
- 12. 爲什麼違反FK違規的SqlException不會顯示違規值?
- 13. c + + Qt常量違規?
- 14. UITableView:cellForRowAtIndexPath繼續被稱爲
- 15. 爲什麼C#不支持多繼承?
- 16. 爲什麼C不支持繼承?
- 17. C++爲什麼繼承不起作用?
- 18. C++繼承 - 爲什麼我的函數沒有被使用?
- 19. 爲什麼C#結構不能被繼承?
- 20. 爲什麼在C++
- 21. 爲什麼在C#
- 22. 繼續在C#中像
- 23. C#爲繼續裏面的foreach
- 24. 爲什麼在C中使用%c?
- 25. 爲什麼要繼續接收java.io.FileNotFoundException:(訪問被拒絕)錯誤?
- 26. 用C++訪問違規
- 27. 爲什麼Googlebot會繼續請求「value.png」?
- 28. 爲什麼JOptionPane.getValue()繼續返回uninitializedValue
- 29. 爲什麼Nginx繼續返回301?
- 30. 爲什麼我繼續接收java.lang.StringIndexOutOfBoundsException
你問他們*他們的原因? –
與所有「永遠」和「永不」規則一樣,它們可能不值得關注。 –