سؤال

أحاول الجري splint على مصدر C يتضمن complex.h من مكتبة C القياسية إلى دعم الحساب المعقد.

للأسف، splint فشل مع الخطأ التالي.

شظية 3.1.2 --- 03 مايو 2009

/usr/include/bits/cmathcalls.h:54:31: خطأ في التحليل: إعلان غير وظيفي: _complex: extern double. (للحصول على مساعدة على أخطاء Parse ، انظر Splint -help parseerrors.) *** لا يمكن الاستمرار.

غوغلينغ للمشكلة أسفرت عن فقط هذه الرسالة في القائمة البريدية المنقسمة (التي لا تزال دون إجابة).

أيه أفكار؟

تحديث

فيما يلي مثال بسيط للغاية لمصدر فاشل:

#include <complex.h>

int main() {
  complex x = 2 + 8i;
  x = x + 1;
}

محاولات لإعادة تعريف غير مدعوم _Complex C99 الكلمة الرئيسية تؤدي إلى خطأ في الجزء الخيالي من الرقم المعقد (وهو أمر غير مفاجئ أفترض).

lsc@deepthought:~$ splint-D_Complex=double temp.c  
Splint 3.1.2 --- 03 May 2009

 temp.c:4:20: Parse Error. (For help on
 parse errors, see splint -help
                parseerrors.)
*** Cannot continue.
هل كانت مفيدة؟

المحلول 3

لقد حللت هذا في النهاية عن طريق تجاوز مؤقتًا complex.h مع واحد وهمية عند الاتصال splint.

[lsc@home]$ ls /opt/qa_tools/utils/splint_includes/
complex.h

[lsc@home]$ splint -I/opt/qa_tools/utils/splint_includes test.c
Splint 3.1.1 --- 15 Jun 2004

Finished checking --- no warnings

الدمية complex.h يثبط الملف الكلمات الرئيسية ذات الصلة ويحل محل الثوابت/الوظائف مع تلك الوهمية. تم الحصول على هذه الكلمات الرئيسية/الثوابت/الوظائف من المواصفات

نسخة من هذا الملف متوفرة هنا: https://gist.github.com/1316366

نصائح أخرى

أنا لست من مستخدمي الشظية ، لذا خذ ما يلي مع حبة من الملح ...

ال _Complex تمت إضافة الكلمة الرئيسية مع C99 ، والأسئلة الشائعة الشائبة لديها هذا حول C99 (http://www.splint.org/faq.html#quest15):

ومع ذلك ، لا يدعم الشظية بعد جميع ملحقات C99 ، لذا هناك بعض البرامج C المشروعة التي ستحتاج إلى تعديلها.

أعتقد ذلك _Complex مغطى بهذا التحذير.

قد تتمكن _Complex باستخدام تقنية موصوفة في الأسئلة الشائعة (http://www.splint.org/faq.html#quest14) ، لكنني سأفاجأ إذا جعلك هذا بعيدًا جدًا عن المساعدة في التعامل مع كود C99 _Complex:

إذا كنت تريد فقط تجاهل كلمة رئيسية ، فيمكنك إضافة -Dnonstandardkeyword= لجعل المعالج المسبق يلغي الكلمة الرئيسية ، حيث nonstandardkeyword هو اسم الكلمة الرئيسية.

كنت أكافح من أجل الحصول على شظية لتجاهل الرؤوس وعدم العثور على إجابات مناسبة في أي مكان عبر الإنترنت. استخدمت أخيرًا مساعدة Splint المدمجة ، واكتشفت هذا:

#ifndef S_SPLINT_S

#endif

إذا وضعت هذا الزوج حول الكود الذي تريد تجاهله ، فسيتجاهله! لا يعمل أي من الأشياء الأخرى لملفات رأس النظام ، على الأقل وجدت.

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