7

मैं एक पवन नदी कंपाइलर 4 (जीसीसी (सी) और जी ++ (सी ++) का उपयोग कर रहा हूं) और यह बिना किसी समस्या के मेरी सभी परियोजनाओं को संकलित करता है। अब मुझे अपना कोड देखने के लिए कवरिटी स्टेटिक विश्लेषण का उपयोग करना होगा। मैंने विशिष्ट कंपाइलर्स को कॉन्फ़िगर किया है। सी-कोड (जीसीसी) के लिए वहाँ कोई समस्या नहीं हैं और मैं विश्लेषण चला सकते हैं, लेकिन सी ++ के लिए - कोड (छ ++) मैं त्रुटियों की एक बहुत कुछ मिल गया:सी ++ 0x मानक के साथ संगतता स्थिर विश्लेषण कैसे प्राप्त करें?

.../c++config.h", line 214: error #40: 
    expected an identifier 
inline namespace __gnu_cxx_ldbl128 { } 
    ^

.../c++config.h", line 214: error #326: 
    inline specifier allowed on function declarations only 
inline namespace __gnu_cxx_ldbl128 { } 
^ 

.../c++config.h", line 214: error #65: 
    expected a ";" 
inline namespace __gnu_cxx_ldbl128 { } 
           ^
.../include/string.h", line 76: error #312: 
    cannot overload functions distinguished by return type alone 
extern __const void *memchr (__const void *__s, int __c, size_t __n) 
        ^

.../include/string.h", line 116: error #312: 
    cannot overload functions distinguished by return type alone 
extern "C++" __const void *memchr (__const void *__s, int __c, size_t __n) 
        ^

यह कुछ सी होने लगते हैं ++ इनलाइन नेमस्पेस जैसी 11 विशिष्ट विशेषताएं लेकिन कोड इन सुविधाओं का उपयोग नहीं करता है। त्रुटियों के ऊपर एक HelloWorld-कोड के साथ उत्पादित कर रहे हैं:

#include "stdio.h" 
#include "util.h" 
#include <string> 
#include "string.h" 

using namespace std; 

int main() 
{ 
    printf("Hello World, C++ version: %d.%d.%d\r\n",__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__); 

    return 0; 
} 

मैं जी ++ विकल्प

-std=c++98 

साथ C++ मानक स्थापित करने की कोशिश की, लेकिन परिणाम बदल नहीं करता है।

टेस्ट कोड एक बड़ा निर्माण पदानुक्रम में है, लेकिन Coverity के लिए चरणों का इस तरह हैं:

  1. लक्ष्य और env सेट (विंड नदी 4 लिनक्स)
  2. स्वच्छ
  3. cov कॉन्फ़िगर कर सही साथ संकलक निर्देशिका और प्रकार के साथ
  4. cov-निर्माण "सभी कर" कमांड कि अकेले काम करता
  5. cov-विश्लेषण
  6. अगर (no_error) cov-कॉम यह दोष

मैं भी Coverity कॉन्फ़िगर किया है cov-निर्माण (--ppp-translator replace/inline namespace/namespace) के दौरान "नाम स्थान" के साथ सभी "इनलाइन नाम स्थान" की जगह। इनलाइन त्रुटियों गायब हो गईं लेकिन यह अधिक अधिभार त्रुटियों का उत्पादन करती है और कोई सफल निर्माण नहीं करती है। "सी ++" को उसी तरह से हटाने की भी कोशिश की लेकिन काम नहीं किया हमेशा और अधिक त्रुटियां होती हैं।

क्या किसी को पता है कि यहां समस्या क्या है? और मैं बिना किसी त्रुटि के कवरेज कैसे प्राप्त कर सकता हूं? हो सकता है कि मैं सी ++ मानक शीर्षलेखों को अनदेखा करने के लिए कवरिटी को कॉन्फ़िगर कर सकता हूं लेकिन अब मैं कैसे नहीं?

+0

आप किस जीसीसी का उपयोग कर रहे हैं? 4 पर्याप्त विशिष्ट नहीं है। वैसे भी, आपको [email protected] के साथ एक केस खोलना चाहिए - उन्हें अपना बिल्ड लॉग और प्रीप्रोसेस्ड स्रोत भेजें और वे आपको बताएंगे कि आपको कॉन्फ़िगरेशन में जोड़ने की आवश्यकता है ताकि कॉव-एमिट सफलतापूर्वक संसाधित हो सके। –

+0

विंड्रिवर एनवी। डब्लूआर-लिनक्स-4.0/टूलचेन-4.4-2 9 1 है और जीसीसी जो इस्तेमाल होता है वह संस्करण 4.4.1 है। बिल्ड स्क्रिप्ट के दौरान जीसीसी की डीआईआर शामिल करने का यह संस्करण है। मैं अब भी समर्थन के संपर्क में हूं: समस्या यह है कि विशेष रूप से विंड्रिवर कंपाइलर लिनक्स में समर्थित नहीं है, लेकिन लगभग * किसी भी * जीसीसी कंपाइलर। उनके पास अब प्रीप्रोसेस्ड स्रोत है और इसकी जांच करें। इसके अलावा विंड्रिवर समर्थन अब शामिल है। – Indimental

+0

को कवरिटी सपोर्ट से जवाब मिला और अब हम एक कामकाज करने की कोशिश कर रहे हैं। – Indimental

उत्तर

4

वर्कअराउंड Coverity समर्थन द्वारा:

इनलाइन नाम स्थान Coverity में एक ज्ञात बग है। यह बायपास करने के लिए, निम्न अतिरिक्त विकल्प (कॉन्फ़िग फ़ाइल में) के साथ Coverity कॉन्फ़िगर करें:

