The analyzer has detected a potential error related to an overflow.
The following operations are executed:
If the overflow occurs during the subtraction, the check result might be different from what the programmer expects.
Here is the simple case:
unsigned A = ...;
int B = ...;
if (A - B > 1)
Array[A - B] = 'x';
A developer wants to protect the code against the array overflow using the check, but it won't help if 'A < B'.
If A = 3 and B = 5, then 0x00000003u - 0x00000005i = FFFFFFFEu
According to the C++ standards, the 'A – B' expression has the 'unsigned int' type. It means that 'A – B' will equal 'FFFFFFFEu'. This number is higher than one. As a result, memory outside the array will be accessed.
There are two options to fix the code. First, you can use variables of signed types for calculations:
intptr_t A = ...;
intptr_t B = ...;
if (A - B > 1)
Array[A - B] = 'x';
Second, you can change the condition: it should depend on the result we want to get and the input values. If 'B >= 0', write the following code:
unsigned A = ...;
int B = ...;
if (A > B + 1)
Array[A - B] = 'x';
If the code is correct, disable the warning for the line using the '//-V5005' comment.
This diagnostic is classified as:
|
Was this page helpful?
Your message has been sent. We will email you at
If you do not see the email in your inbox, please check if it is filtered to one of the following folders:
Take
a chance!