2008-09-08 5 views
57

Il ya many options pour l'analyse statique, et c'est un sujet brûlant, donc:Qu'est-ce que c'est l'analyse statique de code?

Qu'est-ce que l'analyse statique?

Quand devriez-vous l'utiliser et à quel moment ne devrait-il pas être utilisé?

Quels sont les pièges potentiels concernant l'utilisation et l'application inappropriées et inappropriées de l'analyse statique?

Toutes les langues qui n'ont pas un bon outil d'analyse statique, et que faites-vous lorsque vous n'avez pas d'option pour l'analyse automatisée?

-Adam

Répondre

84

What is static analysis?

code Analyse sans l'exécuter. Généralement utilisé pour trouver des bogues ou assurer la conformité aux directives de codage. L'exemple classique est un compilateur qui trouve des erreurs lexicales, syntaxiques et même quelques erreurs sémantiques.

When should you use it, and when shouldn't it be used?

Les outils d'analyse statique doivent être utilisés lorsqu'ils aident à maintenir la qualité du code. S'ils sont utilisés, ils devraient être intégrés dans le processus de construction, sinon ils seront ignorés.

What are potential gotchas regarding proper and improper usage/application of static analysis?

Deux pathologies fréquentes se produisent lors de l'utilisation des outils d'analyse statique:

  1. Les outils produit/avertissements fausses erreurs que les développeurs ne peuvent pas le silence. Finalement, la plupart des avertissements sont faux et les développeurs cessent de prêter attention à la sortie. C'est pourquoi de nombreuses équipes exigent que le code compile proprement. Si les développeurs se sentent à l'aise d'ignorer les avertissements du compilateur, la phase de compilation sera finalement remplie d'avertissements auxquels personne ne prête attention, même s'il peut s'agir de bugs.

  2. Les outils sont trop longs à exécuter et les développeurs ne prennent jamais la peine de les exécuter.

Any languages that don't have a good static analysis tool, and what do you do when you don't have an option for automated analysis?

Pour plusieurs raisons, la plupart des langages dynamiques (ruby, python, perl) ne disposent pas d'outils d'analyse statique qui sont aussi fortes que celles disponibles dans les langues statiques. La méthode standard pour trouver des bogues et s'assurer que le code fonctionne dans des langages dynamiques sont des tests unitaires qui aident à établir la confiance que le code fonctionne réellement (hat-tip: Chris Conway).

+6

"tests unitaires qui (théoriquement) prouvent que le code fonctionne réellement." Ne pas être pédant (oh, OK, être pédant), les tests unitaires ne «prouvent» rien, même pas «théoriquement». Les tests établissent la confiance dans l'exactitude, mais ils ne peuvent pas couvrir tous les comportements du –

+1

"ils devraient être intégrés dans le processus de construction" convenu. Cependant, déboguer et libérer des versions, ou l'un ou l'autre? –

+1

