C6237
更新 : 2007 年 11 月
警告 C6237: (<0> && <式>) は常に 0 です。<式> は評価されることがないため、副作用が発生する可能性があります
この警告は、テスト コンテキストに出現する論理 OR 演算の左側で定数値 0 が検出されたことを示します。結果の式は、常に false に評価されます。したがって、論理 AND 演算の右側は評価されません。これは、"ショートサーキット" 評価と呼ばれます。
式の右側を慎重に調べて、適切な動作に必要な代入、関数呼び出し、インクリメント、デクリメントなどの操作の副作用がショートサーキット評価によって影響を受けないことを確認する必要があります。
式 (0 && n) には副作用がなく、一般にコード パスを選択して指定するために使用されます。
使用例
この警告を生成するさまざまなコード例を次のコードに示します。
#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");
}
}