يمكنني أن أجعل تحذير دول مجلس التعاون الخليجي على تمرير أنواع واسعة جدا من وظائف؟

StackOverflow https://stackoverflow.com/questions/310108

سؤال

وفيما يلي بعض التعليمات البرمجية الواضح معيب التي أعتقد أن المترجم يجب أن تنبعث من التشخيص. ولكن لا 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top