7

J'utilise un Wind River Compiler 4 (gcc (C) et g ++ (C++)) et compile tous mes projets sans aucun problème. Maintenant, je dois utiliser Coverity Static Analysis pour vérifier mon code. J'ai configuré les compilateurs spécifiques. Pour le code C (gcc) il n'y a aucun problème et je peux exécuter l'analyse, mais pour le C++ - code (g ++) j'ai eu beaucoup d'erreurs:Comment obtenir une analyse statique de Coverity compatible avec C++ 0x standard?

.../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) 
        ^

Il semble y avoir quelques C++ 11 fonctionnalités spécifiques comme l'espace de noms inline mais le code n'utilise pas ces fonctionnalités. Les erreurs ci-dessus sont produites avec 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; 
} 

j'ai essayé de régler le C++ standard avec g ++ Option

-std=c++98 

mais le résultat n'a pas changé.

Le test de code est dans une grande hiérarchie de construction, mais les étapes de Coverity sont comme ceci:

    cible
  1. et ensemble env (Wind River 4 Linux)
  2. make clean
  3. cov-configure avec le compilateur et le type dir
  4. cov-construire avec le bon "faire toute commande" qui fonctionne seul
  5. cov-analyser
  6. si (no_error) cov-comm il-défauts

J'ai également configuré Coverity pour remplacer tout «espace de noms en ligne» par «espace de noms» pendant la cov-build (--ppp-translator replace/inline namespace/namespace). Les erreurs en ligne ont disparu mais cela produit plus de ces erreurs de surcharge et ne génère pas correctement. Aussi essayé d'enlever le "C++" de la même manière, mais n'a pas fonctionné, il y a toujours plus d'erreurs.

Quelqu'un a-t-il une idée de ce qui est le problème ici? Et comment puis-je obtenir la version Coverity sans erreurs? Peut-être que je peux configurer Coverity pour ignorer les en-têtes standard C++ mais je ne sais pas comment?

+0

Quelle version de gcc utilisez-vous? 4 n'est pas assez spécifique. Quoi qu'il en soit, vous devriez ouvrir un dossier avec [email protected] - envoyez-leur votre journal de construction et source prétraité et ils seront en mesure de vous dire ce que vous devez ajouter à votre configuration pour permettre à cov-emit de le traiter avec succès. –

+0

Le WindRiver Env. est WR-Linux-4.0/Toolchain-4.4-291 et le gcc qui est utilisé semble être la version 4.4.1. C'est la version du répertoire include de gcc pendant le script de construction. Je suis maintenant aussi en contact avec le support: Le problème est que WindRiver Compiler n'est pas particulièrement supporté sous Linux, mais presque * n'importe quel compilateur gcc. Ils ont maintenant la source prétraité et l'examinent. Le support WindRiver est également impliqué. – Indimental

+0

Réponse de Coverity Support et nous essayons maintenant de faire une solution de contournement. – Indimental

Répondre

4

Solution par Coverity soutien:

L'espace de noms en ligne est un bogue connu dans Coverity. Pour contourner, configurer Coverity avec les options supplémentaires suivantes (dans le fichier de configuration):

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

Après que nous avons eu d'autres erreurs, mais ils semblent appartenir à toutes les définitions de chaîne. Maintenant, ajoutez un Coverity définir au début de Coverity compilateur-compat.h (également dans le répertoire config):

#define __COVERITY_NO_STRING_NODEFS__ 

Après ces changements, le CoV-build fonctionne sans erreurs et l'analyse peut être démarré.

0

Cette erreur dit très clairement:

spécificateur en ligne autorisés sur les déclarations de fonction ne

Y at-il une raison pour laquelle l'espace de noms est inline? Bien que je n'ai pas la spécification disponible, je ne peux pas vous dire si c'est autorisé ou non. (Que le compilateur le permet peut-être un bug dans GCC.)

Essayez d'enlever ce inline et Coverity sera heureusement par heureux. Il semble que Coverity n'a pas été mis à jour avec certaines fonctionnalités C++ 11, comme les espaces de noms en ligne.

+0

C'est le problème que je n'ai jamais utilisé ce "inline" et je ne sais pas pourquoi il est là. J'ai oublié d'écrire que j'ai également configuré Coverity pour remplacer tout "espace de noms en ligne" par "espace de noms", mais il apparaît alors plus de problèmes comme le dernier à la fois. – Indimental

+0

Les espaces de noms en ligne sont une fonctionnalité C++ 11. C'est principalement pour la version d'une implémentation de bibliothèque. – bames53

+0

@Indimental vous ne pouvez pas simplement remplacer les espaces de noms en ligne par des espaces de noms, ils ne font pas la même chose, donc l'implémentation de la bibliothèque ne fonctionnera pas et Coverity n'aura aucun espoir de l'analyser correctement. – bames53

5

L'implémentation de votre bibliothèque utilise C++ 11. Vraisemblablement, il y a #ifdefs qui supprime tous les trucs C++ 11 quand vous appelez g ++ avec -std=c++98 mais il semble que Coverity soit intégré à g ++, il ne définit pas les mêmes choses qui sont nécessaires pour éviter les fonctionnalités C++ 11.

Vous devez déterminer quelles sont les macros utilisées par gcc autour de ce code C++ 11, puis assurez-vous que Coverity les définit correctement lorsqu'il analyse votre projet.

+0

Il semble qu'il existe quelques définitions décrites ici: http://stackoverflow.com/questions/2958398/gnu-c-how-to-check-when-std-c0x-is-in-effect mais je ne peux pas trouver une connexion aux lignes d'erreur. Les lignes d'erreur doivent faire avec le modèle long 128 bits double et ne dépendent pas de l'une des définitions C++ 0x. Je dois aussi dire que je suis totalement nouveau dans ce genre de compilateur. – Indimental

+0

Les messages d'erreur de Coverity ont-ils changé lorsque vous avez utilisé Coverity pour utiliser ces définitions C++ 0x? Il peut y avoir d'autres définitions dont vous avez besoin. Vous pouvez faire en sorte que gcc lise tout ce qu'il définit et ensuite l'utiliser comme base pour ce que vous devez définir pour Coverity, ou vous pouvez simplement examiner les fichiers d'en-tête pour voir ce qu'ils vérifient. – bames53

+0

Lorsque j'utilise le standard C++ 0x, les 3 premières erreurs sont les mêmes. Les deux derniers sont remplacés par des erreurs dans "stringfwd.h": l'identifiant "char32_t" est indéfini: template <> struct char_traits ; Idem pour l'identifiant "char16_t". Peut-il être que Buildity inclut des en-têtes par défaut et qu'ils sont incompatibles avec les inclusions natives? Donc, il y a quelque chose d'écrasé et chrash la config en-tête. – Indimental

Questions connexes