Question

peut-il jamais arriver? 3 AFFIRME, où l'on doit activer.

int nr = perform_calc();
assert( nr == 0);
assert( nr > 0);
assert( nr < 0);

Peut-il y avoir un cas où le programme ne déclenche pas la g ++ sur affirme 3.4.4.

Et non, je ne pas la possibilité de modifier le code afin d'imprimer le numéro dans le cas où le Affirme n'activent pas.

Toutes les idées?

Edit: Après avoir lu plusieurs commentaires j'ai été forcé à modifier. Afficher le code? Pourquoi fais-tu cette chose stupide? Je ne crois pas! Où est-il utilisé? De ma question, il aurait dû être évident que je ne vais pas poster / modifier le code en raison de plusieurs raisons possibles:

  • Je suis un débutant et a honte du code (pas de crime là-bas, que cela fait de répondre à la question beaucoup plus facile si je posterai)
  • On m'a demandé d'aider un ami avec peu d'informations (et non, je ne lui demande pourquoi ne pas vérifier le numéro retourné, ou pourquoi ne peut-il ajouter juste un point d'arrêt).
  • Je suis en train d'écrire mon code dans emacs sans compilateur et envoie à un serveur distant qui compile, exécute et ne peut revenir échoué affirme si quelque chose va mal.

Si vous croyiez que je faisais une blague ou un canular, vous devriez avoir voté pour une fermeture du fil à la place. J'aurais été parfaitement bien avec cela. Mais en ajoutant des commentaires inutiles comme cela ne m'a donné envie d'un drapeau « attitude » à mettre en œuvre.

Je tiens à remercier les autres pour leurs commentaires et réponses qui ont essayé en fait d'expliquer et de répondre à ma question.

Était-ce utile?

La solution

Comme je l'ai vu des choses si laid dans ma vie, il pourrait être expliqué si perform_calc () a un dépassement de mémoire tampon qui remplace l'adresse de retour dans la pile. Lorsque la fonction se termine, l'adresse est récupérée écrasée de la pile et réglé sur le PC en cours, conduisant à un saut peut-être dans un autre domaine du programme, apparemment passé les appels d'assertion.

Bien que ce soit une possibilité très éloignée, il est donc ce que vous montrez.

Une autre possibilité est que quelqu'un a fait un truc laid macro. vérifier si vous avez des choses comme

#define assert 

ou un collègue a quelque chose comme ça dans la tête pendant que vous étiez à la salle de bain

#define < ==
#define > ==

Comme suggéré dans une autre réponse, vérifier avec gcc -E pour voir ce que le code est compilé en fait.

Autres conseils

assert est désactivée si elle est définie la NDEBUG macro. Assurez-vous #undef NDEBUG lors de la compilation de cette unité de traduction.

Vous pouvez appeler gcc avec le commutateur -E pour vérifier que vos déclarations assert sont encore dans le code.

Il ne ressemble pas à ce code est correct en premier lieu. Si le débogage est activé (DEBUG et / ou _DEBUG sont définis et NDEBUG est unset):

assert( nr == 0);

La ligne ci-dessus appellera sortie () si n = 0. Par conséquent, si cette ligne passe, le second assert exécutera:

assert( nr > 0);

... Et la sortie d'appel () car nr == 0 et! (Nr> 0).

assert( nr < 0);

Et cette troisième ligne ne fonctionnera jamais du tout.

Qu'est-ce, précisément, est le point de ce code? Et pourquoi, si ceux-ci pourraient être ajoutés affirme, pourriez-vous pas au lieu d'ajouter un printf ()?

Est ce code multithread? Peut-être vous avez une de .

  

Et non, je n'ai la possibilité de   modifier le code afin d'imprimer la   nombre out ..

Étrange

. Vous avez évidemment la possibilité d'insérer les assert () déclarations, parce que si elles étaient en fait dans le code réel, vous ne pouviez pas toucher, le code ne pourrait fonctionner. Alors pourquoi ne pas vous pouvez imprimer la valeur assert () appelle test?

Je suppose que vous avez accidentellement éliminé le problème tout en désinfectante le fragment de code. Il y a soit plus de code (et nr devient changé entre affirme) ou il ne semble pas vraiment comme ça (ou, par rlbond, vous n'avez pas assert allumé).

Essayez de publier un segment de code moins aseptisé, et nous allons voir si nous ne pouvons pas travailler dehors.

pourrait-il être un NaN ? Dans ce cas, l'assertion suivante échouerait:

assert( nr == nr );
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top