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

The analyzer has detected an expression that can be simplified. In some cases, it may also mean that such an expression contains a logical error.

Here is an example of suspicious code:

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

This expression is redundant. If "n==0", the condition is always false. If "n!=0", the condition is always true. That is, the condition does not depend on the 'j' variable and therefore can be simplified:

if (n)

Sometimes such redundancy may indicate a typo. Imagine, for instance, that the condition must actually be like this one:

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

Now, the following is a more realistic example which actually caused us to implement this diagnostic:

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

Here we have both an error and redundancy. The condition must be executed if the string referred to by the 'Name' pointer is empty. An empty string can be referred to by a null pointer.

Because of a mistake, the condition will be executed whenever Name != nullptr. This is the fixed code:

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

We've got rid of the error, but we can also eliminate unnecessary check:

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

Do you make errors in the code?

Check your code
with PVS-Studio

Static code analysis
for C, C++, and C#

goto PVS-Studio;
We use cookies for the analysis of events to improve our content and make user interaction more convenient. By continuing the view of our web-pages you accept the terms of using these files. You can find out more about cookie-files and privacy policy or close the notification, by clicking on the button. Learn More →
Do not show