[英]Is MISRA-C applicable to Linux applications
據我所知,MISRA-C標准適用於嵌入式固件 。 當嵌入式Linux是您的產品平台時,您的嵌入式應用程序可以/應該開發為符合MISRA-C嗎? 有沒有人考慮過這樣的練習?
我的一般意義是你必須先了解所有“規則”,然后在設計/編碼階段應用它們。 可能存在需要強制符合系統調用(pthread_create)和void *的情況 - 產生難看的代碼。
雖然MISRA-C最初是作為汽車和安全關鍵應用的標准而創建的,但現在已不再適用。 如今,MISRA-C更像是一種通用標准,可用於任何不希望出現錯誤,崩潰和可移植性問題的C程序。
您需要問問自己為什么使用MISRA-C。 是因為您希望將其用作編碼標准來擺脫錯誤,還是因為應用程序具有關鍵任務性質?
對於Linux案例,主要問題是如果您只有自己的代碼MISRA兼容,或者如果您要求所有庫也適用。 你無法讓Linux內核+庫符合MISRA標准,你必須從頭開始重寫Linux。
這使Linux不適用於任務關鍵型軟件。 但是,如果您的程序不具備任務關鍵性,那么您應該能夠使用Linux。 您可能需要提前寫出一些與MISRA-C相關的常設偏差,因為您可以告訴的事情會導致問題。
一句話:不。
MISRA確實提供了一些很好的指導方針,但您最好只選擇要遵守的規則(假設您已經自動檢查了構建/靜態分析)。
瀏覽MISRA-2004的內容,這里有一些問題。
使所有庫符合MISRA標准本身就是MISRA規則。
關於goto
, continue
和break
,函數返回以及指針算術的規則在內核和用戶空間代碼的數十億行中都被違反,因此很好地使您的庫(或內核)處於合規狀態。
如果使用套接字以及其他常見API,則無法遵循指針強制轉換規則。
MISRA-2004 11.2不應在指向對象的指針和除整數類型之外的任何類型,指向對象類型的另一指針或指向void的指針之間執行轉換。
2004-20.x部分禁止<errno.h>
, <stdio.h>
, <time.h>
和<signal.h>
。 如果您正在編寫長期運行的強大服務,禁止信號和錯誤檢查可以促進BAD Linux編程。
在某些地方,沒有動態內存分配是一個規則。
我知道MISRA有規則允許你違反規則,如果你記錄它們(這是真的是必需的還是只是建議 ???),但你會記錄很多例外情況,這實際上是毫無意義的。
所有這一切,如果你有一個客戶堅持MISRA合規(這是我見過它的唯一原因),你可能會記錄你所有的規則違規行為,並做一些手動波浪嘗試稱自己符合MISRA。 因此可能存在假裝在Linux上符合MISRA標准的商業案例,但我認為它幾乎沒有技術優勢。
我擔心如果你想要真正順從並且需要一個重量級/功能齊全的操作系統,你最好為QNX,GHS Integrity,VxWorks等分一杯羹。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.