يمكنني أن أجعل تحذير دول مجلس التعاون الخليجي على تمرير أنواع واسعة جدا من وظائف؟
-
08-07-2019 - |
سؤال
وفيما يلي بعض التعليمات البرمجية الواضح معيب التي أعتقد أن المترجم يجب أن تنبعث من التشخيص. ولكن لا gcc
ولا g++
يفعل، وحتى مع كل الخيارات تحذيرات كنت أفكر فيه: -pedantic -Wall -Wextra
#include <stdio.h>
short f(short x)
{
return x;
}
int main()
{
long x = 0x10000007; /* bigger than short */
printf("%d\n", f(x)); /* hoping for a warning here */
return 0;
}
هل هناك طريقة لجعل gcc
وg++
تحذير حول هذا الموضوع؟ على الجانب علما، هل لديك مترجم آخر التي تحذر من هذا افتراضيا أو في تكوين تحذيرات إضافية شائعة؟
ملحوظة: أنا باستخدام دول مجلس التعاون الخليجي (كلا C و C ++ المجمعين) النسخة 4.2.4
وتحرير: أنا فقط وجدت أن gcc -Wconversion
لا حيلة، ولكن نفس الخيار لg++
لا، وأنا حقا باستخدام C ++ هنا، لذلك أنا بحاجة إلى حل لg++
(وأنا أتساءل الآن لماذا لا -Wconversion
يبدو أن ذلك).
وتحرير: http://gcc.gnu.org/bugzilla/show_bug. المجموعة الاستشارية لاندونيسيا؟ ID = 34389 تشير إلى أن هذا قد تكون ثابتة في g++ 4.4
... ربما؟ وليس من الواضح بالنسبة لي حتى الان ما اذا كان نفس الموضوع و / أو إذا كان الإصلاح قادم حقا في هذا الإصدار. ربما شخص مع 4.3 أو 4.4 ويمكن محاولة حالتي الاختبار.
المحلول
استخدم -Wconversion - المشكلة هي يلقي الضمني (التحويل) من العاشر طويلا لباختصار عندما يتم استدعاء الدالة f (قصيرة خ) [لا printf]، وسوف -Wconversion تقول شيئا مثل "يلقي من وقت طويل إلى قصير قد يغير قيمة ".
..
وتحرير: فقط رأيت ملاحظتك. -Wconversion النتائج في تحذير بالنسبة لي، وذلك باستخدام ز ++ 4.3.2 على لينكس ... (4.3.2-1 على ديبيان)
نصائح أخرى
وأود أن أقترح بقوة الاستثمار في PC-الوبر / FlexeLint من Gimpel . ويتكون برنامج لالتقاط أشياء من هذا القبيل أن المترجم هو فقط لا. أنها غير مكلفة نسبيا وتستحق الثمن. وهناك عرض على الانترنت على الموقع التي يمكنك استخدامها لتقييم ذلك، وهنا هو ما يفيد أنه للخط المذكور من المثال الخاص بك:
diy.cpp 14 Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)