我可以在编译时检测(并警告)冗余吗?

时间:2010-05-18 14:25:35

标签: c++

有没有什么方法可以在编译时捕获并警告冗余?

if (abc && abc)

if (def || def)

好吧,这实际上并不是从优化的角度来看 - 我正在考虑更多的代码错误 - 所以当编码器打算写

if (abc && abc)

实际上他们打算写

if (abc && def)

编译器会默默地优化错误,而我实际上想知道是否可以让编译器在发生这种情况时警告我,以防错误地在那里!

4 个答案:

答案 0 :(得分:5)

首先,技术上不是重言式,而是冗余。重言式意味着它总是如此,例如

if (abc || !abc)

为了捕捉它们 - 你不需要做任何事情,任何值得它的编译器都会为你优化它。但我确实希望你实际上没有这样的代码。

答案 1 :(得分:3)

如果您正在寻找一种静态检查可疑代码的工具,那么您很可能需要某种形式的lint。工业强度的lint实现检查了很多很多东西 - 我不知道它是否会检查你给出的冗余类型,但是值得一试。

答案 2 :(得分:2)

将编译器设置为最大警告级别。检查警告。

答案 3 :(得分:2)

如果在打开优化的情况下进行编译,那么一个好的编译器会为您解决这个问题。例如,使用gcc,您的第一个示例将编译为(无优化):

    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:
      ...