C6237
تحذير C6237: (<zero> & & <تعبير>) هو دوماً الصفر. <تعبير> هو عدم تقييم وقد يكون تأثيرات جانبية
هذا التحذير يشير إلى أنه تم الكشف عن القيمة ثابتة من صفر تشغيل الجانب الأيسر من منطقي-و العملية التي تحدث في سياق اختبار. الناتج عن عملية الدمج تعبير دائماً بتقييم إلى خطأ. ولذلك، الجانب الأيسر من المنطقي-وعملية هو لا تقييم. Th هو هو الإشارة إلى كما "قصير-circuit تقييم".
يجب فحص جانب أيمن للتعبير بعناية إلى تأكد من أي تأثيرات جانبية مثل التعيين، واستدعاء دالة، زيادة، لا تتأثر بعمليات إنقاص المطلوبة للوظيفة المناسبة قصير-circuit التقييم.
التعبير ( 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");
}
}