メインコンテンツ

条件が常に false であるために非アクティブにされたコード

#if 0 命令または if(0) 条件によって非アクティブにされたコード セグメント

説明

この欠陥は、コードのブロックが #if 0 命令または if(0) 条件を使用して非アクティブにされた場合に発生します。

リスク

#if 0 命令または if(0) 条件を使用して、コードのセグメントを一時的に非アクティブにしています。量産コードにこれらの命令が含まれている場合、コードをリリースする前に非アクティブ化が解除されていないことを意味します。

修正方法

コードのセグメントがデバッグのみを目的としている場合、量産コードからそのセグメントを削除します。非アクティブ化が意図せず発生した場合は、#if 0 ステートメントと #endif ステートメントを削除します。

多くの場合、コードのセグメントは特定のオペレーティング システムなど特定の条件で非アクティブ化されます。これらの条件を示すには、#if 0 命令を使用してコードを完全に非アクティブ化するのではなく、#if 命令を含むマクロを使用します。たとえば、GCC では、Windows® オペレーティング システムを検出するマクロが用意されています。

#ifdef _WIN32
   //Code deactivated for all operating systems
   //Other than 32-bit Windows
#endif

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

すべて展開する

#include<stdio.h>
int Trim_Value(int* Arr,int Size,int Cutoff) 
{
    int Count=0;

    for(int i=0;i < Size;i++){
        if(Arr[i]>Cutoff){
            Arr[i]=Cutoff;
            Count++;
        }
    }

    #if 0
    /* Defect: Code Segment Deactivated */

    if(Count==0){
        printf("Values less than cutoff.");
    }
     #endif

    return Count;
}

上記のコードでは、printf ステートメントが #if #endif 命令内に置かれています。ソフトウェアは命令内のポーションをコード コメントでありコンパイルされていないものとして扱います。

修正 — #if 0#if 1 に変更

printf ステートメントを非アクティブにするのではない場合、1 つの修正方法として、#if #endif 命令内のコードのブロックを再度アクティブにできます。ブロックを再度アクティブにするには、#if 0#if 1 に変更します。

#include<stdio.h>
int Trim_Value(int* Arr,int Size,int Cutoff) 
{
 int Count=0;

 for(int i=0;i < Size;i++)
     {
      if(Arr[i]>Cutoff)
            {
             Arr[i]=Cutoff;
             Count++;
            }
     }


 /* Fix: Replace #if 0 by #if 1 */	  
 #if 1  
      if(Count==0)
           {
            printf("Values less than cutoff.");
           }
 #endif

 return Count;
}

この例では、テンプレート ATemplateClass がブール値 false を使用してインスタンス化される場合、条件 (do_it && i) は常に false になります。

// Corner case with templates
#include <iostream>

template<bool do_it>
class ATemplateClass {
public:
	void foo(int i) {
		if(do_it && i) {  // Defect
			std::cout << "Code enters if branch of foo().\n";
		}
	}
};
class AlwaysTrue: public ATemplateClass<true> {};
class AlwaysFalse: public ATemplateClass<false> {};

void defect_raised_with_multiple_template_instances() {
	AlwaysTrue t;
	AlwaysFalse f;
	t.foo(1);
	f.foo(1);
}

上記のコードでは、派生クラス AlwaysFalse でブール値 false を指定しています。条件はテンプレートの一部として定義されているので、テンプレートのすべてのインスタンス化が欠陥になるとは限りません。少なくとも 1 つのインスタンス化が欠陥になる場合、欠陥チェッカーは欠陥を報告します。

結果情報

グループ: データ フロー
言語: C | C++
既定値: オフ
コマンド ライン構文: DEACTIVATED_CODE
影響度: Low

バージョン履歴

R2013b で導入

Go to top of page