我前幾天在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);
我在想,在很多情況下,編譯器可以在證明編譯索引變量可能超出這些範圍,並在編譯時發出警告。
我意識到這對於編譯器來說通常可能做的太多工作,但也許有一些工具可以執行這種分析?我一直無法找到谷歌的任何東西,但我想知道這種類型的東西是否存在?或者是否很難做到足夠有用,或許有用?
編譯器沒有辦法在編譯時知道變量的值。它只在運行時才知道。 – Drakosha 2009-12-24 10:11:57
大多數靜態代碼分析工具完成大部分描述。他們確實產生大量的誤報,但他們很容易被發現/過濾掉。你在找別的東西嗎? – dirkgently 2009-12-24 10:11:58
工具的可用性取決於操作系統,許可費等因素。如果您在Linux上,Valgrind是一件好事。 VS Team System帶有自己的代碼分析(使用'/ analyze'編譯器選項打開它)。 – dirkgently 2009-12-24 10:13:33