2013-02-11 44 views
2

我有一個strcpy命令的例子,似乎是緩衝區溢出的風險,但PVS-Studio不會引發警告。在我的示例中,strcpy用於將命令行參數複製到緩衝區中,而不檢查命令行參數的大小。如果參數超過緩衝區的大小,這可能會導致緩衝區溢出。爲什麼一些靜態分析工具不報告潛在的緩衝區溢出?

代碼例如:

char carg1[13]; 
int main(int argc, char* argv[]) 
{ 
// Get name from the 1st command line arg 
     strcpy(carg1, argv[1]); 
… 
} 

的argv的大小[1]爲應對成carg1之前不作檢查。這不應該引發警告嗎?

回答

3

從理論上講,構建一個完美的靜態分析工具是不可能的(這從結果中可以看出,像暫停問題的不確定性)。因此,所有的靜態分析工具都是最好的啓發式方法,可以嘗試檢測某些類別的錯誤,即使這樣也不一定能檢測到所有這些錯誤。

所以是的,你得到的代碼看起來像它有一個潛在的緩衝區溢出。我真的不知道爲什麼這個特定的工具無法檢測到這個錯誤,但我的猜測是分析儀由於某種原因使用的內部啓發式方法未能檢測到它。

希望這會有所幫助!

+0

實際上,它_is_可以構建一個工具,檢測程序中所有可能的錯誤。只需以非常令人失望的方式簡單地將所有指示標記爲可能存在問題的指示符合該法案。 你不能寫的是一個既正確又完整的分析儀,即。只檢測真正的錯誤,只有那些。爲了克服這種不可能性,靜態分析器在正確的標記(標記所有可能的錯誤,但是在一些代碼上發出潛在的大量虛假警報)或不健全(即,缺少一些錯誤)之間作出選擇。第二類更廣泛。 – byako 2013-02-12 23:13:58

+0

@ BorisYakobowski-絕對。我是在健全的假設下運作的,這在回想起來可能不是很好。感謝您的補充! – templatetypedef 2013-02-13 00:21:26

1

有3個事實:

1)如果你使用Visual C++編譯器,那麼你將收到編譯器警告4996.

1> robust.cpp(529):警告C4996: 'strcpy的':這函數或變量可能不安全。考慮使用strcpy_s代替。要禁用棄用,請使用_CRT_SECURE_NO_WARNINGS。詳細信息請參見在線幫助。 1)> C:\ Program Files文件(x86)\ Microsoft Visual Studio 11.0 \ VC \ include \ string.h(110):參見'strcpy'聲明

2)PVS-Studio最初只使用Visual Studio。

3)PVS-Studio策略是實現不是重複編譯器警告的診斷規則。

因此,PVS不檢查已經被Microsoft編譯器檢查了很長一段時間(來自VS2005)的情況是合乎邏輯的。

更新時間: 最後PVS實現這樣的診斷規則: https://www.viva64.com/en/w/V755/print/