<begin_command_line_config></begin_command_line_config> 
    <add-arg>--ppp_translator</add_arg> 
    <add_arg>replace/inline namespace ([_a-zA-Z0-9]*)\s+\{\s*\}/namespace $1 { } using namespace $1;</add_arg> 
</options> 

उसके बाद हम कुछ अन्य त्रुटियों मिला लेकिन वे स्ट्रिंग परिभाषाओं करने के लिए सभी संबंधित लग रहे हैं। अब एक Coverity coverity-संकलक compat.h (भी config निर्देशिका में) की शुरुआत में परिभाषित जोड़ें:

#define __COVERITY_NO_STRING_NODEFS__ 

इन परिवर्तनों cov-निर्माण त्रुटियों के बिना चलने के बाद और विश्लेषण शुरू कर दिया जा सकता है।

0

यह त्रुटि यह काफी स्पष्ट रूप से कहते हैं:

इनलाइन विनिर्देशक समारोह घोषणाओं पर अनुमति केवल

एक कारण नाम स्थान inline है है? जबकि मेरे पास विनिर्देश उपलब्ध नहीं है, इसलिए मैं आपको यह नहीं बता सकता कि इसकी अनुमति है या नहीं। (कि संकलक जीसीसी में यह एक बग हो सकता है।)

inline को हटाने का प्रयास करें और कवरिता उम्मीद से खुश होगी।

ऐसा लगता है कि कवरेज को कुछ सी ++ 11 सुविधाओं, जैसे इनलाइन नेमस्पेस के साथ अपडेट नहीं किया गया है।

+0

यही समस्या है मैंने कभी भी "इनलाइन" का उपयोग नहीं किया है और यह नहीं पता कि यह वहां क्यों है। मैं यह लिखना भूल गया कि मैंने "नेमस्पेस" के साथ सभी "इनलाइन नेमस्पेस" को प्रतिस्थापित करने के लिए कवरिटी को भी कॉन्फ़िगर किया है, लेकिन फिर अंतिम दोनों की तरह अधिक समस्याएं दिखाई देती हैं। – Indimental

+0

इनलाइन नेमस्पेस एक सी ++ 11 सुविधा हैं। यह मुख्य रूप से पुस्तकालय कार्यान्वयन के संस्करण के लिए है। – bames53

+0

@ इंडिमेंटल आप नामस्थानों के साथ इनलाइन नेमस्पेस को प्रतिस्थापित नहीं कर सकते हैं, वे वही काम नहीं करते हैं, इसलिए लाइब्रेरी कार्यान्वयन सिर्फ काम नहीं करेगा और कवरिटी को इसका सही ढंग से विश्लेषण करने की कोई उम्मीद नहीं होगी। – bames53

5

आपकी लाइब्रेरी कार्यान्वयन सी ++ 11 का उपयोग कर रही है। संभवतः #ifdefs है जो सभी सी ++ 11 सामान को हटाते हैं जब आप -std=c++98 के साथ g ++ कॉल करते हैं लेकिन ऐसा लगता है कि हालांकि कवरिटी जी ++ के साथ एकीकृत है, यह सी ++ 11 सुविधाओं से बचने के लिए आवश्यक चीजों को परिभाषित नहीं कर रहा है।

आपको पता होना चाहिए कि जीसी उस सी ++ 11 कोड के आसपास किस मैक्रोज़ का उपयोग करता है और फिर यह सुनिश्चित कर लें कि कवरेज आपके प्रोजेक्ट का विश्लेषण करते समय उचित रूप से उन्हें परिभाषित कर रहा है।

+0

ऐसा लगता है कि यहां कुछ परिभाषित परिभाषाएं हैं: http://stackoverflow.com/questions/2958398/gnu-c-how-to-check-when-std-c0x-is-in-effect लेकिन मैं नहीं कर सकता त्रुटि लाइनों के लिए कोई कनेक्शन खोजें। त्रुटि लाइनों को लंबे डबल 128 बिट मॉडल के साथ करना है और सी ++ 0x परिभाषाओं में से किसी एक पर निर्भर नहीं है। मुझे यह भी कहना होगा कि मैं इस तरह की गहराई संकलक सामग्री के लिए बिल्कुल नया हूं। – Indimental

+0

जब आपने कवर किया है तो कवरिटी से त्रुटि संदेश बदलते हैं तो सी ++ 0x परिभाषित करता है? आपको अन्य परिभाषाएं भी हो सकती हैं। आप जीसीसी सूची को जो कुछ भी परिभाषित करते हैं उसे बना सकते हैं और उसके बाद इसे कवरिटी के लिए परिभाषित करने के लिए आवश्यक आधार के आधार पर उपयोग कर सकते हैं, या आप हेडर फाइलों की जांच कर सकते हैं ताकि वे यह देख सकें कि वे क्या जांचते हैं। – bames53

+0

जब मैं सी ++ 0x मानक का उपयोग करता हूं, तो पहले 3 त्रुटियां समान होती हैं। आखिरी दोनों को "stringfwd.h" में त्रुटियों से प्रतिस्थापित किया गया है: पहचानकर्ता "char32_t" अपरिभाषित है: टेम्पलेट <> struct char_traits ; "char16_t" पहचानकर्ता के लिए भी वही। क्या यह हो सकता है कि कवरिटी बिल्ड में कुछ डिफ़ॉल्ट शीर्षलेख शामिल हैं और वे मूल के साथ असंगत हैं? तो कुछ हैडर हेड कॉन्फ़िगरेशन ओवरराइट और chrashes है। – Indimental

संबंधित मुद्दे