0

并非来自http://findbugs.sourceforge.net/bugDescriptions.html的所有描述对我来说都是清楚的。当然,我可以研究实现,但如果有人比我更有经验,一些解释和例子会很棒。

  • 当出现问题时,您是否有一些 UI_INHERITANCE_UNSAFE_GETRESOURCE 示例?
  • 在 BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR 我也没有看到问题。如果一种类型比另一种类型“更大”,例如 int 和 float,则结果为 float。如果它的整数和浮点数也是包装器浮点数。这就是我所期望的。
  • GC_UNRELATED_TYPES 真的有助于查找错误吗?编译器的工作不是检查是否——以给定的例子——Foo不能进入Collection<String>.
  • HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS 的意思是bla(Foo f){hashtable.put(f);}'Foo' 是不可散列的吗?FingBugs 也“看到”子类吗?
  • NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH 比 NP_ALWAYS_NULL_EXCEPTION 更“错误”?为什么有两个错误案例,还有一个 NP_NULL_ON_SOME_PATH_EXCEPTION 呢?听起来和我很相似。
  • SIO_SUPERFLUOUS_INSTANCEOF 的示例是什么?类似的东西foo(String s){if (s intenceof String) ...。这也做了一个空检查,但这不是这里的测试......
  • NN_NAKED_NOTIFY。我认为描述不清楚。不需要改变状态。如果我使用 new Object() 等待并通知我不会更改对象状态。或者状态是锁定状态?我不明白。
  • SP_SPIN_ON_FIELD。编译器会将其从循环中移出真的会发生这种情况吗?这对我来说没有意义,因为从 Thread 外部总是可以更改值。并且如果变量是volatileJVM不能缓存值。那么有什么意义呢?
  • 那就是 STCAL_STATIC_CALENDAR_INSTANCE 和 STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE 或 STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE/STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE 之间的区别?
  • 为什么 WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL 中的 XXXX.class 比 getClass() 更好?从子类调用的超类中的 getClass() 将始终从子类返回 Class 对象,我认为这很好。
  • EQ_UNUSUAL 到底是做什么的?它应该检查参数是否与类本身的类型相同,但事实并非如此?
  • 你有过休息的问题吗?SF_SWITCH_FALLTHROUGH 有真正的价值吗?对我来说听起来很强大。
  • 不知道 TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK 和 TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK 可能是什么。
4

1 回答 1

8

我可以根据我的经验和测试对您提到的一些 FindBugs 描述发表评论,而无需查阅 FindBugs 源代码。

  • UI_INHERITANCE_UNSAFE_GETRESOURCE:如果您使用this.getClass().getResource(...)相对 URI,则该 URI 将根据this. 当子类位于不同的包中并且您获得子类的资源时,您最终会看到不同的位置(相对于子类)。我知道一个类通过getResource()使用仅包含文件名的相对 URI 调用来查找已知驻留在同一包中的资源的示例。如果该类在哪里使用this.getClass()而不是ClassName.class,并且实际实例是子类的,则找不到该资源。

  • BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR:这里讨论的是盒装数字类型,比如Integerand Float,而不是原始数字类型,比如intand float。对于原语,您的期望是正确的:在boolean ? int : floatint强制为float. 但是对于包装的数字,会发生一些意想不到的事情:在boolean ? Integer : Float中,Integer被拆箱并被强制转换为float。我本来希望对象原封不动地返回,就像在 boolean ? (Number)Integer : Float.

    boolean b = Boolean.TRUE;
    final Integer i = 123456789;
    final Float f = 1.0f;
    final Number x = b ? i : f;
    System.out.println("wrapped coerced: " + x); // 1.23456792E8
    final Number y = b ? (Number) i : f;
    System.out.println("wrapped uncoerced: " + y); // 123456789
    
  • GC_UNRELATED_TYPES:FindBugs 知道一些 Java 1.5 无法通用的收集方法,例如 Collection.contains(Object). 在这里,参数必须是 type Object,否则现有的源代码可能会中断。但是任何不属于集合类型的对象肯定不会被包含,因此要求IntegerString集合中包含 an 可能是一个错误。

    Collection<String> coll = new ArrayList<String>();
    System.out.println(coll.contains(42));
    
  • HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS:?

  • NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH:?

  • SIO_SUPERFLUOUS_INSTANCEOF:?

  • NN_NAKED_NOTIFY:?

  • SP_SPIN_ON_FIELD:如果你在一个不是 的字段上旋转,volatile只要执行循环的线程产生相同的结果,JIT 就可以自由优化代码(通过将读取移出循环),而不考虑存在和其他线程的动作。这就是为什么有一个volatile关键字。我不知道这实际上会导致错误的例子。

  • STCAL_STATIC_CALENDAR_INSTANCE:?

  • WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL:在 FindBugs 示例中,该方法同步getClass()以访问其类的静态成员。子类会在子类上同步,因此超类和子类可以同时进入同步块,因为它们在不同的监视器上同步,从而导致竞争条件。

  • EQ_UNUSUAL:?

  • SF_SWITCH_FALLTHROUGH:这有时对我有帮助,因为我往往会错过 break. 有趣的是,在刚刚执行的测试用例中,除了这个 FindBugs 消息之外,我还收到了消息 SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH。

  • TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK:?

于 2010-04-16T20:21:52.677 回答