原創|行業資訊|編輯:鄭恭琳|2020-08-27 10:16:21.510|閱讀 492 次
概述:自成立以來,Gimpel軟件就一直為嵌入式和安全關鍵軟件社區提供支持,而我們的工具已經為MISRA和其他相關編碼標準提供了近20年的支持。當前版本的PC-lint Plus通過引入對AUTOSAR17編碼準則的支持而建立在此跟蹤記錄的基礎上。1.3版支持將近200條準則(超過60%的靜態可檢查準則),并且在每個發行版中都添加了對其他準則的支持。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
自成立以來,Gimpel軟件就一直為嵌入式和安全關鍵軟件社區提供支持,而我們的工具已經為MISRA和其他相關編碼標準提供了近20年的支持。當前版本的PC-lint Plus通過引入對AUTOSAR17編碼準則的支持而建立在此跟蹤記錄的基礎上。1.3版支持將近200條準則(超過60%的靜態可檢查準則),并且在每個發行版中都添加了對其他準則的支持。
通過專用診斷程序支持許多準則,以確保準確分析與準則及其例外相關的細節。通過將對au-autosar.lnt文件(隨PC-lint Plus分發)的引用添加到您的現有配置中,可以很容易地完成對AUTOSAR兼容性的檢查。該文件啟用與AUTOSAR準則相對應的消息,并將文本添加到已發布的消息中,以指定與每個適用消息關聯的規則。au-autosar.lnt文件是使用標準PC-lint Plus選項語法的,易于閱讀的純文本配置文件,可以輕松地對其進行修改以滿足任何單個項目的需求。
PC-lint Plus隨附的參考手冊包括一個支持矩陣,詳細列出了每個指南的支持級別以及每個指南的支持機制。
考慮以下示例:
using int32_t = int; namespace Networking { enum class MsgType { NORMAL, SYN, ACK, ERROR, OTHER }; class CommMsg { public: CommMsg(int32_t msg_id = 0); virtual ~CommMsg(); CommMsg & operator=(const CommMsg& other) { _msg_id = other._msg_id; _payload = other._payload; _mt = other._mt; } private: int32_t _msg_id; void * _payload; MsgType _mt; }; }
當使用PC-lint Plus分析此示例時,報告的AUTOSAR違規包括(其中包括):
note 9418: enum 'Networking::MsgType' does not have an explicitly specified
underlying type [AUTOSAR Rule A7-2-2]
enum class MsgType { NORMAL, SYN, ACK, ERROR, OTHER };
^
note 9169: constructor 'Networking::CommMsg::CommMsg(int32_t)' can be used for
implicit conversions from fundamental type 'int32_t' (aka 'int') [AUTOSAR Rule A12-1-4]
CommMsg(int32_t msg_id = 0);
^
warning 1529: assignment operator 'Networking::CommMsg::operator=' should check
for self-assignment [AUTOSAR Rule A12-8-5]
CommMsg & operator=(const CommMsg& other) {
^
賦值運算符似乎并未檢查是否將變量的值賦值給它自己(賦值給它)。具體來說,PC-lint Plus正在尋找賦值運算符的第一條語句,如果它是if語句,則使用==或!=將其與&argument或std::addressof(argument)進行比較。
重要的是檢查自我分配,以便知道舊值是否應進行刪除操作。類分配器經常忽略這一點,因為分配給自己是違反直覺的。但是,通過使用別名(指針、引用、函數參數)的魔術,一個毫無戒心的程序員可能會偶然發現一個偽裝的自賦值。
如果您當前正在使用以下測試
if( arg == *this)
我們建議您將其替換為更有效的方法:
if( &arg == this || arg == *this)
有關指定規則的信息,請查閱AUTOSAR指南文檔。
在上面的示例中,將以下測試添加到CommMsg::operator=的開頭即可解決1529報告的問題(并將防止在以后的運行中發布1529):
if (this == &other) { return *this; }
偏差是指源代碼中違反規則的情況被視為可接受的實例。當針對AUTOSAR的合規性時,“必需”規則而不是“咨詢”規則必須有形式上的偏差。在這兩種情況下,都可以使用適當的抑制在PC-lint Plus中配置偏差。當引用特定的符號或類型時,或在特定的行上時,可以通過多種方式來抑制大多數消息,例如在文件,函數或語句中。某些類型的禁止操作要求在源代碼中添加注釋,但大多數不需要。
例如,消息9418報告違反了AUTOSAR規則A7-2-2(要求枚舉在其定義中明確指定基礎類型),該消息始終在消息中包含枚舉的名稱。要僅針對該定義禁止顯示消息9418,可以將-esym(9418,Networking :: MsgType)選項添加到項目的配置文件中,或在包含有問題的定義的源代碼中的lint注釋中。評論可以遵循此選項,也許帶有與正式偏離政策相關的信息,例如-esym(9418,Networking::MsgType)“A7-2-2的偏差,請參見ABC-123進行批準”。
PC-lint Plus區分庫代碼(默認情況下包括外部和系統頭,但可以自定義以包括頭和模塊的任何子集)和項目代碼。默認情況下,PC-lint Plus將檢查庫代碼和項目代碼是否符合AUTOSAR。通常希望將檢查范圍限制為項目代碼,這很容易在引用au-misra3.lnt文件后,通過使用選項-wlib=4 -wlib=1來重置庫警告級別來完成。也可以使用-elib和+elib選項輕松地為庫代碼啟用或禁用單個消息。
相關推薦:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn