手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

MISRA C Rule­13.2 0400 0403 Rule­13.5 3415

时间:2024-10-15 08:36:39

、 序列点之间对象被修改一次以上求值顺序未指定 ; 序列点之间对象可能被修改和读取求值顺序未指定 ; '&&'或'||' 的右操作数是一个可能发生副作用的表达式。

工具/原料

Rule­13.2 0400 0403 Rule­13.5 3415

MISRA C:2012

Rule­13.2 0400

1、 0400 [U] '%s' is modified more than once between sequence points - evaluation order unspecified. 序列点中对象被修改一次以上,操作结果是未定义的。在C中,副作用的顺序没有很好地被定义。 如果在两个序列点间,对象被修改一次以上,C语言没有定义这两次更新的顺序。 当在序列点间,一个对象被明确修改一次以上时,生成消息0400。 修改对象的明确运算包括赋值运算、自增和自减运算等。

2、在下面的例子中,赋值运算的右操作数表达式会被计算成10。这条语句中"x"会被修改两次,一次是自增运算,一次是赋值运算。但C语言中没有明确指定这两种更新运算中哪个应该先执行。有的编译器会先用10赋值,然后自增到11,有的编译器会先把x自增到3,然后再进行赋值运算,把x赋值为10。

MISRA C Rule­13.2 0400 0403 Rule­13.5 3415

3、编程规范修改举例

MISRA C Rule­13.2 0400 0403 Rule­13.5 3415

Rule­13.2 0403

1、 0403 [U] '%s' may be modified and accessed between sequence points - evaluation order unspecified. 序列点间,对象可能被同时修改和读取。ISO:C 标准认为,在序列点间,和赋新值不一样,对象的修改和读取操作结果未定义。如果使用了对象的值,同时,对象的值在同一条语句中被修改,那么这种情况下确定对象值的修改操作在其使用前还是使用后很重要,但这没有定义。当读取对象和可能修改对象的顺序未定义时生成消息0403。 对象的地址传入函数,且函数参数没有定义为"指向const限定"类型的指针时,属于可能修改的代码。 这种情况下,QAC不能确定调用的函数有没有真的修改对象的值,函数参数被简单识别为可能修改。

2、在如下所示的代码例子:语句a)中,对"x"的明确修改操作可能发生在"x"乘2之前,也有可能发生在之后。语句b)中,对"x"的可能修改操作可能发生在"x"乘2之前,也有可能发生在之后。语句c)中,函数nsef()永远不能修改"x"的值。

MISRA C Rule­13.2 0400 0403 Rule­13.5 3415

3、编程规范修改举例

MISRA C Rule­13.2 0400 0403 Rule­13.5 3415

Rule­13.5 3415

1、 3415 Right hand operand of '&&' or '||' is an expression with possible side effects. 仅仅只有'&&'操作符的左操作数为1(真)时,才会执行它的右操作数。仅仅只有'||'操作符的左操作数为0(假)时,才会执行它的右操作数。正因为如此,如果这些操作符的右操作数有副作用,就可能引发混乱。消息3415用于识别这种情况。

2、当一个表达式是以下情况时,会产生副作用:访问'volatile' 对象执行自增、自减、赋值或复合赋值操作执行I/O 操作调用一个执行上面任意操作的函数

MISRA C Rule­13.2 0400 0403 Rule­13.5 3415

3、编程规范修改举例

MISRA C Rule­13.2 0400 0403 Rule­13.5 3415
© 手抄报圈