原創|行業資訊|編輯:鄭恭琳|2020-08-27 10:30:42.720|閱讀 606 次
概述:PC-lint Plus 1.3支持許多CERT C的靜態可執行準則。通過在現有配置中添加對au-certc.lnt文件(隨PC-lint Plus分發)的引用,可以輕松實現對CERT C的檢查。該文件啟用與CERT C準則相對應的消息,并將文本添加到已發布的消息中,以指定與每個適用消息關聯的規則。au-certc.lnt文件是使用標準PC-lint Plus選項語法的,易于閱讀的純文本配置文件,可以輕松地對其進行修改以滿足任何單個項目的需求。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
PC-lint Plus 1.3支持許多CERT C的靜態可執行準則。通過在現有配置中添加對au-certc.lnt文件(隨PC-lint Plus分發)的引用,可以輕松實現對CERT C的檢查。該文件啟用與CERT C準則相對應的消息,并將文本添加到已發布的消息中,以指定與每個適用消息關聯的規則。au-certc.lnt文件是使用標準PC-lint Plus選項語法的,易于閱讀的純文本配置文件,可以輕松地對其進行修改以滿足任何單個項目的需求。
PC-lint Plus隨附的參考手冊包括一個支持矩陣,詳細列出了每個指南的支持級別以及每個指南的支持機制。
考慮以下示例:
#include <stdio.h> extern void logger(const char *); #define LOG(x) logger(#x) void copy(FILE *fp_in, FILE *fp_out, int count) { char buf[100]; int bytes = 0; while (bytes < count) { int bytes_read = fread(buf, 1, 100, fp_in); if (!bytes_read) { break; } fwrite(buf, 1, bytes_read, fp_in); LOG(bytes = bytes + bytes_read); } }
當使用PC-lint Plus分析此示例時,報告的CERTC違規包括(其中包括):
warning 2479: attempt to perform write operation on stream after read without
an intervening reposition [CERT C Rule FIO39-C]
fwrite(buf, 1, bytes_read, fp_in);
^
supplemental 831: stream was read here
int bytes_read = fread(buf, 1, 100, fp_in);
^
note 901: variable 'buf' of type 'char [100]' not initialized by definition
[CERT C Rule EXP33-C]
char buf[100];
^
warning 2666: expression with side effects passed to unexpanded parameter 1 of
macro 'LOG': parameter is only used with #/## operators [CERT C Rule PRE31-C]
LOG(bytes = bytes + bytes_read);
^
報告的每個違規都包括發生違規的位置、消息號和有關基本問題的文字描述,以及違反的CERT C規則。
《PC-lint Plus參考手冊》包含每條消息的說明,并經常提供可用于解決問題的其他指導。此信息也可以顯示在命令行上。例如,要顯示消息2666的描述,請運行帶有選項-help=2666的PC-lint Plus,以使PC-lint Plus顯示以下內容:
當調用類似函數的宏并帶有一個參數時發出此消息,該參數看起來好像在進行評估時會產生副作用,但是由于相應的參數未在宏定義中擴展,因此不會發生副作用。例如:
#define DEBUG_VAL(x) int process(int i) { DEBUG_VAL(++i); // 2666 - increment doesn't occur /* ... */ return i; }
由于未擴展參數,因此不會評估++i,并且不會發生增量,這可能是意外的。如果意圖是不管宏如何定義都發生副作用,則應將引起副作用的表達式放在宏調用之外。就此消息而言,任何看起來包含函數調用的表達式都被認為具有副作用。
詳細信息是“擴展中未引用參數”或“僅與#/##運算符一起使用參數”之一。可以使用-estring基于detail參數的值來禁止顯示該消息。
可以查閱CERT C準則文檔以獲取有關指定規則的信息。
2666標識的問題是一個錯誤,應通過將分配移至LOG宏的調用之外來進行糾正。
2479識別的問題不僅是違反規則,而且是錯誤,該文件指針被意外地用于讀取和寫入同一文件,這導致了未定義的行為,因為沒有中間的重新定位操作。解決方案是在對fwrite的調用中將fp_in更改為fp_out。
向buf添加一個初始化程序:
char buf[100] = {0};
解決了901報告的問題(并將阻止在以后的運行中發布901)。
偏差是指源代碼中違反規則的情況被視為可接受的實例。雖然偏差過程因項目而異,但可以使用非常靈活的抑制機制在PC-lint Plus中配置偏差。當引用特定的符號或類型時,或在特定的行上時,可以通過多種方式來抑制大多數消息,例如在文件,函數或語句中。某些類型的禁止操作要求在源代碼中添加注釋,但大多數不需要。
例如,消息901報告了違反CERT C規則EXP33-C(建議在變量的定義中初始化變量)的情況,該消息始終在消息中包含變量的名稱。要為名為buf的變量抑制消息901,可以使用選項-esym(901,buf)。要在函數副本內的任何位置禁止顯示該消息,可以使用選項-efunc(901,copy)。適當的抑制選項將添加到項目的配置文件中,或在源代碼中包含問題定義的棉絨注釋中。評論可以遵循此選項,也許帶有與正式偏離政策相關的信息,例如-esym(901,buf)“EXP33-C的偏差”。
PC-lint Plus區分庫代碼(默認情況下包括外部和系統頭,但可以自定義以包括頭和模塊的任何子集)和項目代碼。默認情況下,PC-lint Plus會同時檢查庫代碼和項目代碼是否符合CERTC。通常希望將檢查范圍限制為項目代碼,這很容易在引用au-misra3.lnt文件后,通過使用選項-wlib=4 -wlib=1來重置庫警告級別來完成。也可以使用-elib和+elib選項輕松地為庫代碼啟用或禁用單個消息。
相關推薦:
《PC-lint Plus參考手冊》中涉及SEI版權材料和PC-lint Plus配置文件以進行SEI CERT C檢查的章節包含“SEI CERT C編碼標準維基”的部分內容,版權所有©1995-2018卡內基梅隆大學,并經其軟件特別許可工程學院。卡內基梅隆大學或其軟件工程學院未曾審查或認可過上述材料以及由Gimpel Software LLC生產或出版的任何其他材料。有關更多信息,請參見《PC-lint Plus參考手冊》中的“致謝”一章。
®CERT是卡耐基梅隆大學的注冊商標
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn