主要内容

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

MISRA C:2012 Rule 15.6

The body of an iteration-statement or a selection-statement shall be a compound statement

描述

规则定义

The body of an iteration-statement or a selection-statement shall be a compound- statement 1 .

理由

如果与迭代或选择语句相关的代码模块未包含在花括号中,则可能会出现关联错误。例如:

  • 由于代码的缩进,您可能会错误地将一行代码与迭代语句或选择语句关联起来。

  • 您可能会在迭代语句或选择语句之后意外地添加分号。由于分号的存在,紧跟在语句后面的行不再与该语句相关联,即使您的本意并非如此。

此检查项强制执行在选择或迭代语句后添加大括号的惯例,即使在主体中只有一行也是如此。后来,当添加更多行时,添加这些行的开发人员无需特别标注花括号的缺失并手动添加。

Polyspace 实现

检查项将 for 循环标记为,其中 for 语句后的第一个令牌不是左大括号,例如:

for (i=init_val; i > 0; i--)
   if (arr[i] < 0)
      arr[i] = 0;
ifelse ifelseswitchfordo..while 语句也执行类似的检查。

结果详细信息窗格中的消息第二行指示了违反规则的语句。例如,在上例中,存在两个违规情况。消息的第二行指出了一个违规的 for 循环和另一个违规的 if 条件。

报告中的补充消息

  • else 关键字后应跟一个复合语句或另一个 if 语句。

  • 一个 if (表达式) 结构必须跟在一个复合语句之后。

  • 构成 while 语句主体的语句必须是一个复合语句。

  • 构成 do ... while 语句主体的语句应为复合语句。

  • for 语句的主体部分应为一个复合语句。

  • 开关语句的主体部分应为复合语句。

故障排除

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

示例

全部展开

int data_available = 1;
void f1(void) {
    while(data_available)                 /* Non-compliant */
        process_data();

    while(data_available) {               /* Compliant */
        process_data();
    }
}

在此示例中,第二个 while 模块被大括号括起来,因此没有违反规则。

#include<stdbool.h>
void f1(bool flag_1, bool flag_2) {
    if(flag_1)                            /* Non-compliant */
        if(flag_2)                        /* Non-compliant */
            action_1();
    else                                  /* Non-compliant */
            action_2();
}

在此示例中,由于 ifelse 模块未用大括号括起来,因此违反了规则。除非像上面那样缩进,否则很容易将 else 语句与内部的 if 关联起来。

更正 - 将“选择语句模块”放在大括号中

一种可能的更正方法是将与 ifelse 语句相关的每个模块用大括号括起来。

#include<stdbool.h>
void f1(bool flag_1, bool flag_2) {
    if(flag_1) {                          /* Compliant */
        if(flag_2) {                        /* Compliant */
            action_1();
        }
    }
    else {                                /* Compliant */
        action_2();
    }
}

#include<stdbool.h>
void f1(bool flag_1) {
    while(flag_1);                        /* Non-compliant */
    {
        flag_1 = action_1();
    }
}

在此示例中,尽管 while 语句后跟一个花括号括起的模块,但该规则仍被违反。while 语句后的分号使该模块与 while 语句分离。

该规则有助于检测此类多余的分号。

检查信息

组:控制流
类别:必需
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.