2008-10-31 4 views

Répondre

34

Les assertions sont un moyen de vérifier explicitement les hypothèses que votre code fait, ce qui vous aide à retrouver beaucoup de bugs en limitant les problèmes possibles. Ils ne sont généralement évalués que dans une version "debug" spéciale de votre application, ils ne ralentiront donc pas la version finale. Supposons que vous ayez écrit une fonction qui a pris un pointeur en tant qu'argument. Il y a de bonnes chances que votre code suppose que le pointeur est non-NULL, alors pourquoi ne pas vérifier explicitement cela avec une assertion? Voici comment:

#include <assert.h> 

void function(int* pointer_arg) 
{ 
    assert(pointer_arg != NULL); 

    ... 
} 

Une chose importante à noter est que les expressions que vous revendiquez ne doit jamais avoir des effets secondaires, car ils ne seront pas présents dans la version release. Donc, ne jamais faire quelque chose comme ceci:

assert(a++ == 5); 

Certaines personnes aiment aussi ajouter de petits messages dans leurs assertions pour aider à leur donner un sens. Depuis une chaîne evaulates toujours vrai, vous pouvez écrire ceci:

assert((a == 5) && "a has the wrong value!!"); 
+0

Je n'ai pas vu l'anding avec une chaîne avant. Vraiment utile! –

+0

Cette sorte d'astuce (ou une variation similaire) est utilisée tout le temps en Perl-land, à savoir, en utilisant l'exemple donné: a == 5 || mourir ("a la mauvaise valeur"); Vive le typage booléen. –

+0

Une autre astuce dans les lignes de cette chaîne est lors de la validation de valeurs dans le code de version, mais en affirmant dans le code de débogage. Par exemple, utilisez d'abord une vérification if (x> 10), puis si la condition erronée passe, assergez simplement (! "X out of bounds"), puis imprimez dans un fichier journal, etc. – Marcin

6

Les assertions sont des expressions booléennes qui devraient toujours être vraies.

Ils sont utilisés pour s'assurer que ce que vous attendiez est également ce qui se passe.

void some_function(int age) 
{ 
    assert(age > 0); 
} 

Vous avez écrit la fonction pour traiter les âges, vous aussi « savoir » pour vous que vous êtes toujours passer des arguments sensés, vous utilisez un assert. C'est comme dire "Je sais que cela ne peut jamais aller mal, mais si c'est le cas, je veux savoir", parce que, bien, tout le monde fait des erreurs.

Il ne s'agit donc pas de vérifier l'entrée de l'utilisateur sensible, s'il y a un scénario où quelque chose peut mal tourner, n'utilisez pas un assert. Faites de vrais contrôles et traitez les erreurs.

Les assertions sont généralement réservées aux versions de débogage. Ne mettez donc pas de code avec des effets secondaires dans les assertions.

1

Une assertion est quelque chose que vous ajoutez à votre programme et qui provoque l'arrêt immédiat du programme si une condition est remplie, et affiche un message d'erreur. Vous les utilisez généralement pour des choses que vous croyez ne jamais arriver dans votre code.

0

Voici une definition de ce qu'une affirmation est et here est un exemple de code. En un mot, une affirmation est un moyen pour un développeur de tester ses hypothèses sur l'état du code à un moment donné. Par exemple, si vous faites le code suivant:

mypointer->myfunct(); 

Vous voulez probablement affirmer que MonPointeur n'est pas NULL parce que c'est votre hypothèse - que MonPointeur ne sera jamais NULL avant l'appel.

2

Les assertions sont des instructions vous permettant de tester toutes les hypothèses que vous pourriez avoir dans votre programme. Ceci est particulièrement utile pour documenter votre logique de programme (conditions préalables et postconditions). Les assertions qui échouent génèrent généralement des erreurs d'exécution, et sont des signes que quelque chose ne va pas du tout dans votre programme - votre assertion a échoué parce que quelque chose que vous pensiez être vrai ne l'était pas. Les raisons habituelles sont: il y a une faille dans la logique de votre fonction, ou l'appelant de votre fonction vous a transmis de mauvaises données.

6

Les assertions sont utilisées pour vérifier les hypothèses de conception, généralement en termes de paramètres d'entrée et de résultats de retour. Par exemple

// Given customer and product details for a sale, generate an invoice 

Invoice ProcessOrder(Customer Cust,Product Prod) 
{ 
    assert(IsValid(Cust)); 
    assert(IsValid(Prod); 
' 
' 
' 
    assert(IsValid(RetInvoice)) 
    return(RetInvoice); 

} 

Les déclarations assert ne sont pas nécessaires pour le code à exécuter, mais ils vérifient la validité de l'entrée et la sortie. Si l'entrée est invalide, il y a un bug dans la fonction d'appel. Si l'entrée est valide et que la sortie est invalide, il y a un bug dans ce code. Voir design by contract pour plus de détails sur cette utilisation des affirmations.

Modifier: Comme indiqué dans d'autres publications, l'implémentation par défaut de assert n'est pas incluse dans l'exécution de la version. Une pratique courante que beaucoup utiliseraient, y compris moi-même, consiste à la remplacer par une version incluse dans la version de publication, mais qui n'est appelée que dans un mode de diagnostic. Cela permet des tests de régression corrects sur les versions de version avec vérification complète des assertions. Ma version est la suivante.

extern void _my_assert(void *, void *, unsigned); 

#define myassert(exp)        \ 
{             \ 
    if (InDiagnostics)        \ 
     if (!(exp))        \ 
      _my_assert(#exp, __FILE__, __LINE__); \ 
}             \ 

Il y a une petite surcharge d'exécution dans cette technique, mais il fait le suivi des bugs qui ont fait dans le champ beaucoup plus facile.

3

Utilisez des assertions pour vérifier les situations «impossible».

Utilisation typique: vérifier les arguments invalides/impossibles en haut d'une fonction.

Rarement vu, mais toujours utile: invariants de boucle et post-conditions.

1

Cela ne répond pas à la assert installation qui est venu jusqu'à nous depuis les premiers jours C, mais vous devriez aussi être conscient de Boost StaticAssert fonctionnalité, dans le cas où vos projets peuvent utiliser Boost.

L'affirmation C/C++ standard fonctionne pendant l'exécution. La fonction Boost StaticAssert vous permet de créer des classes d'assertions au moment de la compilation, en détectant les erreurs de logique et autres encore plus tôt.

Questions connexes