فشل الشظية على الكود الذي يتضمن complex.h
-
01-10-2019 - |
سؤال
أحاول الجري 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
إذا وضعت هذا الزوج حول الكود الذي تريد تجاهله ، فسيتجاهله! لا يعمل أي من الأشياء الأخرى لملفات رأس النظام ، على الأقل وجدت.