メインコンテンツ

CERT C: Rec.EXP19-C

if、for または while ステートメントの本体では中かっこを使用する

説明

ルール定義

if、for または while ステートメントの本体では中かっこを使用します。1

Polyspace 実装

ルール チェッカーは、"反復ステートメントまたは選択ステートメントの本体が中かっこで囲まれていない" をチェックします。

すべて展開する

問題

この問題は、反復ステートメントまたは選択ステートメントの本体が中かっこで囲まれていない場合に発生します。

リスク

ルールは以下に対して適用されます。

  • whiledo ... while または for などの反復ステートメント。

  • if ... else または switch などの選択ステートメント。

反復ステートメントまたは選択ステートメントに関連付けられたコード ブロックが中かっこで囲まれていない場合、関連付けで間違える可能性があります。以下に例を示します。

  • インデントが原因で、コード行を反復ステートメントまたは選択ステートメントに誤って関連付ける。

  • 反復ステートメントまたは選択ステートメントの後に誤ってセミコロンを付ける。意図に反して、セミコロンが原因でステートメントの後に続く行がステートメントと関連付けられなくなります。

例 - 反復ブロック
int data_available = 1;
void f1(void) {
    while(data_available)                 /* Non-compliant */
        process_data();

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

この例では、2 番目の while ブロックは中かっこで囲まれており、ルールに違反しません。

例 - 入れ子にされた選択ステートメント
#include <stdbool.h>

bool flag_1, flag_2;

void f1(void) {
    if(flag_1)                            /* Non-compliant */
        if(flag_2)                        /* Non-compliant */
            action_1();
    else                                  /* Non-compliant */
            action_2();
}

この例では、if または else ブロックは中かっこで囲まれていないため、ルールに違反します。上記のようにインデントされていない限り、else ステートメントを内側の if に関連付けてしまいます。

修正 — 選択ステートメント ブロックを中かっこ内に配置

1 つの修正方法として、if または else ステートメントに関連付けられた各ブロックを中かっこで囲みます。

#include <stdbool.h>

bool flag_1, flag_2;

void f1(void) {
    if(flag_1) {                          /* Compliant */
        if(flag_2) {                        /* Compliant */
            action_1();
        }
    }
    else {                                /* Compliant */
        action_2();
    }
}

例 - 反復ステートメント後の誤ったセミコロン
#include <stdbool.h>

bool flag_1;

void f1(void) {
    while(flag_1);                        /* Non-compliant */
    {
        flag_1 = action_1();
    }
}

この例では、while ステートメントの後に中かっこで囲まれたブロックが続いていても、ルールに違反します。while ステートメントの後のセミコロンにより、ブロックは while ステートメントから分離されます。

ルールはこのような誤ったセミコロンの検出に役立ちます。

チェック情報

グループ: Rec.03.式 (EXP)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.