主要内容

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

MISRA C:2012 Rule 13.2

The value of an expression and its persistent side effects shall be the same under all permitted evaluation orders and shall be independent from thread interleaving

描述

规则定义

The value of an expression and its persistent side effects shall be the same under all permitted evaluation orders and shall be independent from thread interleaving 1 .

理由

如果表达式的值因评估顺序而异,则其值为实现定义。

如果表达式根据线程交错顺序产生不同的值,则该值是不可预测的,因为 C 标准未指定线程交错顺序。这种不可预测的行为意味着您的代码可能包含数据争用条件,这是未定义的行为。

Polyspace 实现

如果表达式满足以下任何条件,规则检查器将报告违规:

  • 同一个变量在表达式中被修改了多次,或者它既被读取又被写入。

  • 该表达式允许多个求值顺序。

  • 该表达式包含一个多次出现的单个 volatile 对象。

  • 表达式中包含多个 volatile 对象。

由于 volatile 对象可以随时更改其值,因此包含多个 volatile 变量或多个相同 volatile 变量的表达式可能会根据评估顺序产生不同的结果。

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

int a[10], b[10];
#define COPY_ELEMENT(index) (a[(index)]=b[(index)])

void main () {
	int i=0, k=0;

	COPY_ELEMENT (k);         /* Compliant */
	COPY_ELEMENT (i++); /* Noncompliant  */
}

在此示例中,语句 COPY_ELEMENT(i++) 违反了该规则,因为 i++ 出现了两次,且两个表达式的评估顺序未指定。

void f (unsigned int param1, unsigned int param2) {}

void main () {
    unsigned int i=0;
    f ( i++, i );                 /* Non-compliant */
}

在此示例中,由于未指定运算 i++ 是发生在将第二个参量传递给 f 之前还是之后,因此违反了规则。调用 f(i++,i) 可能翻译为 f(0,0)f(0,1)

struct {
	volatile float x; 
	volatile float y; 
} volData;

float xCopy;
float yCopy;
float res, res2;

void function4(void) {
	res = volData.x + volData.y;         //Noncompliant
	res = volData.x * volData.x;	  //Noncompliant
	xCopy = volData.x;
	yCopy = volData.y;
	res = xCopy + yCopy;  //Compliant
}  

在此示例中,表达式 volData.x + volData.y 不合规,因为该表达式涉及多个易失性对象。该表达式由三项操作组成:访问 volData.x 的值、访问 volData.y 的值以及加法。volData 结构中的易失性字段 xy 的值可能会随时更改。res 的值可能会因首先读取的变量而异。由于 C 标准未指定变量的读取顺序,因此 res 的值可能因您使用的硬件和软件而异。Polyspace® 标记表达式中的一个 volatile 对象。同样,Polyspace 在表达式 volData.x * volData.x 中标记了 volatile 对象之一。

为避免违规,请将易失性变量赋值给非易失性临时变量,并在表达式中使用这些临时变量。

检查信息

组:副作用
类别:必需
AGC 类别:必需

版本历史记录

在 R2014b 中推出

全部展开


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.