@ChrisConway Untrue; Si vous utilisez des preuves systématiques ou des conditions pré/post pour restreindre une fonction partielle ou totale donnée, vous pouvez utiliser des tests unitaires pour prouver ces cas de façon exhaustive (et donc avoir une preuve inductive que le code fait ce qu'il dit). Bien que ce ne soit pas facile pour de nombreuses fonctions à grande échelle ou valables, c'est certainement possible, à la fois théoriquement et pratiquement. – Alice

2

L'analyse statique examine le code source pour les problèmes potentiels. Il est appelé statique parce que le code n'est pas exécuté pour trouver les problèmes, la source est analysée analytiquement.

À l'heure actuelle, l'analyse statique est très immature. La plupart des outils ne trouvent que les bogues les plus stupides. Par exemple, aucun des outils que je connais ne peut trouver tous les déréférences de pointeur nul, mais c'est un bug évident que vous voudriez cibler avec l'analyse statique. Vous pouvez oublier d'essayer de trouver des bugs plus durs tels que les conditions de course avec analyse statique, pour le moment au moins.

L'analyse statique est particulièrement utile pour appliquer les normes de codage. FXCop, qui analyse le code .NET, contient des règles pour toutes sortes de défauts de normes de codage.Comme vous le dites, il existe de nombreux outils qui font de l'analyse statique. Voici une liste de produits gratuits que j'ai personnellement utilisé:

  • FindBugs (Java)
  • FXCop (.NET)
  • pylint (Python)

je peux recommander tous .

+1

L'analyse statique n'a pas besoin de regarder le code source. Il peut très bien s'agir d'un code objet ou intermédiaire. Par exemple, vous mentionnez FindBugs qui regarde les fichiers class (bytecode). –

+2

Analyse statique, immature? Je vois que vous n'avez jamais utilisé IntelliJ IDEA ...; ^) –

+2

Oui, Tom Reps a donné une conférence la semaine dernière à Stanford sur l'analyse statique du code machine, http://www.cs.wisc.edu/wpis/abstracts/wysinwyx. submission.abs.html. Pour un exemple d'une vulnérabilité non visible dans la source, voir , , , et . –

0

En plus de trouver des bogues dans votre code (tels que le déréférencement nul de pointeur garanti, les boucles infinies, etc.), l'analyse statique peut être utilisée pour l'analyse de sécurité du code. Je vous recommande fortement de regarder la présentation "Secure Programming with Static Analysis" de Brian Chess du logiciel Fortify.

1

L'analyse statique (également appelée analyse de code statique, analyse de code source, analyse de programme statique) est une activité de vérification logicielle dans laquelle le code source est analysé pour la qualité, la sécurité et la sécurité. Cette analyse permet aux développeurs de logiciels et aux testeurs d'identifier et de diagnostiquer divers types de bogues/erreurs tels que les dépassements, la division par zéro, les erreurs de mémoire et de pointeur, les erreurs d'exécution et d'autres problèmes. Les métriques produites par l'analyse de code statique fournissent un moyen par lequel la qualité de logiciel peut être mesurée et améliorée. Contrairement à d'autres techniques de vérification, l'analyse statique est automatisée et peut donc être effectuée sans exécuter le programme ou développer des cas de test.

Des techniques sophistiquées couplent l'analyse de code statique à des méthodes formelles. Les méthodes formelles appliquent les principes fondamentaux de la science informatique pour résoudre des problèmes complexes dans les logiciels, comme prouver que le logiciel n'échouera pas avec une erreur d'exécution. La combinaison de l'analyse de code statique et des méthodes formelles permet aux développeurs de détecter les erreurs difficiles à trouver et de prouver l'absence de certains types de bogues/erreurs. Par exemple. ces techniques peuvent prouver que la ligne de code suivante ne sera jamais échouer avec une division par zéro erreur d'exécution:

int x, y; 
... 
x = x/(x - y); 

En analyse générale, statique doit être utilisé tôt dans le processus de développement, de préférence avant le test unitaire. Cela permet le développement de code robuste. L'analyse statique peut également être couplée avec des systèmes de construction pour produire des métriques de qualité et fournir des indications sur la sécurité et la fiabilité du logiciel. Cependant, l'utilisation tardive de l'analyse statique en général peut nécessiter plus de temps et de ressources pour résoudre les problèmes identifiés.

Une variété d'outils d'analyse statique open source, académique et commerciale sont disponibles. La plupart des langues sont supportées.En savoir plus sur ce sujet aux liens suivants

19

What is static analysis?

Analyse statique nous permet de raisonner sur toutes les exécutions possibles d'un programme. Il donne l'assurance au sujet de toute exécution, avant le déploiement, mais des outils commerciaux dépenser beaucoup d'efforts face à la confusion des développeurs, des faux positifs, etc

What are potential gotchas regarding proper and improper usage/application of static analysis?

principal problème est l'abstraction. L'abstraction nous permet de modéliser et de modéliser toutes les exécutions possibles, mais elle doit être conservatrice, en essayant d'équilibrer la précision et l'évolutivité. abstractions d'analyse statique ne correspondent pas à proprement abstractions de développement

When should you use it, and when shouldn't it be used?

Le but principal est pour les tests de code et l'entretien comme il convient bien avec les développeurs intuitions. En pratique, c'est la forme la plus courante de détection de bogues mais chaque test explore seulement une exécution possible du système. Voici un exemple d'analyse statique utilisant l'exécution symbolique où l'idée maîtresse est de généraliser les tests en utilisant des variables symboliques inconnues dans l'industrie de la sécurité. évaluation où nous suivons des états symboliques. Si le chemin d'exécution dépend d'inconnue, on exécute un exécuteur symbolique. Lors de l'exécution symbolique, nous essayons de déterminer si certaines formules sont satisfaisantes (par exemple, un point particulier du programme est-il inaccessible?

int a = α, b = β, c = γ; 
// symbolic 
int x = 0, y = 0, z = 0; 
if (a) { 
    x = -2; 
} 
if (b < 5) { 
    if (!a && c) { y = 1; } 
    z = 2; 
} 
assert(x+y+z!=3) 

Et l'analyse de ce simple exemple de code: Static code Analysis

Voici quelques liens utiles pour solveurs SMT/SAT qui sont utilisés pour l'analyse de code statique:

SAT solving, SMT solving and Program Verification

List of tools for Static Code Analysis

Symbolic Execution, SAT solving, SMT solving and Program Verification

Symbolic Execution Harvard CS252r

+0

Je pense que cela montre comment "Analyse statique" est utilisé pour signifier beaucoup de choses différentes par des personnes différentes. Pour moi, SA est un mélange de ceci avec une grande partie de la réponse d'AaronMaenpaa (http://stackoverflow.com/a/49731/11698). –

+0

@Geo, Que signifie la croix et les croix dans ce diagramme? – Pacerier

+0

@Pacerier Notez que 'assert (x + y + z! = 3)' devient False sur ce chemin spécifique avec la croix rouge. – BugShotGG

Questions connexes