
Inline adoc files when they are included exactly once. Also fix language tags because this inlining gives us better information on what language the code is written in.
100 lines
2.7 KiB
Plaintext
100 lines
2.7 KiB
Plaintext
== Why is this an issue?
|
|
|
|
It is equivalent to use the equality ``++==++`` operator and the ``++equals++`` method to compare two objects if the ``++equals++`` method inherited from ``++Object++`` has not been overridden. In this case both checks compare the object references.
|
|
|
|
|
|
But as soon as ``++equals++`` is overridden, two objects not having the same reference but having the same value can be equal. This rule spots suspicious uses of ``++==++`` and ``++!=++`` operators on objects whose ``++equals++`` methods are overridden.
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,java]
|
|
----
|
|
String firstName = getFirstName(); // String overrides equals
|
|
String lastName = getLastName();
|
|
|
|
if (firstName == lastName) { ... }; // Non-compliant; false even if the strings have the same value
|
|
----
|
|
|
|
=== Compliant solution
|
|
|
|
[source,java]
|
|
----
|
|
String firstName = getFirstName();
|
|
String lastName = getLastName();
|
|
|
|
if (firstName != null && firstName.equals(lastName)) { ... };
|
|
----
|
|
|
|
=== Exceptions
|
|
|
|
Comparing two instances of the ``++Class++`` object will not raise an issue:
|
|
|
|
[source,java]
|
|
----
|
|
Class c;
|
|
if(c == Integer.class) { // No issue raised
|
|
}
|
|
----
|
|
|
|
Comparing ``++Enum++`` will not raise an issue:
|
|
|
|
[source,java]
|
|
----
|
|
public enum Fruit {
|
|
APPLE, BANANA, GRAPE
|
|
}
|
|
public boolean isFruitGrape(Fruit candidateFruit) {
|
|
return candidateFruit == Fruit.GRAPE; // it's recommended to activate S4551 to enforce comparison of Enums using ==
|
|
}
|
|
----
|
|
|
|
Comparing with ``++final++`` reference will not raise an issue:
|
|
|
|
[source,java]
|
|
----
|
|
private static final Type DEFAULT = new Type();
|
|
|
|
void foo(Type other) {
|
|
if (other == DEFAULT) { // Compliant
|
|
//...
|
|
}
|
|
}
|
|
----
|
|
|
|
Comparing with ``++this++`` will not raise an issue:
|
|
|
|
|
|
[source,java]
|
|
----
|
|
public boolean equals(Object other) {
|
|
if (this == other) { // Compliant
|
|
return false;
|
|
}
|
|
}
|
|
----
|
|
|
|
Comparing with ``++java.lang.String++`` and boxed types ``++java.lang.Integer++``, ... will not raise an issue.
|
|
|
|
== Resources
|
|
|
|
* S4973 - Strings and Boxed types should be compared using "equals()"
|
|
* https://cwe.mitre.org/data/definitions/595[MITRE, CWE-595] - Comparison of Object References Instead of Object Contents
|
|
* https://cwe.mitre.org/data/definitions/597[MITRE, CWE-597] - Use of Wrong Operator in String Comparison
|
|
* https://wiki.sei.cmu.edu/confluence/x/UjdGBQ[CERT, EXP03-J.] - Do not use the equality operators when comparing values of boxed primitives
|
|
* https://wiki.sei.cmu.edu/confluence/x/yDdGBQ[CERT, EXP50-J.] - Do not confuse abstract object equality with reference equality
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
include::../message.adoc[]
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::../comments-and-links.adoc[]
|
|
endif::env-github,rspecator-view[]
|