2012-04-25 156 views
6

我想要做的是從類型double或float找到所有顯式類型轉換爲我有的某些源文件中的任何其他類型。有沒有內置的gcc方式來做到這一點? 語言爲C. 謝謝!有沒有辦法讓gcc或clang警告顯式演員?

+2

也許我只是簡單的,但不能你只是搜索'(雙)'或'(float)'在你的源代碼中? – 2012-04-25 15:27:19

+0

@RobertHarvey對不起,我把它改編得更有意義。我想要捕獲所有從float/double類型到其他類型的所有顯式類型轉換,所以我可以搜索(int)等等,但是我無法判斷它們是float還是double。 – Chris 2012-04-25 15:29:52

+1

只是一個想法(我不知道C++或如果它甚至可能):覆蓋鑄造操作符的雙和浮動發出編譯失敗並編譯爲C++ :) – pmg 2012-04-25 15:33:22

回答

2

由於鑄件是明確的法律,並執行怪異的轉換以正確的方式,這是極不可能的,GCC將包含一個選項,以警告他們

相反,這取決於你的來源是如何巨大,你也許能以逃避:

grep '\(double|float\) ' * 

給你所有的雙重或浮動變量。由於c不是一種常規語言,因此使用shell工具將其解析爲雙精度或浮點變量列表並不容易,但是如果源足夠小,手動操作就很容易。

grep '([^()]*)[()]*\(your list of variable names\)' * 

從那裏會告訴你很多你的演員。

2

-Wconversion警告上述可能改變的值(double大類型),以及關於-Wno-sign-conversion符號和無符號整數之間的轉換禁用警告的隱式轉換(所以會有較少不必要的警告)。否則我看不出有什麼標準替代...

最壞的情況下,你可以尋找那些關鍵字直接到源文件...

+1

從我所瞭解的情況來看,明確的轉換不會被「轉換」所捕獲,實際上它們是擺脫警告的一種方式。我做了一些測試,發現這也是真實的,所以我需要找到其他方法來做到這一點。 – Chris 2012-04-25 15:31:06

+0

不幸的是,他們顯示(至少是當我嘗試了幾個月後)。我已啓用'-Wconversion'來捕捉_accidential_轉換,並且顯式(和預期)轉換所產生的噪音量是無法忍受的。 – Damon 2012-04-25 16:10:21

0

嗯,我覺得沒有這樣的選項。畢竟,編譯器會發出警告,以警告您可能無意中做的事情。然而,明確的轉換基本上是一種告訴編譯器「閉嘴,我知道我在做什麼」的方法。

+0

這不是浮動或雙打,我擔心,它是從浮動和雙打到其他任何東西。我爲所有演員創建了一個列表,但是我需要從列表中提取只有浮動或雙打的變量名稱,這些名稱我很難做到。 – Chris 2012-04-25 15:49:02

+0

哪種類型的演員在這裏有問題?如果他們有問題,爲什麼他們最終在代碼中排名第一? – 2012-04-25 15:53:16

+1

@cli_hlt:存在錯誤的代碼,你知道,需要修復的更好:) – 2012-04-25 16:04:56

6

如果您的C代碼也可以在C++模式下編譯,您可以使用g ++的-Wold-style-cast警告標誌來觸發所有這些類型轉換的警告。

您可以確定Clang是否有任何警告,它會通過使用其-Weverything開關觸發特定的編碼模式(但請注意,這對幾乎任何其他用途都沒有用處 - clang默認禁用了警告在各種形式的合法代碼上)。但是,在這種情況下,鏗鏘聲並沒有任何觸發此類演員的警告。

0

雖然我知道,編譯器不具有該選項,金培爾的FlexeLint可以做你想做什麼:

$ cat tst.c 
int main (void) 
{ 
    int i = 0, j = 0; 
    float f = 0.0; 
    double d = 0.0; 

    i = (int) f; 
    j = (int) d; 
    d = (double) f; 
    f = (float) d; 
    i = (int)j; 
    j = (unsigned) i; 
    return (int) j; 
} 

$ flexelint -w1 +e922 tst.c 
FlexeLint for C/C++ (Unix) Vers. 9.00j, Copyright Gimpel Software 1985-2012 

--- Module: tst.c (C) 
       _ 
    i = (int) f; 
tst.c 7 Note 922: cast from float to int 
       _ 
    j = (int) d; 
tst.c 8 Note 922: cast from double to int 
        _ 
    d = (double) f; 
tst.c 9 Note 922: cast from float to double 
       _ 
    f = (float) d; 
tst.c 10 Note 922: cast from double to float 

shell returned 4 
相關問題