7

Sto usando un Wind River Compiler 4 (gcc (C) e g ++ (C++)) e compila tutti i miei progetti senza problemi. Ora devo usare Coverity Static Analysis per verificare il mio codice. Ho configurato i compilatori specifici. Per il C-Code (GCC) non ci sono problemi e posso eseguire l'analisi, ma per il C++ - Codice (g ++) ho avuto un sacco di errori:Come ottenere l'analisi statica Coverity compatibile con lo standard C++ 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) 
        ^

E sembrano essere un po 'C++ 11 caratteristiche specifiche come lo spazio dei nomi inline ma il codice non usa queste funzionalità. Gli errori sopra sono prodotte con un HelloWorld-Code:

#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; 
} 

ho cercato di impostare lo standard C++ con l'opzione g ++

-std=c++98 

ma il risultato non cambiato.

Il Test-Code è in una gerarchia di grande costruzione, ma i passaggi per Coverity sono come questa:

  1. target e ENV set (Wind River 4 Linux)
  2. make clean
  3. COV-configure con il compilatore dir e il tipo
  4. COV-costruire con la corretta "fare tutto" comando che lavora da solo
  5. COV-analizzare
  6. se (NO_ERROR) COV-comm da-difetti

Ho anche configurato Coverity per sostituire tutti "namespace in linea" con "namespace" durante il COV-build (--ppp-translator replace/inline namespace/namespace). Gli errori in linea sono scomparsi, ma produce più di questi errori di sovraccarico e non si costruisce con successo. Anche provato a rimuovere il "C++" allo stesso modo ma non ha funzionato ci sono sempre più errori.

Qualcuno ha un'idea di quale sia il problema qui? E come posso ottenere la build Coverity senza errori? Forse posso configurare Coverity per ignorare le intestazioni standard di C++ ma non ora come?

+0

Quale versione di gcc stai usando? 4 non è abbastanza specifico. Ad ogni modo, dovresti aprire un caso con [email protected] - invia loro il tuo log di build e la sorgente preelaborata e saranno in grado di dirti cosa devi aggiungere alla tua configurazione per consentire a cov-emit di elaborarlo con successo. –

+0

The WindRiver Env. è WR-Linux-4.0/Toolchain-4.4-291 e il gcc che viene utilizzato sembra essere la versione 4.4.1. Questa è la versione della directory di inclusione di gcc durante lo script di build. Ora sono anche in contatto con il supporto: il problema è che in particolare WindRiver Compiler non è supportato in Linux, ma quasi * qualsiasi * compilatore gcc. Hanno ora la fonte preelaborata ed esaminarla. Anche il supporto WindRiver è ora coinvolto. – Indimental

+0

Hai ricevuto risposta dal Coverity Support e ora stiamo cercando di risolvere il problema. – Indimental

risposta

4

Soluzione da Support Coverity:

Lo spazio dei nomi in linea è un bug noto in Coverity. Per bypassare esso, configurare Coverity con le seguenti opzioni aggiuntive (nel file di configurazione):

<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> 

Dopo che abbiamo ottenuto alcuni altri errori ma sembrano appartenere tutti a Stringa. Ora aggiungere un Coverity definire all'inizio del Coverity-compiler-compat.h (anche nella directory di configurazione):

#define __COVERITY_NO_STRING_NODEFS__ 

Dopo queste modifiche il COV-build eseguito senza errori e l'analisi può essere avviato.

0

Questo errore lo dice chiaramente:

linea identificatore consentito sulle dichiarazioni di funzione solo

C'è una ragione lo spazio dei nomi è inline? Anche se non ho le specifiche disponibili, quindi non posso dirti se è permesso o meno. (Che il compilatore lo consenta potrebbe essere un bug in GCC.)

Provare a rimuovere quello inline e Coverity si spera per felice.

Sembra che Coverity non sia stato aggiornato con alcune funzionalità del C++ 11, come gli spazi dei nomi in linea.

+0

Questo è il problema che non ho mai usato questo "in linea" e non so perché è lì dentro. Ho dimenticato di scrivere che ho anche configurato Coverity per sostituire tutti "namespace inline" con "namespace", ma poi ci sono altri problemi come gli ultimi entrambi. – Indimental

+0

Gli spazi dei nomi in linea sono una funzione di C++ 11. È principalmente per la versione di un'implementazione di libreria. – bames53

+0

@Indimental non puoi semplicemente sostituire spazi dei nomi in linea con namespace, non fanno la stessa cosa, quindi l'implementazione della libreria non funzionerà e Coverity non avrà alcuna speranza di analizzarlo correttamente. – bames53

5

L'implementazione della libreria utilizza C++ 11. Presumibilmente ci sono #ifdefs che rimuovono tutte le cose C++ 11 quando chiamate g ++ con -std=c++98 ma sembra che Coverity sia integrato con g ++, non sta definendo le stesse cose che sono necessarie per evitare le caratteristiche del C++ 11.

Dovresti capire quali sono le macro che gcc usa attorno al codice C++ 11 e quindi assicurarti che Coverity le stia definendo in modo appropriato anche quando analizza il tuo progetto.

+0

Sembra che ci siano alcune definizioni qui descritte: http://stackoverflow.com/questions/2958398/gnu-c-how-to-check-when-std-c0x-is-in-effect ma non posso trova qualsiasi connessione alle righe di errore. Le righe di errore hanno a che fare con un lungo modello a 128 bit e non dipendono da uno dei C++ 0x definiti. Devo anche dire che sono totalmente nuovo in questo tipo di compilatore di profondità. – Indimental

+0

I messaggi di errore di Coverity sono cambiati quando hai fatto usare Coverity quelli definiti da C++ 0x? Potrebbero esserci altre definizioni di cui hai bisogno. Puoi rendere gcc elencare tutto ciò che definisce e utilizzarlo come base per ciò che devi definire per Coverity, oppure puoi semplicemente esaminare i file di intestazione per vedere cosa cercano. – bames53

+0

Quando uso lo standard C++ 0x, i primi 3 errori sono gli stessi. Gli ultimi due sono sostituiti da errori in "stringfwd.h": identificatore "char32_t" non definito: template <> struct char_traits ; lo stesso per l'identificatore "char16_t". Può essere che la build di Coverity includa alcune intestazioni predefinite e che siano incompatibili con quelle native? Quindi c'è qualcosa che sovrascrive e blocca la configurazione dell'intestazione. – Indimental