>
>
>
V686. Pattern A || (A && ...) was detec…


V686. Pattern A || (A && ...) was detected. The expression is excessive or contains a logical error.

Анализатор обнаружил выражение, которое можно упросить. Иногда это может означать, что выражение содержит логическую ошибку.

Пример подозрительного кода:

int k,n,j;
...
if (n || (n && j))

Это выражение избыточное. Если "n==0", то условие всегда ложно. Если "n!=0", то условие всегда истинно. Таким образом, условие не зависит от значения переменной 'j' и его можно упростить:

if (n)

Иногда, избыточность означает наличие опечатки. Вдруг, например, на самом деле, условие должно быть таким:

if (k || (n && j))

Рассмотрим более реальный пример, благодаря которому и появилась эта диагностика:

const char *Name = ....;
if (Name || (Name && Name[0] == 0))

Здесь сразу есть и ошибка и избыточность. Условие должно выполняться, если строка, на которую ссылается указатель 'Name', пустая. Пустая строка может обозначаться нулевым указателем.

Из-за ошибки условие выполнится всегда, если Name != nullptr. Исправленный код:

if (!Name || (Name && Name[0] == 0))

Теперь ошибки нет. Но дополнительно можно сократить количество проверок:

if (!Name || Name[0] == 0)

Данная диагностика классифицируется как:

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V686.