2009-07-24 3 views
3

Il existe une API propriétaire qui est construite au-dessus de C++. Il utilise donc toutes les fonctionnalités de C++ et possède ses propres API. Il y a des API qui fonctionnent exactement de la même manière que l'API C++ (comme pour malloc il y a Stralloc), ces API sont fournies pour des raisons de performances.Développement d'un outil d'analyse de code source statique pour API propriétaire

Bien qu'il existe de nombreux analyseurs de code statiques disponibles pour C++, nous ne pouvons en utiliser aucun. Il est nécessaire d'avoir un analyseur de code statique qui pourrait être exécuté sur le code avec des API propriétaires.

Je voudrais savoir comment je commence à développer l'analyseur de code. Il peut ne pas avoir besoin d'être très orienté fonctionnalité comme ceux disponibles pour C++. Je veux commencer par des choses de base comme le report de variables inutilisées, les débordements de mémoire tampon, les fuites de mémoire.

Toutes les indications seront appréciées.

[MISE À JOUR] J'ai trouvé la question suivante qui correspond à ce que je cherchais, seule différence: à la place de Java, je m'intéresse aux API propriétaires. Jusqu'à présent, j'ai quelques bonnes réponses, mais j'aimerais vraiment en savoir plus de la part de personnes qui ont vécu un tel développement.

Introduction to Static Analysis

Répondre

2

Je suis confus:

Est-ce une implémentation du langage au-dessus de C++ ou tout simplement un ensemble d'API au-dessus de C++? Si ce dernier, tout profileur C++ normal capture des choses comme des fuites de mémoire et des débordements.

+1

Mais sûrement un tel profileur sera confondu avec des choses comme boost :: bind, signaux, et d'autres constructions qui ajoutent des paradigmes non-impératifs à C++. – EFraim

+0

Comme je l'ai mentionné, il existe des API qui sont utilisées à la place des API C++. Par exemple, au lieu d'utiliser free(), l'API Strfree() est exactement identique à free() mais est utilisée pour des raisons de performances. Donc, tout analyseur C++ normal ne peut pas le reconnaître. – user32262

1

N'essayez pas d'écrire ceci à partir de zéro. C++ est notoirement difficile à analyser, et je ne pense pas que vous alliez loin sur cette route.

Vous devez utiliser un analyseur statique C++ extensible, de sorte que vous puissiez écrire vos propres plugins pour analyser vos appels de bibliothèque. Du haut de ma tête, je suggère:

  • Le gcc C++ front-end (gcc a maintenant des plugins)
  • Le EDG analyseur C++
  • Rose (utilise EDG)
  • LLVM (peut-être en utilisant clang, mais il pourrait ne pas être prêt pour primetime)
  • Microsoft Phoenix Framework (je suppose qu'il peut le faire, je n'ai pas vérifié).

La meilleure réponse est probablement clang ou rose.

2

Des solutions telles que Coverity et Klocwork ont ​​un jeu de règles extensible dans lequel vous pouvez écrire vos propres règles. Vous pouvez également configurer l'outil pour que les vérifications de la mémoire standard comprennent les allocateurs de mémoire personnalisés. Certaines limitations s'appliquent cependant.

Il est utile d'utiliser ces outils car vous pouvez ensuite emprunter le même flux de travail. Encore une fois, cela dépend de ce que vous codez et de ce que vous cherchez à faire exactement.

+0

Oui, il vaut mieux utiliser un outil existant que de réinventer la roue. La documentation de Coverity n'est pas accessible au public, mais Klocwork est; voir pour un exemple de création d'une entrée de base de connaissances pour une fonction qui se comporte comme malloc. (Bien que votre code source finisse par appeler malloc, vous n'aurez peut-être même pas besoin de le faire, Klocwork pourrait le trouver lui-même.) –

1

Analyser C++ est très difficile en pratique. Si vous avez un dialecte C++ étendu, vous avez besoin d'un analyseur C++ complet qui est "facilement" plié à votre dialecte, et qui a les moyens de construire des outils d'analyse.

Le DMS Software Reengineering Toolkit est une infrastructure générique d'analyse et de transformation entièrement personnalisable, fournissant des fonctions d'analyse générale, de construction d'arbres, de construction de tables de symboles et d'analyse de flux. Il est utilisé pour construire des analyseurs entièrement personnalisés.

Il a un qui gère plusieurs dialectes standard de C++, et peut être personnalisé pour gérer d'autres extensions. Le frontal C++ dispose de capacités complètes de préprocesseur, analyse et construit des AST, et effectue une analyse de nom et de type C++ complète.

Questions connexes