[C++] 忽略 cppcheck 產生某個特定的錯誤訊息 (如 memleak)

[C++] 忽略 cppcheck 產生某個特定的錯誤訊息 (如 memleak)

今天在寫專案的一個 C++ 程式時,用 cppcheck 檢查出一個 memory leak 的問題,

不過自己檢查過應該是沒有問題,可能是程式邏輯複雜,

因此 cppcheck 沒辦法正確判斷記憶體是否有被釋放…

但是 cppcheck 的錯誤會導致我們專案 build fail,該怎麼解決比較好呢?

 

不讓 cppcheck 去掃那個 .cpp 是一個選項,可是放過的範圍也太大了…

cppcheck 也有支援用 –suppress 指令,可以在 command line 指定要略過哪一行,

但是只要程式有修改,行數就會改變,所以這種方法不太實際…

 

找了一下,原來 cppcheck 還有支援 inline suppression 的功能,

這樣子就方便多了,也不用擔心修改程式碼造成指定行數失敗的問題~

 

下面用個例子:

int main()
{
char* p = new char[64];
printf("endn");
return 0;
}

 

這個程式很明顯有個 memory leak,就是 p 沒放掉,

用 cppcheck 也可以檢查出這個錯誤:

testuser@localhost ~ $ cppcheck testleak.cpp
Checking testleak.cpp...
[testleak.cpp:5]: (error) Memory leak: p

 

假設我們事實上在某個地方會放掉這個 p,但 cppcheck 還是警告我們有 memory leak 的話,

是可以使用 –inline-suppr 選項來啟動 inline suppression 的功能,

這樣就只要在程式的第 5 行,加上 // cppcheck-suppress memleak:

int main()
{
char* p = new char[64];
printf("endn");
// cppcheck-suppress memleak
return 0;
}

 

同時在 command line 中加上 –inline-suppr 選項,

就可以略過第 5 行原本要產生的 memleak 錯誤了:

testuser@localhost ~ $ cppcheck --inline-suppr testleak.cpp
Checking testleak.cpp...

 

至於這個 memleak 是什麼呢?

這是 cppcheck 的一個 warning ID,也就是某種錯誤的 ID,

當你想忽略掉某個錯誤時,就得找到對應的錯誤 ID,才能用 inline suppression,

那要怎麼取得 warning ID 呢?

可以用 –template 選項,加上 {id} 的話就可以看到 warning ID 了,

如下例可以看到 warning ID 是 memleak:

testuser@localhost $ cppcheck --template='{file}:{line}: {severity}: {id}: {message}' testleak.cpp
Checking testleak.cpp...
testleak.cpp:5: error: memleak: Memory leak: p

 

參考資料:

cppcheck manual

How to use cppcheck’s inline suppression filter option for C++ code?

 

(本頁面已被瀏覽過 187 次)

發表迴響

你的電子郵件位址並不會被公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料