Skip to content

Point S : what() donne le nom de la classe sans explication, un pointeur nul n'est pas une explication - #90

Merged
Jordan08 merged 1 commit into
configure-cleanfrom
todo-s-exceptions
Oct 5, 2026
Merged

Jordan08 merged 1 commit into
configure-cleanfrom
todo-s-exceptions

Conversation

@Jordan08

@Jordan08 Jordan08 commented Oct 5, 2026

Copy link
Copy Markdown
Owner

Point S de TODO.md (l'ancien 14, suite de #32), selon les décisions du 3 et du 4 octobre. Les résultats des calculs ne changent pas.

Un pointeur nul n'est pas une explication

Les constructeurs à const char* de input_format_error, unavailable_feature_error et invalid_action_error passaient leur explication à gaol_exception(f, l, const std::string&). Un pointeur nul y construisait donc un std::string, ce qui est un comportement indéfini (libstdc++ lève std::logic_error). Aucun appel de GAOL ne le fait.

gaol_exception a maintenant un constructeur gaol_exception(const char* f, unsigned l, const char* e), celui que le manuel documentait déjà et qui n'existait pas. Les constructeurs à const char* des classes dérivées y passent sans changement, et un pointeur nul y laisse l'explication vide. Un littéral ou un std::string donnent la même explication qu'avant.

what() n'est jamais vide

Sans explication, what() rendait gaol_exception pour toutes les classes. Il rend maintenant le nom de la classe de l'exception : gaol_exception, input_format_error, unavailable_feature_error ou invalid_action_error. C'est aussi ce qu'il rend quand le texte C de l'explication est vide, c'est-à-dire quand un std::string commence par un NUL : il rendait alors un texte vide.

  • what() lit le nom dans une fonction virtuelle privée, class_name(), que chaque classe dérivée redéfinit en une ligne dans l'en-tête.
  • La vtable de gaol_exception change. Elle a déjà changé dans GAOL v5 avec what(), et GAOL v5 n'a pas l'ABI de GAOL 4.
  • Une classe que l'utilisateur dérive d'une exception de GAOL, sans redéfinir class_name(), rend le nom de la classe de GAOL dont elle dérive.

operator<< copie l'explication une fois

operator<< d'une exception appelait explanation() deux fois, ce qui copiait la chaîne deux fois. Elle est maintenant gardée dans une variable locale (décidé le 4 octobre). La sortie ne change pas.

Tests et documentation

  • tests/expressions.cpp : says<>() vérifie, pour les quatre classes, que what() est le nom de la classe sans explication, avec un pointeur nul (dont explanation() est vide) et avec une explication qui commence par un NUL, et qu'operator<< n'écrit pas d'explication pour un pointeur nul. Avec l'ancien what() remis en place, ces 10 contrôles échouent.
  • Le manuel : les constructeurs à std::string, que GAOL 4 avait déjà mais que le manuel ne donnait pas, sont ajoutés pour les quatre classes. Le pointeur nul est dit dans l'entrée de gaol_exception (\newinvfive), et le nom de la classe dans celle de what().
  • Le Doxygen de gaol/gaol_exceptions.h et doc/tests.md disent la même chose.
  • todo-notes/synthese.md : les textes du point 14 pour ChangeLog et doc/differences.md sont adaptés (ci-dessous), et la note sur l'appel double d'explanation() est retirée.

examples/examples.md (n° 15 de la section 5 et de l'annexe B) est laissé à la pull request de synthèse, comme ChangeLog et doc/differences.md.

Pour doc/differences.md et ChangeLog (pull request de synthèse)

Ces textes remplacent ceux du point 14 dans todo-notes/synthese.md, où ils sont aussi.

* gaol/gaol_exceptions.h, gaol/gaol_exceptions.cpp: gaol_exception::what() returns the explanation, or the name of the class (gaol_exception, input_format_error...) if there is none or if it starts with a NUL, where GAOL 4 left "std::exception";
a null const char* explanation is none, where GAOL 4 built a std::string from it; operator<< of the exceptions writes the explanation once.
- **`what()` of GAOL's exceptions is their explanation.** `gaol_exception`
  overrides `what()`: it returns the explanation, or the name of the class of
  the exception (`gaol_exception`, `input_format_error`,
  `unavailable_feature_error` or `invalid_action_error`) where there is none
  or where it starts with a NUL, so that `catch (const std::exception& e)` and
  the message of an exception that nothing catches say what went wrong. GAOL
  left the `what()` of `std::exception`, which is `std::exception` with
  libstdc++ and libc++, whatever the error. A null pointer given as the
  explanation is no explanation: GAOL built a `std::string` from it, which is
  undefined behavior. `operator<<` of an exception writes the explanation
  once, `file, line n: exception thrown: explanation`; it wrote `what()` next
  to it, `file, line n: exception std::exception thrown: explanation`.
  (Suggested place: after the bullet on `operator>>`.)

Vérifié en local

Build Tests réussis Sautés
CMake, GCC 9.4, Release, -Wall -Wextra, avec les tests et les exemples 54 / 56 2
CMake, Clang 18, Release, -Wall -Wextra -Werror, avec les tests 38 / 40 2
  • Les deux sautés sont intervalf et interval2f, par construction. Aucun avertissement.
  • .github/scripts/headers.sh, sur l'installation CMake, avec g++ 9.4 et clang++-18 : les 22 en-têtes vérifiés compilent seuls avec -Wall -Wextra -Wold-style-cast -Werror, et toutes les macros sont préfixées.
  • Avec -Weverything, Clang 18 signale -Wweak-vtables sur les trois classes dérivées, comme avec l'en-tête de configure-clean : rien de nouveau.
  • autotools et meson ne sont pas relancés en local : aucun fichier de build ne change, et ils compilent gaol_exceptions.cpp comme avant. La CI les couvre.

Dépendances

Aucune. Les fichiers touchés ne sont pas ceux de todo-27-per-instruction-rounding. todo-12-long-sums (point E) touche aussi tests/expressions.cpp et manual/v5/gaol.tex, mais à d'autres endroits.

Après la fusion

TODO.md : le point S est fait, et le n° 14 sort de la table des anciens numéros.

@Jordan08
Jordan08 merged commit 40c33e6 into configure-clean Oct 5, 2026
128 checks passed
Jordan08 added a commit that referenced this pull request Oct 5, 2026
@Jordan08
Jordan08 deleted the todo-s-exceptions branch October 5, 2026 21:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant