27 votes

Analyse de fil statique: bonne idée?

J'aide à maintenir et à construire sur un assez grand Swing GUI, avec beaucoup d'interactions complexes. Souvent, je me retrouve à la correction des bugs qui sont le résultat de choses s'en impair de membres en raison de certaines condition de course quelque part ailleurs dans le code.

Comme le code de base est grande, je l'ai trouvé il est devenu de moins en moins cohérente sur la spécification au moyen de documents qui ont des méthodes de filetage restrictions: le plus souvent, les méthodes qui doivent être exécutées sur la Balançoire (HAE). De même, il serait utile de connaître et de fournir statique de la conscience dans laquelle (de notre coutume) les auditeurs sont informés sur l'EDT par la spécification.

Alors il est venu à moi, que ce devrait être quelque chose qui pourrait être facilement appliquée à l'aide d'annotations. Lo et voici, il existe au moins un outil d'analyse statique, CheckThread, qui utilise les annotations pour accomplir cette tâche. Il semble pour vous permettre de déclarer une méthode pour être confiné à un thread spécifique (le plus souvent le HAE), et le drapeau des méthodes qui tentent d'appeler cette méthode sans se déclarer comme confiné à ce thread.

Ainsi, sur la surface, cela semble juste comme une faible douleur, énorme gain de plus de la source et le cycle de production. Mes questions sont les suivantes:

  • Existe-il des histoires de réussite pour les personnes utilisant CheckThread ou bibliothèques similaires à appliquer le filetage des contraintes? Toutes les histoires d'échec? Pourquoi réussite/échec?
  • Est-ce bien dans la théorie? Y sont théoriques inconvénients?
  • Est-ce une bonne pratique? Est-il utile? Ce type de valeur est-il livré?
  • Si cela fonctionne dans la pratique, ce sont de bons outils pour soutenir cela? Je viens de trouver CheckThread mais admettre que je ne suis pas entièrement sûr de ce que je suis à la recherche pour trouver d'autres outils qui font la même chose.

Je sais pas si c'est bon pour nous, cela dépend de notre scénario. Mais je n'ai jamais entendu parler de personnes utilisant quelque chose comme ceci dans la pratique, et pour être honnête, il ne semble pas avoir pris beaucoup de certains la navigation générale. Alors je me demandais pourquoi.

8voto

Ira Baxter Points 48153

Cette réponse est plus centrée sur la théorie de l'aspect de votre question.

Fondamentalement, vous faites une affirmation: "Cette méthode ne fonctionne que sous certains threads". Cette affirmation n'est pas vraiment différent de toute autre affirmation que vous pourriez faire ("La méthode accepte que des nombres entiers de moins de 17 pour le paramètre X"). Les questions sont

  • Où faire de telles affirmations viennent?
  • Peut analyseurs statiques de les vérifier?
  • Où obtenez-vous d'un analyseur statique?

La plupart de ces affirmations viennent des concepteurs de logiciels, car ils sont les seuls à connaître les intentions. Le terme traditionnel pour ce qui est de "la Conception par Contrat", bien que la plupart des DBC les thèmes ne sont plus de l' actuel programme de l'état (C affirmer macro) et ils devraient vraiment être sur les programmes passés et futurs états ("temporal affirmations"), e.,g., "Cette routine va allouer un bloc de stockage, et éventuellement un morceau de code désallouer". On peut construire des outils qui tentent de déterminer hueristically ce que les affirmations sont (par exemple, Engler l'affirmation de l'induction du travail; d'autres ont fait des travaux dans ce domaine). C'est utile, mais les faux positifs sont un problème. En tant que pratique, de demander aux concepteurs de code de telles affirmations ne semble pas particulièrement onéreux, et il est très bon à long terme de la documentation. Si vous le code de telles affirmations avec un "Contrat" construction du langage, ou avec un si l'énoncé ("si le Débogage && Pas(affirmation) Puis Fail();") ou de les cacher dans une annotation est vraiment juste une question de commodité. Son agréable quand le langage permet de code de telles affirmations directement.

La vérification de telles affirmations statiquement est difficile. Si vous vous en tenez à l'état actuel seulement, l'analyseur statique assez bien pour faire le plein de flux de données de l'analyse de l'ensemble de votre application, parce que l'information nécessaire à la satisfaction de l'affirmation provient probablement de données créées par une autre partie de l'application. (Dans votre cas, le "à l'intérieur de l'EDT" signal doit venir de l'analyse sur l'ensemble du graphe d'appel de l'application pour voir si il n'y a aucun appel de chemin qui mène à la méthode à partir d'un thread qui n'est PAS le HAE sujet). Si vous utilisez les propriétés temporelles, la statique de vérifier assez bien les besoins une sorte d'état-vérification de l'espace disque logique en plus; ce sont actuellement encore assez bien les outils de recherche. Même avec toutes ces machines, analyseurs statiques, en général, doivent être "conservateur" dans leur anlayses; si ils ne peuvent pas démontrer que quelque chose est faux, ils ont assez bien l'assumer, il est vrai, à cause du problème de l'arrêt.

Où obtenez-vous ces analyseurs? Compte tenu de toutes les machines nécessaires, ils sont difficiles à construire et donc vous devriez vous attendre à être rares. Si quelqu'un a construit une, grande. Si non... en règle générale, vous ne voulez pas le faire vous-même à partir de zéro. Le meilleur à long terme de l'espoir est d'avoir le générique de l'analyse du programme des machines disponibles pour construire de tels analyseurs, pour amortir le coût de la construction de toutes les infrastructures. (I programme de construction d'outil analyseur de fondations; voir notre Logiciel DMS Réingénierie Toolkit).

Une façon de le rendre "plus facile" pour construire de tels analyseurs statiques est de restreindre les cas qu'ils manipulent à portée étroite, par exemple, CheckThread. Je m'attends à CheckThread à faire exactement ce qu'elle actuellement, et il serait peu probable d'obtenir une beaucoup plus forte.

La raison qui "affirment" macros et d'autres dynamiques "état actuel" des vérifications sont populaires, c'est qu'ils peuvent réellement être mis en œuvre par une simple exécution de test. C'est assez pratique. Le problème ici est que vous ne peut jamais exercer un chemin qui mène à l'échec d'une des conditions. Ainsi, pour l'analyse de la dynamique, de l'absence de détection d'une défaillance n'est pas vraiment une preuve de la justesse. Se sent toujours bien.

Bottom line: analyseurs statiques et dynamiques des analyseurs ont chacun leur force.

3voto

Matt McHenry Points 6269

Nous n'avons pas essayé d'outils d'analyse statique, mais nous avons utilisé AspectJ pour écrire un aspect simple qui détecte lors de l'exécution lorsqu'un code dans java.awt ou javax.swing est appelé en dehors de l'EDT. Il a trouvé plusieurs endroits dans notre code qui manquaient un SwingUtilities.invokeLater() . Nous fonctionnons avec cet aspect activé tout au long de notre cycle d'assurance qualité, puis désactivons-le peu de temps avant la publication.

2voto

Flash Sheridan Points 1013

Comme demandé, cela ne concerne pas spécifiquement de Java ou de l'EDT, mais j'ai vu des bons résultats avec Coverity de simultanéité de l'analyse statique pions pour le C/C++. Ils n'ont plus le taux de faux positifs que moins compliqué de dames, mais le code des propriétaires semblait prêt à mettre en place avec cela, étant donné la façon dont dur filetage bugs peut être de trouver par l'essai. Les détails sont confidentiels, j'ai peur, mais Dawson Engler de documents publics (par exemple, des "Bugs" comme un Comportement Déviant") sont très bons sur l'approche générale de "La suite «N» instances de votre code «X» avant de faire «Y»,; cet exemple ne fonctionne pas."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X