原創|行業資訊|編輯:鄭恭琳|2020-08-26 16:24:00.403|閱讀 548 次
概述:PC-lint Plus為MISRA C 2004編碼指南提供了實質性支持。通過將對au-misra2.lnt文件(隨PC-lint Plus分發)的引用添加到PC-lint Plus配置文件中,可以輕松完成對MISRA C 2004兼容性的檢查。該文件啟用與MISRA C 2004指南相對應的消息,并將文本添加到已發出的消息中,以指定與每個適用消息相關的規則。au-misra2.lnt文件是使用標準PC-lint Plus選項語法的,易于閱讀的純文本配置文件,可以輕松地對其進行修改以滿足任何單個項目的需求。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
PC-lint Plus為MISRA C 2004編碼指南提供了實質性支持。通過將對au-misra2.lnt文件(隨PC-lint Plus分發)的引用添加到PC-lint Plus配置文件中,可以輕松完成對MISRA C 2004兼容性的檢查。該文件啟用與MISRA C 2004指南相對應的消息,并將文本添加到已發出的消息中,以指定與每個適用消息相關的規則。au-misra2.lnt文件是使用標準PC-lint Plus選項語法的,易于閱讀的純文本配置文件,可以輕松地對其進行修改以滿足任何單個項目的需求。PC-lint Plus隨附的參考手冊包括一個支持矩陣,詳細列出了每個指南的支持級別以及每個指南的支持機制。
考慮以下示例,其中包含許多MISRA C 2004違規:
typedef short int16_t; typedef int int32_t; typedef unsigned short uint16_t; int32_t calc(uint16_t id_1, uint16_t id_2, int16_t *idl, uint16_t idl_size); int32_t calc(uint16_t id_1, uint16_t id_2, int16_t *idl, uint16_t idl_size) { if (idl_size && id_1 < idl_size && id_2 < idl_size) return idl[id_1] * idl[id_2] + idl[id_1]; return 0; }
當使用PC-lint Plus分析此示例時,報告的MISRA C 2004違規包括(其中包括):
904: return statement before end of function 'calc' [MISRA 2004 Rule 14.7, required]
return idl[id_1] * idl[id_2] + idl[id_1];
^
9012: body should be a compound statement [MISRA 2004 Rule 14.8, required],
[MISRA 2004 Rule 14.9, required]
return idl[id_1] * idl[id_2] + idl[id_1];
^
9050: dependence placed on operator precedence (operators '&&' and '<') [MISRA
2004 Rule 12.1, advisory]
if (idl_size && id_1 < idl_size && id_2 < idl_size)
^ ~~~~
9240: right side of logical operator '&&' is not a primary expression [MISRA
2004 Rule 12.5, required]
if (idl_size && id_1 < idl_size && id_2 < idl_size)
^ ~~~~~~~~~~~~~~~
9232: expected an effectively boolean argument for operator && [MISRA 2004 Rule
12.6, advisory]
if (idl_size && id_1 < idl_size && id_2 < idl_size)
~~~~~~~~ ^
9226: integral expression of underlying type 'int16_t' (aka 'short') cannot be
implicitly converted to type 'int32_t' (aka 'int') because it is a return
expression [MISRA 2004 Rule 10.1, required]
return idl[id_1] * idl[id_2] + idl[id_1];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9050: dependence placed on operator precedence (operators '+' and '*') [MISRA
2004 Rule 12.1, advisory]
return idl[id_1] * idl[id_2] + idl[id_1];
~ ^
9264: array subscript applied to variable 'idl' declared with non-array type
'int16_t *' (aka 'short *') [MISRA 2004 Rule 17.4, required]
return idl[id_1] * idl[id_2] + idl[id_1];
^~~
818: parameter 'idl' of function 'calc(uint16_t, uint16_t, int16_t *, uint16_t)'
could be pointer to const [MISRA 2004 Rule 16.7, advisory]
int32_t calc(uint16_t id_1, uint16_t id_2, int16_t *idl, uint16_t idl_size) {
報告的每項違規都包括發生違規的位置、消息號和基本問題的文字描述,以及違反的MISRA C 2004規則。例如,在消息中:
9012: body should be a compound statement [MISRA 2004 Rule 14.8, required],
[MISRA 2004 Rule 14.9, required]
return idl[id_1] * idl[id_2] + idl[id_1];
^
9012是PC-lint Plus消息號,此消息的文本為“正文應為復合語句”。違反的MISRA規則包含在消息文本末尾的方括號中。接下來的兩行顯示了與消息關聯的上下文和位置。
《PC-lint Plus參考手冊》包含每條消息的說明,并經常提供可用于解決問題的其他指導。此信息也可以顯示在命令行上。例如,要顯示消息818的描述,請使用選項-help=818運行PC-lint Plus,以使PC-lint Plus顯示以下內容:
舉個例子:
int f( int *p ) { return *p; }
可以重新聲明為:
int f( const int *p ) { return *p; }
將參數聲明為const指針可提供僅指針沒有的優點。特別是,您可以將const數據項的地址傳遞給此類參數。
此外,它可以提供更好的文檔。消息952、953、954和1764中介紹了可將const添加到聲明中的其他情況。
有關指定規則的信息,請查閱MISRA C 2004指南文檔。
重寫上面的calc函數以解決所報告的違規的一種方法是:
int32_t calc2(uint16_t id_1, uint16_t id_2, const int16_t id_list[], uint16_t idl_size); int32_t calc2(uint16_t id_1, uint16_t id_2, const int16_t id_list[], uint16_t idl_size) { int32_t result = 0; if ((idl_size > 0U) && (id_1 < idl_size) && (id_2 < idl_size)) { result = ((int32_t)id_list[id_1] * id_list[id_2]) + id_list[id_1]; } return result; }
偏差是源代碼中的實例,其中已檢查違反規則并認為可以接受。MISRA C 2004文檔包含咨詢和必需的規則。與必要規則的偏離通常涉及正式的批準流程,而與咨詢規則的偏離則可能沒有。雖然偏差過程的細節因項目而異,但是可以使用非常靈活的抑制機制在PC-lint Plus中配置偏差。當引用特定的符號或類型時,或在特定的行上時,可以通過多種方式來抑制大多數消息,例如在文件、函數或語句中。某些類型的抑制在源代碼中以特殊注釋的形式表示,但大多數不是。
例如,MISRA 2004 Rule 16.7(上面由消息818報告)是一種咨詢規則,建議在可能時將指針參數聲明為指向const的指針。可以使用選項-efunc(818,calc)抑制函數calc的此消息,該選項可以作為特殊注釋放置在項目配置文件或源代碼中。可以以相同的方式抑制來自此功能內的其他消息。評論可以遵循抑制選項,其中可能包括基本原理或形式偏差信息。
PC-lint Plus區分庫代碼(默認情況下包括外部和系統頭,但可以自定義以包括頭和模塊的任何子集)和項目代碼。默認情況下,PC-lint Plus將同時檢查庫代碼和項目代碼是否符合MISRA C2004。通常希望將檢查范圍限制為項目代碼,這很容易在引用au-misra3.lnt文件后,通過使用選項-wlib=4 -wlib=1來重置庫警告級別來完成。也可以使用-elib和+elib選項輕松地為庫代碼啟用或禁用單個消息。
相關推薦:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn