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:
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
"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 –
"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? –
@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