メインコンテンツ

ステートメントのインデントが正しくありません

ステートメントのインデントが間違っていることによって、それがブロックの一部として表示される

説明

この欠陥は、ステートメントのインデントが ifelse、またはその他のブロックの一部として表示されるが、並べ替えや中かっこの欠如によって実際にはステートメントがブロックの外側に配置される場合に発生します。

リスク

開発者またはレビュー担当者がインデントに基づいて間違ってステートメントとブロックを関連付けることによって、プログラム ロジックに関する間違った前提につながる可能性があります。

以下に例を示します。

if(credentialsOK())
   login=1;
   setCookies();
setCookies();if ブロックの一部ではありませんが、インデントがそうでないことを示唆しています。

修正方法

ステートメントをブロックの一部にするには、ステートメントがブロックに関連付けられた中かっこ内に存在することを確認します。ブロックの範囲を特定するには、[ソース] ペインで、開いている中かっこをクリックします。

ifelse、または while ステートメントに中かっこに続く条件が含まれていない場合は、セミコロンまでの実行パス上の次の行のみが ifelse、または while ブロックの一部と見なされます。後続の行をブロック内に含めるには、その行を中かっこでラップします。

たとえば、前述の例で、両方のステートメントを if ブロック内に含めるには、以下を使用します。

if(credentialsOK()) {
   login=1;
   setCookies();
}

すべて展開する

int switch1, switch2;

void doSomething(void);
void doSomethingElse(void);

void func() {
    if(switch1) 
        if(switch2)
            doSomething();
    else
        doSomethingElse();
}

この例では、else が 1 つ目の if に関連付けられているかのようにインデントされています。しかし、実際には、else は 2 つ目の if に関連付けられています。インデントが実際の関連付けと一致しないため、プログラム ロジックに関する誤った前提につながる可能性があります。

修正 — 中かっこを適切に使用する

else を 1 つ目の if に関連付けるには、中かっこを使用して 1 つ目の if ブロックの境界をマークします。

int switch1, switch2;

void doSomething(void);
void doSomethingElse(void);

void func() {
    if(switch1) { 
        if(switch2)
            doSomething();
    }
    else
        doSomethingElse();
}

結果情報

グループ: 適切な手法
言語: C | C++
既定値: オフ
コマンド ライン構文: INCORRECT_INDENTATION
影響度: Low

バージョン履歴

R2020a で導入