原創|行業資訊|編輯:鄭恭琳|2020-08-26 16:10:44.533|閱讀 781 次
概述:PC-lint Plus提供對MISRA C++編碼準則的支持。通過將對au-misra-cpp.lnt文件(隨PC-lint Plus分發)的引用添加到PC-lint Plus配置中,可以輕松完成對MISRA C++兼容性的檢查。該文件啟用與MISRA C++準則相對應的消息,并將文本添加到已發布的消息中,以指定與每個適用消息相關的規則。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
PC-lint Plus提供對MISRA C++編碼準則的支持。通過將對au-misra-cpp.lnt文件(隨PC-lint Plus分發)的引用添加到PC-lint Plus配置中,可以輕松完成對MISRA C++兼容性的檢查。該文件啟用與MISRA C++準則相對應的消息,并將文本添加到已發布的消息中,以指定與每個適用消息相關的規則。 au-misra-cpp.lnt文件是使用標準PC-lint Plus選項語法的,易于閱讀的純文本配置文件,可以輕松地對其進行修改以滿足任何單個項目的需求。
PC-lint Plus隨附的參考手冊包括一個支持矩陣,詳細列出了每個指南的支持級別以及每個指南的支持機制。
考慮下面的示例,其中包含一些MISRA C++違規:
#includetypedef short int16_t; namespace Grid { class Point { public: Point(int16_t x, int16_t y) : x(x), y(y) { } int16_t xCoord() const { return x; } int16_t yCoord() const { return y; } int16_t originGridDistance() { return abs(x) + abs(y); } private: int16_t x; int16_t y; }; }
當使用PC-lint Plus分析此示例時,報告的MISRA C++違規行為包括:
1762: member function 'Grid::Point::originGridDistance' could be made const [MISRA C++ Rule 9-3-3]
int16_t originGridDistance() {
^
9114: implicit conversion of underlying type of integer cvalue expression from
'int' to 'int16_t' (aka 'short') [MISRA C++ Rule 5-0-3]
return abs(x) + abs(y);
^ ~~~~~~~~~~~~~~~
9119: implicit conversion of integer to smaller underlying type ('int' to
'int16_t' (aka 'short')) [MISRA C++ Rule 5-0-6]
return abs(x) + abs(y);
^~~~~~~~~~~~~~~
952: parameter 'x' of function 'Grid::Point::Point(int16_t, int16_t)' could be
const [MISRA C++ Rule 7-1-1]
Point(int16_t x, int16_t y) : x(x), y(y) { }
^
952: parameter 'y' of function 'Grid::Point::Point(int16_t, int16_t)' could be
const [MISRA C++ Rule 7-1-1]
Point(int16_t x, int16_t y) : x(x), y(y) { }
^
報告的每個違規都包括發生違規的位置、消息號和基本問題的文本描述,以及違反的MISRA C++規則。例如,在消息中:
1762: member function 'Grid::Point::originGridDistance' could be made const [MISRA C++ Rule 9-3-3]
int16_t originGridDistance() {
^
1762是PC-lint Plus消息號,該消息的文本為“可以將成員函數Grid::Point::originGridDistance’設為const”。違反的MISRA規則包含在消息文本末尾的方括號中。接下來的兩行顯示了與消息關聯的上下文和位置。
《PC-lint Plus參考手冊》包含每條消息的說明,并經常提供可用于解決問題的其他指導。此信息也可以顯示在命令行上。例如,要顯示消息1762的描述,請運行帶有選項-help=1762的PC-lint Plus,以使PC-lint Plus顯示以下內容:
The indicated (non-static) member function did not modify member data
and did not call non-const functions. Moreover, it does not make any
deep modification to the class member. A modification is considered deep
if it modifies information indirectly through a class member pointer.
Therefore, it could and probably should be declared as a const member
function.
(指示的(非靜態)成員函數未修改成員數據,也未調用非const函數。而且,它不會對類成員進行任何深度修改。如果修改通過類成員指針間接修改信息,則認為修改很深。因此,它可以并且很可能應該聲明為const成員函數。)
有關指定規則的信息,請查閱MISRA C++準則文檔。
重寫上面的示例以解決所報告的違規行為的一種方法是:
namespace Grid { class Point { public: Point(const int16_t x, const int16_t y) : x(x), y(y) { } int16_t xCoord() const { return x; } int16_t yCoord() const { return y; } int16_t originGridDistance() const { return static_cast(abs(x)) + static_cast (abs(y)); } private: int16_t x; int16_t y; }; }
偏差是源代碼中的實例,其中已檢查違反規則并認為可以接受。MISRA C++文檔包含咨詢和必需的規則。與必要規則的偏離通常涉及正式的批準流程,而與咨詢規則的偏離則可能沒有。雖然偏差過程的細節因項目而異,但是可以使用非常靈活的抑制機制在PC-lint Plus中配置偏差。當引用特定的符號或類型時,或在特定的行上時,可以通過多種方式來抑制大多數消息,例如在文件、函數或語句中。某些類型的禁止操作要求在源代碼中添加注釋,但大多數不需要。
例如,MISRA C++ Rule 9-3-3(上面由消息1762報告)是規定成員函數的必需規則,成員函數在可能的情況下必須為const。可以使用選項-efunc(1762,Grid::Point::originGridDistance)將函數calc的此消息禁止顯示,該選項可以作為項目注釋添加在項目配置文件或源代碼中。其他消息可以用相同的方式在此函數中被抑制。評論可以遵循抑制選項,其中可能包括基本原理或形式偏差信息。
PC-lint Plus區分庫代碼(默認情況下包括外部和系統頭,但可以自定義以包括頭和模塊的任何子集)和項目代碼。默認情況下,PC-lint Plus將檢查庫代碼和項目代碼是否符合MISRA C++。通常希望將檢查范圍限制為項目代碼,這很容易在引用au-misra3.lnt文件后,通過使用選項-wlib=4 -wlib=1來重置庫警告級別來完成。也可以使用-elib和+elib選項輕松地為庫代碼啟用或禁用單個消息。
相關推薦:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn