2010-05-18 82 views
0

有什麼方法可以在編譯時捕捉並警告冗餘?我可以在編譯時檢測(並警告)冗餘嗎?

if (abc && abc) 

if (def || def) 

好吧,這實際上不是從一個角度優化點 - 我沿着錯誤的線條思維更代碼 - 所以當編碼器打算寫

if (abc && abc) 

實際上,當他們的意思是寫

if (abc && def) 

編譯器會默默地優化掉的錯誤,而我其實是想知道如果我可以讓編譯器警告我,如果已經發生,在情況下,它在那裏因爲失誤!

+3

你經常寫這樣的代碼嗎? – 2010-05-18 14:27:15

+1

你想檢測「if(TRUE)」嗎?您是否想要檢測可簡化爲簡單表達式的表達式,這些表達式始終是真/假還是無法訪問的代碼? – 2010-05-18 14:32:32

+0

@尼爾·巴特沃斯:我認爲這些都是例子。想象一下,你有'快樂(X): - 龍(X),蒼蠅(X)'和'綠色(X): - 龍(X),而不是(橙色(X))'一條龍和蒼蠅,如果它是一條龍而不是橙色,它就是綠色的。如果你想檢查是否有快樂和綠色('快樂(X),綠色(X)'),你有龍(X),蒼蠅(X),龍(X),而不是(橙色(X))' 。但龍(X)'是重複的,如果它是純的可以忽略不計。然而寫'happy(X),green(X)'給出了更多關於我們想要檢查的信息(對於使用序言 - '',''表示'&&')。 – 2010-05-18 14:40:12

回答

3

如果你正在尋找一種工具靜態地檢查可疑代碼,你很可能需要某種形式的lint。工業強度的lint實現可以檢查很多很多事情 - 我不知道它是否會檢查你給出的冗餘類型,但值得一試。

+0

我認爲這正是我要找的。謝謝! – 2010-05-18 15:33:47

5

首先,這些技術上不是重言式,而是冗餘。語式是指它總是真實的,例如

if (abc || !abc) 

而對於抓住他們 - 你不必做任何事情,任何編譯器值得它的鹽將優化那個離開你。但我當然希望你實際上沒有這樣的代碼。

+2

如果它是一個基本類型,它可以被優化掉,但如果abc是一個定義了布爾或數字轉換運算符的對象,那麼編譯器不應該優化它,因爲如果調用兩次,則不能保證該轉換會返回相同的值。 – tloach 2010-05-18 14:32:02

+0

這是真的,謝謝。 – Tesserex 2010-05-18 14:34:31

+0

我的錯誤 - 我改變了問題 - 謝謝! – 2010-05-18 14:42:22

2

將您的編譯器設置爲最大警告級別。檢查警告。

+0

我試圖在視覺工作室 - 沒有警告出現。 – 2010-05-18 14:41:47

+0

爲什麼你會期待警告?代碼有什麼問題? (從代碼的角度) – Christian 2010-05-18 14:49:11

+0

這很明顯,爲什麼這樣的警告可能是有用的,因爲它可能不是程序員的意圖編寫這樣的代碼,並可能表示錯字或剪切和粘貼錯誤。爲了有用,編譯器可能需要區分程序員鍵入的事例和宏擴展的結果。 – 2010-05-18 14:59:33

2

如果您在開啓優化的情況下進行編譯,一個好的編譯器會爲您解決這個問題。與海灣合作委員會,例如,你的第一個例子編譯(無優化):

movl %esp, %ebp 
    subl $8, %esp 
    cmpl $0, 8(%ebp) 
    je  L2 
    cmpl $0, 8(%ebp) ; checking abc again! 
    je  L2 
     ...  
L2: 

而與優化開啓,第二次比較消失:

pushl %ebp 
    movl %esp, %ebp 
    subl $8, %esp 
    movl 8(%ebp), %eax 
    testl %eax, %eax 
    jne  L4 
    leave 
    ret 
L4: 
     ... 
+0

你聲明abc是什麼?編譯器不應該優化除基本類型以外的其他任何內容。 – tloach 2010-05-18 19:52:58