2009-12-24 54 views
3

我前幾天在C++中編寫函數,它發生在我身上,編譯器可以做更多的事情來幫助我防範錯誤。我的代碼的要領是這樣的 -是否有任何編譯時檢查C++中斷言的工具?

void method(SomeType* p) 
{ 
    assert(p != 0); 
    p->something(); 
} 

,它被稱爲像這樣

SomeType p = NULL; 
if (SomeCondition) 
{ 
    p = some_real_value; 
} 

method(p); 

顯然,這是可能的p是在運行時爲空,因此在方法聲明中失敗一個調試版本。我的錯。

然而,編譯器似乎有可能在編譯時發現這個問題,併發出警告,說它已經發現它已經發現該斷言可能被違反。

好吧,這是一個簡單的例子,編譯器根據程序的某些流程分析和跟蹤每個點處可能的變量範圍,發現指針可能爲NULL。

我知道確定是否會觸發許多斷言很難,但即使只有很少的時間,編譯器也能夠告訴我,我已經寫了代碼,可能斷言被違反了將有助於使我的節目更加安全。

我以爲這樣就可以幫助推薦喜歡關在數組索引一個錯誤太例如在一個循環內: -

assert(index >= 0 && index < array_size); 

我在想,在很多情況下,編譯器可以在證明編譯索引變量可能超出這些範圍,並在編譯時發出警告。

我意識到這對於編譯器來說通常可能做的太多工作,但也許有一些工具可以執行這種分析?我一直無法找到谷歌的任何東西,但我想知道這種類型的東西是否存在?或者是否很難做到足夠有用,或許有用?

+0

編譯器沒有辦法在編譯時知道變量的值。它只在運行時才知道。 – Drakosha 2009-12-24 10:11:57

+0

大多數靜態代碼分析工具完成大部分描述。他們確實產生大量的誤報,但他們很容易被發現/過濾掉。你在找別的東西嗎? – dirkgently 2009-12-24 10:11:58

+1

工具的可用性取決於操作系統,許可費等因素。如果您在Linux上,Valgrind是一件好事。 VS Team System帶有自己的代碼分析(使用'/ analyze'編譯器選項打開它)。 – dirkgently 2009-12-24 10:13:33

回答

6

靜態分析工具(如PC-lint)可能能夠檢測到這些問題。 http://www.gimpel.com/html/pcl.htm

對於你的第一個例子,雖然:我的風格是贊成對指針參數或返回值的引用,除非NULL是可接受的值。這消除了需要斷言參數是!= NULL。

+0

+1這兩個Gimpel Lint都是一個很好的工具,並且您的首選樣式消除了這個需求。 – 2009-12-24 10:34:19

+0

我同意,雖然這只是一個簡單的例子 – jcoder 2009-12-24 10:58:08

+0

啊靜態分析是我失蹤的搜索關鍵字。我嘗試了一切我能想到的 – jcoder 2009-12-24 10:59:15

2

執行此類檢查的工具類稱爲靜態分析。一個例子是Coverity(一種商業產品,如果你不得不問「多少」,那麼你買不起)。我不知道什麼樣的開源工具可用於相同的目的(對於C++)。

對於Java而言,FindBugs是一款優秀的靜態分析工具(不像Coverity那麼全面,但您不必抵押房屋來使用它)。

3

Boost庫有一個編譯時斷言。一個非常簡單的例子是:

#include <boost/static_assert.hpp> 
... 
BOOST_STATIC_ASSERT(1 > 0); 

升壓有一套完整的各類型的編譯時工具,但這些只能在編譯時檢測可能運行時的故障,如果你能表達測試作爲編譯時不變。

+0

雖然編譯時間有用,但編譯時間確實有所不同 – jcoder 2009-12-24 10:59:47

相關問題