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 ?
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 ?
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.
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é.
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.
Dans certains cas, l'affirmation peut être utilisée pour le débogage. http://simonwillison.net/2008/May/22/debugging/
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.