Comment obtenir Coverity analyse statique compatible avec le C++0x standard?
Je suis à l'aide d'un Fleuve de Vent Compilateur 4 (gcc (C) et g++ (C++)) et il compile tous mes projets sans aucun problème. Maintenant, je dois utiliser Coverity Analyse Statique pour vérifier mon code. J'ai configuré le spécifique compilateurs. Pour le Code C (gcc) il n'y a pas de problèmes et je peux lancer l'analyse, mais pour le C++-Code (g++), j'ai fait beaucoup d'erreurs:
.../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 être en C++11 caractéristiques spécifiques comme la ligne de l'espace de noms mais le code n'utilisez pas ces fonctions. 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 définir le standard c++ avec la g++ option
-std=c++98
mais le résultat n'a pas changé.
Le Test-Code est dans une grande construire la hiérarchie, mais les étapes de Coverity sont comme ceci:
- cible et env set (Wind River 4 Linux)
- faire propre
- cov-configuration avec le compilateur dir et le type
- cov-construire avec l'correcte "faire ensemble" de commande qui travaille seul
- cov-analyser
- si (no_error) cov-commit-défauts
J'ai également configuré Coverity à remplacer tous les "inline espace de noms" avec "espace de noms" pendant le cov-construire (--ppp-translator replace/inline namespace/namespace
). Le inline erreurs disparu, mais il produit plus de cette surcharge erreurs et pas de succecfully construire. Aussi essayé de supprimer le "C++" de la même façon mais qui n'ont pas de travail il y a toujours plus d'erreurs.
Quelqu'un a une idée de quel est le problème ici? Et comment puis-je obtenir le Coverity compiler sans erreurs? Peut-être que je peux configurer Coverity ignorer c++ standard en-têtes, mais je ne sais pas maintenant comment?
Le WindRiver Env. est WR-Linux-4.0/Toolchain-4.4-291 et de la gcc qui est utilisé semble être la version 4.4.1. C'est la version de l'inclure dir de la gcc au cours du script de construction. Je suis également en contact avec le support: Le problème est que, en particulier WindRiver Compilateur ne sont pas pris en charge sous Linux, mais presque aucun compilateur gcc. Ils ont maintenant la séquence de la source et de l'examiner. Aussi la WindRiver prise en charge est désormais impliqués.
Obtenu de réponse à partir de Coverity Soutien et nous essayons maintenant de faire une solution de contournement.
Coverity fournit maintenant un préconfiguré bundle surtout pour WindRiver Environnements. Voir: windriver.com/announces/coverity-static-analysis
OriginalL'auteur Indimental | 2012-01-19
Vous devez vous connecter pour publier un commentaire.
Votre bibliothèque de la mise en œuvre est à l'aide de C++11. Sans doute il y a
#ifdefs
que supprimer toutes les C++11 choses lorsque vous faites appel g++ avec-std=c++98
mais il semble que cependant Coverity est intégré avec g++, ce n'est pas la définition même des choses qui sont nécessaires afin d'éviter le C++11 caractéristiques.Vous devez comprendre ce que les macros que gcc utilise que C++11 code et assurez-vous que Coverity est de définir de façon appropriée lorsqu'il analyse votre projet.
A les messages d'erreur de Coverity changer lorsque vous faites Coverity utiliser ces C++0x définit? Il y a peut être d'autres définit dont vous avez besoin. Vous pouvez faire gcc liste de tout ce qu'il définit et ensuite l'utiliser comme une base pour ce que vous avez besoin de définir de Coverity, ou vous pouvez simplement examiner les fichiers d'en-tête pour voir ce qu'ils vérifier.
Lorsque j'utilise le C++0x standard, les 3 premières erreurs sont les mêmes. Les deux derniers sont remplacés par des erreurs dans "stringfwd.h": identificateur "char32_t" n'est pas défini: template<> struct char_traits<char32_t>; de même pour les "char16_t" identificateur. Se peut-il que Coverity construire comprend certains en-têtes par défaut et qu'ils sont incompatibles avec l'autochtone comprend? Si il ya quelque chose écrasé et chrashes l'en-tête de config.
Je suppose que ça pourrait être. En outre, il pourrait être que du CCG en-têtes de toujours l'utiliser en C++11 caractéristiques, même lorsque vous désactivez le C++11, et que GCC est faite de travailler avec cela.
OriginalL'auteur bames53
Solution de contournement par Coverity Soutien:
La ligne de l'espace de noms est un bug connu de Coverity. Pour le contourner, configurer Coverity avec les options supplémentaires suivantes (dans le fichier de configuration):
Après que nous avons eu quelques autres erreurs, mais ils semblent appartenir tous à la chaîne de définitions. Maintenant, ajoutez un Coverity définir, dès le début de coverity-compilateur-compat.h (également dans la config dir):
Après ces changements, le cov-construire s'exécute sans erreur et l'analyse peut être lancée.
OriginalL'auteur Indimental
Cette erreur dit très clairement:Est là une bonne raison de l'espace de noms est
inline
? Alors que je n'ai pas la spécification disponible, donc je ne peux pas vous dire si c'est autorisé ou pas. (Que le compilateur permet, il peut être un bug de GCC.)Essayer d'enlever cetteinline
et Coverity espérons, par un heureux.Il semble que Coverity n'a pas été mis à jour avec le C++11 caractéristiques, comme inline espaces de noms.
inline espaces de noms sont en C++11 fonctionnalité. C'est principalement pour la gestion des versions d'une bibliothèque mise en œuvre.
vous ne pouvez pas simplement remplacer inline espaces de noms avec des espaces de noms, ils ne font pas la même chose, de sorte que la mise en œuvre de bibliothèque ne va pas fonctionner et Coverity de ne pas avoir tout espoir de les analyser correctement.
année, vous avez raison, mais je pensais que je n'avais pas les utiliser et voulez seulement un moyen d'obtenir Coverity faire quoi que ce soit. En fait j'ai déjà supprimé tous ces remplacements.
OriginalL'auteur Some programmer dude