Main Content

Sign change integer conversion overflow

Overflow when converting between signed and unsigned integers

Description

This defect occurs when converting an unsigned integer to a signed integer. If the variable does not have enough bytes to represent both the original constant and the sign bit, the conversion overflows.

The exact storage allocation for different floating-point types depends on your processor. See Target processor type (-target).

Fix

The fix depends on the root cause of the defect. Often the result details (or source code tooltips in Polyspace as You Code) show a sequence of events that led to the defect. You can implement the fix on any event in the sequence. If the result details do not show this event history, you can search for previous references of variables relevant to the defect using right-click options in the source code. See also Interpret Bug Finder Results in Polyspace Desktop User Interface or Interpret Bug Finder Results in Polyspace Access Web Interface (Polyspace Access).

If you are using Embedded Coder®, in some cases, Polyspace® reports a violation for this defect in generated code that uses 32-bit multiplication and division helper functions. To avoid this defect, enable the setting Support long long in Embedded Coder. See Support long long (Simulink).

If you do not want to fix the issue, add comments to your result or code to avoid another review. See:

Extend Checker

A default Bug Finder analysis might not raise this defect when the input values are unknown and only a subset of inputs cause an issue. To check for defects caused by specific system input values, run a stricter Bug Finder analysis. See Extend Bug Finder Checkers to Find Defects from Specific System Input Values.

Examples

expand all

char sign_change(void) {
    unsigned char count = 255;

    return (char)count;
}

In the return statement, the unsigned character variable count is converted to a signed character. However, char has 8 bits, 1 for the sign of the constant and 7 to represent the number. The conversion operation overflows because 255 uses 8 bits.

Correction — Change conversion types

One possible correction is using a larger integer type. By using an int, there are enough bits to represent the sign and the number value.

int sign_change(void) {
    unsigned char count = 255;

    return (int)count;
}

Result Information

Group: Numerical
Language: C | C++
Default: On
Command-Line Syntax: SIGN_CHANGE
Impact: Medium

Version History

Introduced in R2013b