4 votes

ASSERT est-il redondant ?

ASSERT(pointer);
pointer->x;

Dans ce code, l'ASSERT semble être redondant. Si le pointeur est NULL, pointeur->x échouera de toute façon. Mon argument est-il correct ?

34voto

AndreyT Points 139512

L'objectif important (sinon principal) des assertions est de document les invariants qui sont supposés tenir à un certain point du code. Le fait que assert peut également interrompre le programme si l'invariant est rompu n'est que la cerise sur le gâteau, bien qu'elle soit très utile. Je dirais que dans un programme typique, 90% des assertions sont des assertions qui, de toute évidence, ne peuvent pas échouer et n'échoueront jamais. En d'autres termes, assert est, dans une large mesure, une sorte de langage de commentaires formalisé. Formalisé dans le sens où ces "commentaires" sont écrits dans le même langage que le reste du code (C/C++), et non en anglais.

Dans votre exemple de code, l'assertion est là pour vous dire que le pointeur n'est pas censé être nul ici. C'est pourquoi elle est là. Dans ce sens, cette assert n'est pas redondant.

En ce qui concerne le flux d'exécution, assert est toujours redondant, ce qui explique pourquoi les assertions ne sont généralement pas compilées dans la version du code. Rien ne vous empêche de conserver les assertions dans le code de la version finale, mais cela se fait normalement en introduisant un type spécial d'"assertion de version finale". Dans tous les cas, faire dépendre la fonctionnalité principale du code des actions prises par une assertion n'est pas une bonne pratique de programmation. Les assertions sont censées être redondantes, dans la mesure où la fonctionnalité principale du code est concernée.

19voto

Andrew Jaffe Points 9205

Oui, mais pointer->x échouera (je présume) de manière incontrôlée, alors que les assert échouera et vous dira exactement où.

Dans un certain sens, assert es siempre redondant, bien sûr.

3voto

Emil H Points 24062

Non, ce n'est pas redondant. L'assertion arrêtera l'exécution avant que quelque chose de mauvais ne se produise. D'un autre côté, si vous déréférencez un pointeur invalide, vous risquez de provoquer une véritable corruption, ou à tout le moins un segfault incontrôlé plutôt qu'un avortement contrôlé.

1voto

Pete Kirkham Points 32484

ASSERT ne fait pas partie de la norme C, et peut donc être n'importe quoi.

 #define ASSERT(x) do { \
     x = malloc ( sizeof *x ); \
     memset ( x, 0, sizeof *x );\
     } while ( 0 )

assert est une question différente.

Certaines personnes ont un ASSERT qui appelle le débogueur, d'autres en ont une qui fait d'autres débogages ou journalisations, et utilisent la fonction de stringification du pré-processeur.

Il faut vraiment dire ce que fait la macro pour que l'on sache si elle est importante.

0voto

Clash Points 1091

Dans certains cas, l'affirmation peut être utilisée pour le débogage. http://simonwillison.net/2008/May/22/debugging/

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