原創(chuàng)|行業(yè)資訊|編輯:鄭恭琳|2020-08-26 16:24:00.403|閱讀 567 次
概述:PC-lint Plus為MISRA C 2004編碼指南提供了實(shí)質(zhì)性支持。通過(guò)將對(duì)au-misra2.lnt文件(隨PC-lint Plus分發(fā))的引用添加到PC-lint Plus配置文件中,可以輕松完成對(duì)MISRA C 2004兼容性的檢查。該文件啟用與MISRA C 2004指南相對(duì)應(yīng)的消息,并將文本添加到已發(fā)出的消息中,以指定與每個(gè)適用消息相關(guān)的規(guī)則。au-misra2.lnt文件是使用標(biāo)準(zhǔn)PC-lint Plus選項(xiàng)語(yǔ)法的,易于閱讀的純文本配置文件,可以輕松地對(duì)其進(jìn)行修改以滿足任何單個(gè)項(xiàng)目的需求。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
PC-lint Plus為MISRA C 2004編碼指南提供了實(shí)質(zhì)性支持。通過(guò)將對(duì)au-misra2.lnt文件(隨PC-lint Plus分發(fā))的引用添加到PC-lint Plus配置文件中,可以輕松完成對(duì)MISRA C 2004兼容性的檢查。該文件啟用與MISRA C 2004指南相對(duì)應(yīng)的消息,并將文本添加到已發(fā)出的消息中,以指定與每個(gè)適用消息相關(guān)的規(guī)則。au-misra2.lnt文件是使用標(biāo)準(zhǔn)PC-lint Plus選項(xiàng)語(yǔ)法的,易于閱讀的純文本配置文件,可以輕松地對(duì)其進(jìn)行修改以滿足任何單個(gè)項(xiàng)目的需求。PC-lint Plus隨附的參考手冊(cè)包括一個(gè)支持矩陣,詳細(xì)列出了每個(gè)指南的支持級(jí)別以及每個(gè)指南的支持機(jī)制。
考慮以下示例,其中包含許多MISRA C 2004違規(guī):
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; }
當(dāng)使用PC-lint Plus分析此示例時(shí),報(bào)告的MISRA C 2004違規(guī)包括(其中包括):
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) {
報(bào)告的每項(xiàng)違規(guī)都包括發(fā)生違規(guī)的位置、消息號(hào)和基本問(wèn)題的文字描述,以及違反的MISRA C 2004規(guī)則。例如,在消息中:
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消息號(hào),此消息的文本為“正文應(yīng)為復(fù)合語(yǔ)句”。違反的MISRA規(guī)則包含在消息文本末尾的方括號(hào)中。接下來(lái)的兩行顯示了與消息關(guān)聯(lián)的上下文和位置。
《PC-lint Plus參考手冊(cè)》包含每條消息的說(shuō)明,并經(jīng)常提供可用于解決問(wèn)題的其他指導(dǎo)。此信息也可以顯示在命令行上。例如,要顯示消息818的描述,請(qǐng)使用選項(xiàng)-help=818運(yùn)行PC-lint Plus,以使PC-lint Plus顯示以下內(nèi)容:
舉個(gè)例子:
int f( int *p ) { return *p; }
可以重新聲明為:
int f( const int *p ) { return *p; }
將參數(shù)聲明為const指針可提供僅指針沒(méi)有的優(yōu)點(diǎn)。特別是,您可以將const數(shù)據(jù)項(xiàng)的地址傳遞給此類參數(shù)。
此外,它可以提供更好的文檔。消息952、953、954和1764中介紹了可將const添加到聲明中的其他情況。
有關(guān)指定規(guī)則的信息,請(qǐng)查閱MISRA C 2004指南文檔。
重寫上面的calc函數(shù)以解決所報(bào)告的違規(guī)的一種方法是:
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; }
偏差是源代碼中的實(shí)例,其中已檢查違反規(guī)則并認(rèn)為可以接受。MISRA C 2004文檔包含咨詢和必需的規(guī)則。與必要規(guī)則的偏離通常涉及正式的批準(zhǔn)流程,而與咨詢規(guī)則的偏離則可能沒(méi)有。雖然偏差過(guò)程的細(xì)節(jié)因項(xiàng)目而異,但是可以使用非常靈活的抑制機(jī)制在PC-lint Plus中配置偏差。當(dāng)引用特定的符號(hào)或類型時(shí),或在特定的行上時(shí),可以通過(guò)多種方式來(lái)抑制大多數(shù)消息,例如在文件、函數(shù)或語(yǔ)句中。某些類型的抑制在源代碼中以特殊注釋的形式表示,但大多數(shù)不是。
例如,MISRA 2004 Rule 16.7(上面由消息818報(bào)告)是一種咨詢規(guī)則,建議在可能時(shí)將指針參數(shù)聲明為指向const的指針。可以使用選項(xiàng)-efunc(818,calc)抑制函數(shù)calc的此消息,該選項(xiàng)可以作為特殊注釋放置在項(xiàng)目配置文件或源代碼中。可以以相同的方式抑制來(lái)自此功能內(nèi)的其他消息。評(píng)論可以遵循抑制選項(xiàng),其中可能包括基本原理或形式偏差信息。
PC-lint Plus區(qū)分庫(kù)代碼(默認(rèn)情況下包括外部和系統(tǒng)頭,但可以自定義以包括頭和模塊的任何子集)和項(xiàng)目代碼。默認(rèn)情況下,PC-lint Plus將同時(shí)檢查庫(kù)代碼和項(xiàng)目代碼是否符合MISRA C2004。通常希望將檢查范圍限制為項(xiàng)目代碼,這很容易在引用au-misra3.lnt文件后,通過(guò)使用選項(xiàng)-wlib=4 -wlib=1來(lái)重置庫(kù)警告級(jí)別來(lái)完成。也可以使用-elib和+elib選項(xiàng)輕松地為庫(kù)代碼啟用或禁用單個(gè)消息。
相關(guān)推薦:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn