2011-04-09 4 views
0

Y a-t-il des langages avec la possibilité de déclarer global assertions - c'est une assertion qui devrait être maintenue pendant toute l'exécution du programme. Alors qu'il serait possible d'écrire quelque chose comme:assertions «global»?

global assert (-10 < speed < 10); 

et cette affirmation sera vérifiée chaque fois que l'état speed changements?

Répondre

-1

Je ne suis pas au courant des langues que vraiment faire une telle chose, et je doute qu'il en existe car c'est quelque chose qui est assez difficile à mettre en œuvre et en même temps pas quelque chose que beaucoup de Les gens ont besoin.
Il est souvent préférable de simplement affirmer que les entrées sont valides et que les modifications ne sont effectuées que lorsqu'elles sont autorisées et d'une manière définie et saine. Ceci conclut à la nécessité de "affirmations globales".

Vous pouvez obtenir cet effet « à travers la porte dérobée » de plusieurs façons, mais aucune est vraiment élégante, et deux sont plutôt système dépendant:

  • Si votre langue permet à l'opérateur une surcharge (comme par exemple C++) , vous pouvez créer une classe surchargeant n'importe quel opérateur qui modifie la valeur. C'est un travail considérable, mais d'un autre côté trivial, faire les assertions là-dedans.
  • Sur presque tous les systèmes, vous pouvez modifier la protection des pages de mémoire qui appartiennent à votre processus. Vous pouvez mettre la variable (et toutes les autres variables que vous voulez affirmer) séparément et définir la page en lecture seule. Cela provoquera une erreur de segmentation lorsque la valeur est écrite, que vous pouvez capturer (et vérifier que l'assertion est vraie). Windows le rend même explicitement disponible via des «pages de garde» (qui ne sont en réalité que des «pages en lecture seule déguisées»).
  • La plupart des processeurs modernes prennent en charge les points d'arrêt matériels. À moins que votre programme ne fonctionne sur une plate-forme très exotique, vous pouvez les exploiter pour avoir un contrôle plus précis de la même manière que si vous manipulez les protections. Voir par exemple this article sur un autre site, qui décrit comment le faire sous Windows sur x86. Cette solution vous obligera à écrire une sorte de "mini-débogueur" et implique que vous pourriez avoir des problèmes lors de l'exécution de votre programme sous un vrai débogueur.
1

eiffel prend en charge tous les différents contrats: précondition, postcondition, invariant ... vous voudrez peut-être l'utiliser. Par contre, pourquoi avez-vous une variable globale? pourquoi ne créez-vous pas une classe qui modifie la vitesse. Ce faisant, vous pouvez facilement vérifier votre état chaque fois que la valeur change.