主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

MISRA C:2012 Dir 1.1

Any implementation-defined behavior on which the output of the program depends shall be documented and understood

描述

指令定义

Any implementation-defined behavior on which the output of the program depends shall be documented and understood. 1

理由

如果 C 标准允许编译器为构造选择规范,则代码构造具有实现定义的行为。ISO/IEC 9899:1999 (C99) 标准的附录 J.3 和 ISO/IEC 9899:1990 (C90) 标准的附录 G.3 中提供了实现定义的行为的完整列表。

如果您理解并记录了所有实现定义的行为,则可以确保程序的所有输出都能追根求源,没有意料之外。

Polyspace 实现

分析将检测 C99 中实现定义的行为及其在 C90 中的对应行为的以下可能性。如果您了解编译器实现的行为,请使用适当的注释来对分析结果进行申述。要对某个结果进行申述,请指定下列状态之一:已申述未计划任何操作不是缺陷

提示

要对指示相同实现定义的行为的所有结果进行批量申述,请使用结果列表窗格中的详细信息列。点击列标题,以便将具有相同条目的所有结果分组在一起。在按住 Shift 键的同时依次选择第一个结果和最后一个结果。为其中一个结果指定一个状态。如果您未看到详细信息列,请右键点击任何其他列标题并启用此列。

根据 MISRA C:2012 Addendum 1,一些 MISRA C:2004 规则作为必需规则映射到 MISRA C:2012 Dir 1.1,包括:

  • Rule 12.12 - The underlying bit representations of floating-point values shall not be used.

  • Rule 13.3 - Floating-point expressions shall not be tested for equality or inequality.

  • Rule 20.5 - The error indicator errno shall not be used.

C99 标准附录参考要记录的行为Polyspace® 如何提供帮助
J.3.2:环境可以用来定义 main 函数的替代方式。

分析会标记具有参量且返回类型不是以下类型的 main

int main(void) { ... }
int main(int argc, char *argv[]) { ... }

请参阅 C99 标准的 5.1.2.2.1 节。

J.3.2:环境环境名称的集合和用于更改 getenv 函数使用的环境列表的方法。

分析会标记对 getenv 函数的使用。对于此函数,您需要了解环境变量列表以及如何修改该列表。

请参阅 C99 标准的 7.20.4.5 节。

J.3.6:浮点FLT_ROUNDS 的非标准值为特征的舍入行为。

如果 FLT_ROUNDS 的值不在 {-1, 0, 1, 2, 3} 集合内,则分析会标记针对 float.h 的 include 语句。只有值被包含在此集合中,才能实现明确定义的舍入行为。

请参阅 C99 标准的 5.2.4.2.2 节。

J.3.6:浮点FLT_EVAL_METHOD 的非标准负值为特征的计算方法。

如果 FLT_EVAL_METHOD 的值不在 {-1, 0, 1, 2} 集合内,则分析会标记针对 float.h 的 include 语句。对于浮点运算,只有值被包含在此集合中,才能实现明确定义的行为。

请参阅 C99 标准的 5.2.4.2.2 节。

J.3.6:浮点将整数转换为不能精确表示原始值的浮点数时的舍入方向。

分析会标记从整数到较小大小的浮点数据类型的转换(例如,从 64 位 int 到 32 位 float)。

请参阅 C99 标准的 6.3.1.4 节。

J.3.6:浮点将浮点数转换为较窄浮点数时的舍入方向。

分析会标记以下转换:

  • doublefloat

  • long doubledoublefloat

请参阅 C99 标准的 6.3.1.5 节。

J.3.6:浮点FENV_ACCESS pragma 的默认状态。

分析会标记对下列项之外的 pragma 的使用:

#pragma STDC FENV_ACCESS ON
#pragma STDC FENV_ACCESS OFF

请参阅 C99 标准的 7.6.1 节。

J.3.6:浮点 FP_CONTRACT pragma 的默认状态。

分析会标记对下列项之外的 pragma 的使用:

#pragma STDC FP_CONTRACT ON
#pragma STDC FP_CONTRACT OFF

请参阅 C99 标准的 7.12.2 节。

J.3.11:预处理指令对每个可识别的非 STDC #pragma 指令的行为。

分析会标记对符合以下条件的 pragma 的使用:

#pragma pp-tokens
其中的处理标记 STDC 没有紧跟 pragma。例如:
#pragma FENV_ACCESS ON

请参阅 C99 标准的 6.10.6 节。

J.3.12:库函数除“上溢”或“下溢”浮点异常外,feraiseexcept 函数是否还引发“不精确”浮点异常。

分析会标记对 feraiseexcept 函数的调用。

请参阅 C99 标准的 7.6.2.3 节。

J.3.12:库函数"C""" 之外的其他字符串,可以作为 setlocale 函数的第二个参量传递。

setlocale 函数的第二个参量不是 "C""" 时,分析会标记对该函数的调用。

请参阅 C99 标准的 7.11.1.1 节。

J.3.12:库函数FLT_EVAL_METHOD 宏的值小于 0 或大于 2 时,为 float_tdouble_t 定义的类型。

如果 FLT_EVAL_METHOD 的值不在 {0,1,2} 集合内,则分析会标记针对 math.h 的 include 语句。

请参阅 C99 标准的 7.12 节。

J.3.12:库函数以 2 为底的对数, remquo 函数用于减少商的模数。

分析会标记对 remquoremquofremquol 函数的调用。

请参阅 C99 标准的 7.12.10.3 节。

J.3.12:库函数abortexit_Exit 函数返回到主机环境的终止状态。

分析会标记对 abortexit_Exit 函数的调用。

请参阅 C99 标准的 7.20.4.1、7.20.4.3 或 7.20.4.4 节。

故障排除

如果您预计存在违规,但未看到该违规,请参阅Diagnose Why Coding Standard Violations Do Not Appear as Expected

检查信息

组:实现
类别:必需
AGC 类别:必需

版本历史记录

在 R2017b 中推出

全部展开


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.