V6013. Comparison of arrays, strings, collections by reference. Possibly an equality comparison was intended.


Анализатор обнаружил ситуацию, когда строки/массивы/коллекции сравниваются через оператор '=='. Скорее всего подразумевалось сравнение содержимого, а на самом деле происходит непосредственное сравнение ссылок на объекты.

Рассмотрим пример некорректного сравнения строк:

if (str1 == "example") {}
if (str1 == str2) {}

В рассматриваемых случаях, если содержимое 'str1' и 'str2' будет совпадать и равно "example", то условия будут ложными, так как оператор '==' сравнивает адреса объектов, а не содержимое строк. Если необходимо сравнивать строки по содержимому, то корректный вариант кода примет следующий вид:

if (str1.equals("example")) {}
if (str1.equals(str2)) {}

Рассмотрим пример некорректного сравнения массивов:

int[] a = ...;
int[] b = ...;
...
if (a.equals(b)) { ... }

Для массивов вызов метода 'equals' тоже самое, что и оператор '=='. Сравниваются адреса объектов, а не содержимое. Для того, чтобы сравнивать массивы по содержимому, необходимо код переписать следующим образом:

if (Arrays.equals(a ,b){ ... }

С коллекциями оператор '==' ведет себя также, как с массивами и строками.


Найденные ошибки

Проверено проектов
363
Собрано ошибок
13 495

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;