有没有什么方法可以在编译时捕获并警告冗余?
如
if (abc && abc)
或
if (def || def)
好吧,这实际上并不是从优化的角度来看 - 我正在考虑更多的代码错误 - 所以当编码器打算写
if (abc && abc)
实际上他们打算写
if (abc && def)
编译器会默默地优化错误,而我实际上想知道是否可以让编译器在发生这种情况时警告我,以防错误地在那里!
答案 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:
...