C6237
Warnung C6237: (<Null> && <Ausdruck>) ist immer 0 (null). <Ausdruck> wird niemals ausgewertet und hat möglicherweise Nebeneffekte.
Diese Warnung gibt an, dass in einem Testkontext auf der linken Seite einer logischen AND-Operation ein Konstantenwert gleich 0 (null) ermittelt wurde. Der daraus resultierende Ausdruck ergibt immer false. Daher wird die rechte Seite der logischen AND-Operation nicht ausgewertet. Dies wird als "Kurzschlussauswertung" bezeichnet.
Untersuchen Sie die rechte Seite des Ausdrucks sorgfältig, um sicherzustellen, dass die für eine ordnungsgemäße Funktionalität erforderlichen Nebeneffekte wie Zuordnungs-, Funktionsaufruf-, Inkrement- und Dekrementoperationen von dieser Kurzschlussauswertung nicht betroffen sind.
Der Ausdruck (0 && n) erzeugt keine Nebeneffekte und wird i. d. R. für die selektive Auswahl von Codepfaden verwendet.
Beispiel
Im folgenden Code werden verschiedene Codebeispiele veranschaulicht, in denen diese Warnung generiert werden:
#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);
}
}
So korrigieren Sie die Warnung unter Verwendung des folgenden Codes
#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");
}
}