Freigeben über


C6237

Aktualisiert: November 2007

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");
   }
}

Siehe auch

Referenz

C Logical Operators

Compilerwarnung (Stufe 4) C4127