2011-09-19 40 views
3

我正在尋找將大量代碼轉換爲64位的最佳方法。有人向我建議,我研究一些靜態代碼分析工具,如cpptest來發現可移植性問題。有人對我有什麼建議可以使用嗎?或者將代碼移植到64位的有效方法?用於發現64位可移植性問題的靜態代碼分析工具?

環境:Windows,VS2008(我知道在VS「檢測64位可移植性問題」的選項,但我需要更好)。

例如:一個工具,會拿起這個明顯的類型64位可移植性錯誤。

for (int i = 0; i < 64; i++) 
{ 
    __int64 n64 = (1 << i); // Does not generate warning 
} 
+1

怎麼樣,一個_64bit便攜issue_?似乎它在移植之前已經損壞。我會更擔心'for(int i = 0; i!= 32; ++ i){unsigned long k = 1 << i; FOO(K); } - 這32個可能需要變成64,但在靜態代碼分析中很難說清楚。 – MSalters

+0

64位編譯器是一個很好的診斷工具,只要你把警告級別設置爲11 –

+0

參見http://stackoverflow.com/questions/4871267/what-static-analysis-tools-are-available -to-assist-in-porting-a-linux-app-to-64 -b/4888996#4888996 –

回答

4

嘗試PVS-工作室:http://pvs-studio.viva64.com/,它提供特定規則設置爲點64位可移植性問題

+0

我正在瀏覽那個網站,當你回答。它的建議給我的選項,但它是昂貴的... –

+4

是的,但他們有試用版可能有所幫助,我前段時間使用它,有時它真的很有用 – Mike

1

郵資-C爲C(僅)與plug-in一個可擴展的分析框架,用於檢測未定義的行爲。

我們來試試你的例子:

main(){ 
    for (int i = 0; i < 64; i++) 
    { 
    long long n64 = (1 << i); 
    } 
} 

這個插件是不是原本打算爲了短期bug的發現,所以你必須原諒窮人接口和相當嚴格的使用條件:

$ frama-c -val t.c 
... 
t.c:4:[kernel] warning: invalid shift: assert i ≥ 0 ∧ i < 32; 

條件i ≥ 0 ∧ i < 32表示在第4行應該爲要定義的移位的條件。正如你可以推斷一旦問題已經指出給你,1int類型,並且它沒有定義在此體系結構上將它移動超過32

這是你想看到的警告嗎?

再次,郵資-C僅適用於C,所以你可能只需要它的優勢,如果你要調查該項目的部分在C.

+0

是的,這是我想看到的警告,這僅僅是我們無法理解的一個問題的例子。不幸的是我們的大部分代碼都是用C++編寫的。 –