主要内容

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

MISRA C++:2023 Rule 7.0.5

Integral promotion and the usual arithmetic conversions shall not change the signedness or the type category of an operand

自 R2024b 起

描述

规则定义

Integral promotion and the usual arithmetic conversions shall not change the signedness or the type category of an operand. 1

理由

某些从有符号数据类型转换为无符号数据类型或类型类别的更改可能导致实现定义的行为。您可能会看到转换导致的意外结果。

Polyspace 实现

检查项会对以下情况进行标记:

  • 有符号整数类型与无符号整数类型之间的隐式转换。

    检查项假定 ptrdiff_t 是一个有符号整数。

  • 类型类别变更。

    根据 MISRA™ C++:2023 规范,规则检查项将类型分为四类:

    • 字符:charwchar_tchar16_tchar32_t

    • 整数:有符号和无符号整数类型以及无限定作用域的枚举类型,包括 signed charunsigned char

    • 浮点:floatdoublelong double

    • 其他:boolvoidnullptr_t

故障排除

如果您预期会出现违规,而 Polyspace® 未报告该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

typedef char int8_t;
typedef unsigned char uint8_t;

void func()
  {
    int8_t s8;
    uint8_t u8;

    s8 = u8; //Noncompliant 
    u8 = s8 + u8; //Noncompliant
    u8 = static_cast< uint8_t > ( s8 ) + u8; //Compliant
}

在此示例中,当有符号数据类型的变量隐式转换为无符号数据类型的变量,或者无符号数据类型的变量隐式转换为有符号数据类型的变量时,则违反了该规则。如果像前面的示例那样进行显式转换,则不会出现违反规则的情况。

检查信息

组:标准转换
类别:必需

版本历史记录

在 R2024b 中推出

全部展开


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.