2012-11-22 24 views
1

我正在將舊應用程序移植到64位Linux上。有很多地方long和int可以互換使用,而且源代碼相當大,所以很難通過測試來捕獲所有這些地方。我打算使用插件來靜態分析代碼並修復不安全的代碼。其中一種模式是確定不安全強​​制轉換的警告鐺

void foo(unsigned long *x){ 
    *x = *x + 1; //x is pointing to a 32-bit space 
    return; 
} 

int main(){ 
    unsigned int x = ; 
    foo(reinterpret_cast<unsigned long*>(&x)); 
} 

我們使用gcc-4.2.1來構建我們的應用程序。即使使用-Wall和-Wextra,它也不會警告我這些類型的演員。

我試着用「一切皆有可能,但沒有成功」的鏗鏘奔跑。有沒有一個標誌在警告我這些風險明確的演員類型?如果不是,我該如何去添加一個?

回答

2

我不認爲那個鏗鏘直接警告你正在尋找的情況。但是,創建一個檢測C風格演員和/或所有用途的插件是相當簡單的。如果您有源碼樹,有一個如何在tools/clang/examples/PrintFunctionNames目錄中創建插件的示例。如果您位於倫敦地區,您可能對下週一my presentation感興趣。與static_cast

+0

感謝迪特馬爾一堆錯誤!我希望我能參加,但我不會留在附近。我會看看這個例子,並嘗試添加一條規則。 –

+0

我做了這樣的gcc -Dreinterpret_cast = static_cast myfile.cpp,這開始拋出我需要的錯誤。我很確定這對叮噹也是有用的。我會繼續併爲此添加一條規則。 –

1

您正在通過使用reinterpret_cast明確投射,因此編譯器會假定您知道自己在做什麼。否則,你會在你做任何事的任何地方發出警告。

2

那麼它自帶的一點是隻要找出最簡單的方法/替換所有reinterpret_cast和編譯 - GCC會給你無效static_cast

+0

謝謝!這似乎是可行的。我會嘗試。 –

+0

我做了這樣的gcc -Dreinterpret_cast = static_cast myfile.cpp,這開始拋出我需要的錯誤。 –