C6236
Warnung C6236: (<Ausdruck> || <Konstante ungleich 0>) ist immer eine Konstante ungleich 0.
Diese Warnung gibt an, dass in einem Testkontext auf der rechten Seite einer logischen OR-Operation ein Konstantenwert ungleich 0 (null) ermittelt wurde, der nicht 1 ist. Die linke Seite der logischen OR-Operation wird nicht ausgewertet, da der sich ergebende Ausdruck immer zum Ergebnis true ausgewertet wird. Dies wird als "Kurzschlussauswertung" bezeichnet.
Ein Konstantenwert, der nicht 1 ist, lässt darauf schließen, dass der bitweise Operator AND (&) absichtlich verwendet wurde. Diese Warnung wird in der allgemeinen Vorgehensweise nicht verwendet, wenn die Konstante ungleich 0 (null) den Wert 1 aufweist, da diese für das selektive Aktivieren von Codepfaden verwendet wird. Sie wird jedoch generiert, wenn die Konstante ungleich 0 (null) zum Ergebnis 1 ausgewertet wird, z. B. 1+0.
Beispiel
Im folgenden Code wird n++ nicht ausgewertet, da INPUT_TYPE größer als 1 ist:
#define INPUT_TYPE 2
#include <stdio.h>
void f( int n )
{
// side effect: n not incremented
if( n++ || INPUT_TYPE ) //warning 6236 issued
{
puts( "Always gets here" );
}
else
{
puts( "Never enters here" );
}
}
Im folgenden Code wird der bitweise Operator AND (&)verwendet, um die Warnung zu korrigieren:
#define INPUT_TYPE 2
#include <stdio.h>
void f( int n )
{
if( n++ & INPUT_TYPE )
{
puts( "Bitwise-AND comparison is true" );
}
else
{
puts( "Bitwise-AND comparison is false" );
}
}