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)

According to Common Weakness Enumeration, potential errors found by using this diagnostic are classified as CWE-571.

You can look at examples of errors detected by the V686 diagnostic.

Bugs Found

Checked Projects
Collected Errors
14 111
This website uses cookies and other technology to provide you a more personalized experience. By continuing the view of our web-pages you accept the terms of using these files. If you don't want your personal data to be processed, please, leave this site. Learn More →