gfortran met en garde sur une exception de virgule flottante

J’utilise gfortran pour du code. Cela fait un moment que je comstack avec

-ffpe-trap=zero,overflow,invalid 

dans une tentative de traquer des insectes. Cela provoque l’exécution immédiate de mon programme. Il y a des cas où le FPE pourrait être OK et donc un drapeau comme:

 -ffpe-warn=zero,overflow,invalid 

serait très utile. Est-ce que gfortran (ou tout autre compilateur) fournit quelque chose comme ça? Si non, existe-t-il des solutions de contournement? Ma pensée actuelle est de créer une fonction C pour enregistrer un gestionnaire de signaux pour écrire l’avertissement, bien que je ne sache pas comment s’y prendre.

Je ne connais pas de moyen d’avertir si une exception en virgule flottante est rencontrée. Mais gfortran et ifort ont tous deux des routines de traitement du signal. Voir, par exemple, la documentation gfortran de signal et les guides d’utilisation et de référence du compilateur Intel Fortran (avertissement: PDF de grande taille) (reportez-vous à la page 410).

Vous pouvez définir l’une des actions suivantes pour un signal avec un appel à signal :

  • Ignorer le signal spécifié (identifié par un numéro).
  • Utilisez l’action par défaut pour le signal spécifié, ce qui peut réinitialiser une action précédemment établie.
  • Transférez le contrôle du signal spécifié vers une procédure de réception du signal, spécifiée par nom.

Dans votre cas, vous voudriez écrire une fonction pour faire quelque chose lorsqu’une exception en virgule flottante se produit (par exemple, un nom de fichier / un numéro de ligne), et utiliser la troisième option de la liste ci-dessus.

Malheureusement, ce n’est pas très portable: jetez un oeil sur cette page pour voir des exemples de traitement du signal pour différents compilateurs. Vous pouvez envelopper du code dans des macros de préprocesseur si vous voulez

  • comstackr avec plusieurs compilateurs
  • n’utilise les routines de traitement du signal que si un indicateur de préprocesseur est défini (cf. -NDEBUG )

Mise à jour: à terme, les fonctionnalités de traitement des exceptions du module insortingnsèque ieee_exceptions constitueraient le moyen portable de procéder, comme suggéré par High Performance Mark.