كيف يمكنني جعل splint يتجاهل المكان الذي أعلن فيه عن المتغيرات الخاصة بي؟

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

سؤال

هل تعرف كيف يمكنني جعل splint يتجاهل المكان الذي أعلن فيه عن المتغيرات الخاصة بي؟

أعلم أن المدرسة القديمة C تخبرك أن تعلن المتغيرات في البداية في كل وظيفة ، لكن بما أنني شخص سيء أحب أن أعلن أشياء قريبة من المكان الذي أستخدمه.وخير مثال على ذلك هو وضع int i;مباشرة قبل for(i=0;...).

دعونا نأخذ مثالا بسيطا جدا

#include  <stdio.h>
int main()
{
    printf("Hello splint test\n");

    int i;
    for(i=5;i>0;i--)
    {
        printf("%2d...\n",i);
    }

    return 0;
}

هنا يرغب معظم مترجمي لغة c القديمة في نقل int i؛لأعلى سطر واحد ، أو لوضع {} حول الإعلان والحلقة.

والآن إلى السؤال، كيف يمكنني إيقاف هذا الشيك؟ولكن الحفاظ على الشيكات الأخرى ما هو جيد؟

شكرا يوهان


ملاحظة 1:أستخدم بالفعل تحذيرات دول مجلس التعاون الخليجي (انظر أدناه) كدافع عن الخط الأول ، و Valgrind باعتباره الثاني.لكنني أفكر في إضافة جبيرة إلى قائمة الأشياء التي يمكن أن تتحكم في غباءي ؛-) ولكن هذا الشيك مزعج فقط ،

تحذيرات مجلس التعاون الخليجي التي أستخدمها:-Wall -W -Wextra -Wconversion -Wshadow -Wcast-qual -Write-strings -Werror

ملاحظة 2:أعلم مشاكل قابلية النقل المحتملة التي قد تنجم عن هذا السلوك السيئ.لكنني أشعر أنه يزيد من سهولة القراءة، ويعرف أيضًا باسم عدم الحاجة إلى القفز لأعلى ولأسفل للبحث عن هذا النوع من الإعلانات وهو أمر أكثر قيمة (وهذا يمكننا مناقشته في موضوع آخر).


تحديث:لمزيد من المعلومات، قمت بوضع الكود أعلاه في ملف يسمى main.c.النظام الأساسي المستخدم هو Ubuntu 8.04 و GVIM كمحرر ، وهذا هو الإخراج من الشظية عندما أقوم بتشغيله:

splint +gnuextensions main.c
Splint 3.1.1 --- 03 Nov 2006

Command Line: Setting +gnuextensions redundant with current value
main.c:8:8: Parse Error. (For help on parse errors, see splint -help
                 parseerrors.)

وهذا يفتح سؤالين آخرين لم أفكر فيهما من قبل.

  1. "زائدة عن القيمة الحالية"، ما هي القيمة الحالية؟

  2. لماذا يعتبر خطأ تحليلي وليس تحذير؟


تحديث::هناك إمكانية لتصحيح الجبيرة لدعم هذه المشكلة ، لم أحاول هذا ولكن حتى الآن ولكن أعتقد أنه الحل.

هل كانت مفيدة؟

المحلول

وهنا التصحيح:http://www.cs.virginia.edu/pipermail/splint-discuss/attachments/20080718/52cc25f6/attachment.obj

يجب أن تكون قادرًا على تغذية ذلك من خلال patch -p2 إذا كنت في دليل splint/src، وبعد ذلك يجب إعادة البناء.

وهذا من هذا البريد الإلكتروني:http://www.cs.virginia.edu/pipermail/splint-discuss/2008-July/001190.html

(آسف على التباعد في ذلك.)

ستجد ذلك في النهاية إذا اتبعت الموضوع المرتبط بـ starblue، لكنني اعتقدت أنني سأقفز إلى النهاية من أجلك.

يبدو أن Splint بدون مشرف في الوقت الحالي، للأسف.سأفكر في التصعيد والقيام بالمزيد إذا لم أكن مشغولاً للغاية.

جيك

نصائح أخرى

هذا الموضوع في القائمة البريدية لـ Splint يناقش هذه المشكلة.

يبدو أن المحلل اللغوي هو في الغالب C89/C90، ويبدو أن المكتبة فقط هي C99.

نظرًا لأن المشكلة تتعلق بالمحلل اللغوي، فلا يمكنك حلها عن طريق وضع العلامات.

أنا لست على دراية بالجبيرة، ولكن من الأسئلة الشائعة الخاصة بهم:

الجبيرة مستقلة عن المحول البرمجي.يتحقق من رمز C القياسي ، وفقا لمعيار ISO C99 مواصفات.جبيرة تدعم معظم ، ولكن ليس كل ملحقات C99 إلى ال ANSI C.جبيرة تدعم بعض امتدادات برنامج التحويل البرمجي لدول مجلس التعاون الخليجي (إذا + يتم استخدام gnuextensions).

إن موضع إعلانك متوافق تمامًا مع C99، لذا ربما يمكنك اعتبار هذا خطأً في جبيرة.أو أنها إحدى "الامتدادات" التي لم تدعمها Splint بعد.وفي كلتا الحالتين قد يكونون مهتمين بتعليقاتك.يجب ألا يكون هناك أي سبب لأداة الوبر المتوافقة مع C99 للشكوى من الإعلانات المتغيرة.

عادة، مع الجبيرة، إذا كان من الممكن قمع شيء ما، فستقول "قمع هذا باستخدام +thisflag أو -thisflag"

يمكنك تجربة splint +gnuextensions foo.c ، الذي يقوم بتشغيل (معظم) امتدادات GNU/GCC التي قد تواجهها splint.

أستخدم الجبيرة بشكل متكرر تقريبًا كما أستخدم valgrind.

يحرر:

كما قال الآخرون، فإنك تواجه المحلل اللغوي (وليس المحلل)، لذا فإن العلامات لن تساعد حقًا في هذه الحالة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top