主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

无符号整数转换溢出

在不同无符号整数类型之间转换时发生溢出

描述

此缺陷在将无符号整数转换为较小的无符号整数类型时发生。如果变量没有足够的字节来表示原始常量,则转换会发生溢出。

不同浮点数类型的确切存储分配取决于您的处理器。请参阅目标处理器类型 (-target)

风险

整数转换溢出会导致未定义行为。

修复

修复方法取决于缺陷的根本原因。通常,结果详细信息(或在 Polyspace as You Code 中显示的源代码提示)会显示导致缺陷的一系列事件。您可以在序列中的任何事件上实施此修复。如果结果详细信息未显示此事件历史记录,您可以使用源代码中的右键点击选项搜索与缺陷相关的变量的先前引用,并找到相关事件。另请参阅解释 Polyspace 桌面端用户界面中的 Bug Finder 结果解释 Polyspace Access Web 界面中的 Bug Finder 结果 (Polyspace Access)

您可以通过以下方式修复此缺陷:

  • 使用更大的数据类型来表示转换结果,以便能够容纳所有值。

  • 检查导致溢出的值,并执行适当的错误处理。

一般来说,应避免将数据类型转换为更小的整数类型。

请参阅以下修复示例。

如果您不想修复问题,请在结果或代码中添加注释,以免再次被审查。请参阅:

扩展检查项

当输入值未知并且只有一部分输入会导致问题时,默认的 Bug Finder 分析可能不会引发此缺陷。要检查由特定系统输入值引起的缺陷,请运行更严格的 Bug Finder 分析。请参阅Extend Bug Finder Checkers to Find Defects from Specific System Input Values

示例

全部展开

unsigned char convert(void) {
    unsigned int unum = 1000000U;

    return (unsigned char)unum;  
}

在返回语句中,无符号整数变量 unum 被转换为无符号字符类型。然而,转换会发生溢出,因为 1000000 至少需要 20 位。C 程序设计语言标准并不将无符号溢出视为错误,因为程序会自动将结果减去最大值加 1 的模数。在此示例中,unum 被模 2^8 减去,因为字符数据类型只能表示 2^8-1

更正 - 更改转换类型

一种可能的更正方法是转换为能够表示整个数字的不同整数类型。例如,long

unsigned long convert(void) {
    unsigned int unum = 1000000U;

    return (unsigned long)unum;  
}

结果信息

组:数值
语言:C | C++
默认值:On
命令行语法:UINT_CONV_OVFL
影响

版本历史记录

在 R2013b 中推出