fb-contrib的假阳性:SEO_SUBOPTIMAL_EXPRESSION_ORDER?

时间:2017-03-09 10:35:47

标签: java findbugs sonarqube5.6

SonarQube认为以下代码违反了规则fb-contrib:SEO_SUBOPTIMAL_EXPRESSION_ORDER(注意,代码示例是简化的而不是逻辑的):

class Foo {

   boolean baz;

   boolean foo() { 
      return bar() && baz==Baz.VALUE; //Violation of fb-contrib:SEO_SUBOPTIMAL_EXPRESSION_ORDER
   }

   boolean bar() { 
      return baz == Baz.VALUE_2; 
   }

}

enum Baz {
    VALUE, VALUE2
}
  

性能 - 方法以次优方式在条件中排序表达式   (FB-的contrib:SEO_SUBOPTIMAL_EXPRESSION_ORDER)

     

此方法构建条件表达式,例如,在if或while语句中,表达式包含简单的局部变量比较,以及方法调用的比较。表达式对这些进行排序,以便方法调用在简单局部变量比较之前进行。这导致方法调用在不需要的情况下执行,因此可能导致大量代码无需执行。通过对表达式进行排序,以便首先包含局部变量条件的简单条件,可以消除这种浪费。这假设方法调用没有副作用。如果该方法确实有副作用,那么最好将这些调用拉出条件并首先执行它们,为局部变量赋值。通过这种方式,您可以提示呼叫可能有副作用。

我认为规则实现查看实际表达式是合理的,如果内容是值检查,则不会触发违规。

这是一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

你几乎已经在你的问题中给出了答案:

  

这会导致方法调用在不需要的情况下执行,因此可能导致大量代码无需执行。通过对表达式进行排序,以便首先包含局部变量条件的简单条件,可以消除这种浪费。

FB-Contrib希望你改变表达方式:

boolean foo() { 
    return baz==Baz.VALUE && bar();
}

这样,bar()只有在baz==Baz.value时才需要执行。当然这是编译器或JVM可能优化的东西,因此它将归结为微基准测试,以确定这种预防措施是否真的是必要的。

但它在语法层面上是有意义的,因为调用方法 通常比值检查更昂贵。所以你不需要查看方法来告诉它。无论如何,对编译器/ JVM的内联行为的任何猜测都可能是错误的。