The analyzer has detected use of a non-zero constant in the bitwise operation OR (|). The result of this expression is always a non-zero value. It may cause incorrect logic of program execution when such an expression is used in conditions or loops.
Consider a simplest example:
enum { FirstValue, SecondValue }; int Flags = GetFlags(); if (Flags | SecondValue) {...}
The expression in the 'if' operator's condition is always true. Errors related to using non-zero constants in bitwise operations occur because of misprints. For example, it may appear that another bitwise operation, for example &, should be used in such a fragment. This is the correct code:
enum { FirstValue, SecondValue }; int Flags = GetFlags(); if (Flags & SecondValue) {...}
Consider a code sample the analyzer has found in one real application:
#define PSP_HIDEHEADER 0x00000800 BOOL CResizablePageEx::NeedsRefresh(....) { if (m_psp.dwFlags | PSP_HIDEHEADER) return TRUE; ... return CResizableLayout::NeedsRefresh(layout, rectOld, rectNew); }
It's obvious that the 'if' operator will always execute the 'return TRUE;' branch, which is incorrect. This is the fixed code:
#define PSP_HIDEHEADER 0x00000800 BOOL CResizablePageEx::NeedsRefresh(....) { if (m_psp.dwFlags & PSP_HIDEHEADER) return TRUE; ... return CResizableLayout::NeedsRefresh(layout, rectOld, rectNew); }
This diagnostic is classified as:
You can look at examples of errors detected by the V617 diagnostic. |