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