次の方法で共有


警告 C6237

('zero' & 'expression') は常に 0 です。 'expression' は評価されないので、副作用が発生する可能性があります

この警告は、テスト コンテキストで発生する論理 AND 演算の左辺で、定数値 0 が検出されたことを示します。 結果の式は常に false と評価されます。 したがって、論理 AND 操作の右側は評価されません。 この言語機能は、"短絡評価" と呼ばれます。

解説

式の右側を慎重に調べる必要があります。適切な機能に必要な代入、関数呼び出し、インクリメント、デクリメント操作などの副作用が、短絡評価の影響を受けないことを確認してください。

式 (0 && n) は副作用を生成し、一般的にコード パスを選択するために使用されます。

コード分析名: ZEROLOGICALANDLOSINGSIDEEFFECTS

次のコードは、この警告を生成するさまざまなコード サンプルを示しています。

#include <stdio.h>
#define INPUT_TYPE 0

int test();

// side effect: n not incremented
void f1( int n )
{
   if(INPUT_TYPE && n++) //warning: 6237
   {
      puts("code path disabled");
   }
   else
   {
      printf_s("%d - n was not incremented",n);
   }
}

// side effect: test() not called
void f2( )
{
   if(INPUT_TYPE && test()) //warning: 6237
   {
      puts("code path disabled");
   }
   else
   {
      puts("test() was not called");
   }
}

//side effect: assignment and function call did not occur
void f3( int n )
{
   if(INPUT_TYPE && ( n=test() )) //warning: 6237
   {
      puts("code path disabled");
   }
   else
   {
      printf_s("%d -- n unchanged. test() was not called", n);
   }
}

この警告を解決するには、次のコードを使用します。

#include <stdio.h>
#define INPUT_TYPE 0
int test();

void f1( int n )
{
   if(INPUT_TYPE)
   {
      if(n++)
      {
         puts("code path disabled");
      }
   }
   else
   {
      puts("n was not incremented");
   }
}

void f2( )
{
   if(INPUT_TYPE)
   {
      if( test() )
      {
         puts("code path disabled");
      }
   }
   else
   {
      puts("test() was not called");
   }
}

void f3( int n )
{
   if(INPUT_TYPE)
   {
      n = test();
      if( n )
      {
         puts("code path disabled");
      }
   }
   else
   {
      puts("test() was not called");
   }
}

関連項目

C 論理演算子