メインコンテンツ

ISO/IEC TS 17961 [boolasgn]

No assignment in conditional expressions

説明

ルール定義

条件式に代入がない。1

Polyspace 実装

このチェッカーは、= (代入) 演算子の無効な使用をチェックします。

すべて展開する

問題

= 演算子の無効な使用は、ifwhile など、条件付きステートメントの述部内で代入が行われる場合に発生します。

C および C++ では、単一の等号は比較ではなく代入を表します。条件付きステートメントで単一の等号を使用している場合は、誤入力やミスである可能性があります。

リスク
  • 条件付きステートメントによる間違った値のテスト - 単一等号の演算は右辺のオペランドの値を左辺のオペランドに代入します。この代入は条件付きの述部内で行われるため、プログラムでは左辺のオペランドの新しい値が非ゼロかつ非 NULL であることがチェックされます。

  • 保守およびコードの可読性の問題 - 代入を意図した場合でも、コードを読む際、または更新する際に、代入ではなく、誤って等値比較と解釈する可能性があります。

修正方法
例 - if 条件内部の単一等号
#include <stdio.h>

void bad_equals_ex(int alpha, int beta)
{
    if(alpha = beta)
    {
        printf("Equal\n");
    }
}

if ステートメントの述部内で代入演算子が使用されているため、この等号に欠陥としてのフラグが付けられます。述部は、値 betaalpha に代入し、次に alpha が true か false かを暗黙的にテストします。

修正 — 式を比較に変更

1 つの修正方法として、等号を追加することができます。この修正により、代入が比較に変わります。if 条件は alphabeta が等しいかどうかを比較します。

#include <stdio.h>

void equality_test(int alpha, int beta)
{
    if(alpha == beta)
    {
        printf("Equal\n");
    }
}
修正 - if 条件内での代入と比較

述部内で代入を行わなければならない場合、考えられる 1 つの修正方法として、明示的な比較を追加します。この修正により、beta の値が alpha に代入され、次に alpha が非ゼロであるかどうかが明示的にチェックされます。コードが明確になります。

#include <stdio.h>

int assignment_not_zero(int alpha, int beta)
{
    if((alpha = beta) != 0)
    {
        return alpha;
    }
    else
    {
        return 0;
    }
}
修正 — if ステートメント外部に代入を移動

制御ステートメント外部で代入を行うことができる場合、考えられる 1 つの修正方法として、代入と比較を分離します。この修正により、if の前に beta の値が alpha に代入されます。if 条件内では alpha のみを指定し、alpha が非ゼロかつ非 NULL であることをテストします。

#include <stdio.h>

void assign_and_print(int alpha, int beta)
{
    alpha = beta;
    if(alpha)
    {
        printf("%d", alpha);
    }
}

チェック情報

決定可能性:決定可能

バージョン履歴

R2019a で導入


1 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.