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