5 votes

L'absence d'une inclusion obligatoire est-elle un comportement indéfini ?

Comme je l'ai écrit dans une réponse à Comment est-il possible d'utiliser pow sans inclure la bibliothèque cmath ? Je crains d'avoir prouvé que l'absence d'inclusion d'un en-tête nécessaire est en fait un comportement non défini, mais comme je n'ai trouvé aucun consentement de ce fait, j'aime imposer la question formelle :

Il manque un en-tête obligatoire, par exemple

#include <iostream>

int main()
{
    std::cout << std::pow(10, 2);
}
  1. Un code mal formé ([defns.ill.formed]) ?
  2. Invoquer un comportement non défini ( [defns.undefined] ) ?
  3. Si ce n'est pas 1 et 2, s'agit-il d'un comportement non spécifié [defns.unspecified] ou d'un comportement défini par l'implémentation [defns.impl.defined] ?
  4. Si ce n'est pas 1, c'est-à-dire si ce code est bien formé, cela ne contredirait-il pas [using.headers] et [intro.compliance] "accepter et exécuter correctement un programme bien formé" ?

Comme dans mon réponse J'ai tendance à répondre par l'affirmative à ces deux questions, mais [using.headers] est très déroutant à cause de Différence entre un comportement non défini et un comportement mal formé, pas de message de diagnostic nécessaire . Comme [defns.well.formed] implique qu'un programme construit selon l'ODR est bien formé, et qu'il y a une spécification de chaque fois que le par exemple iostream ne doit pas définir pow On pourrait dire qu'il s'agit toujours d'un comportement non spécifié ([defns.unspecified]). Je ne veux pas me fier uniquement à mes compétences en matière d'interprétation standard pour obtenir une réponse définitive à une question aussi importante. Notez que la réponse acceptée, c'est-à-dire la seule autre réponse, ne permet pas de savoir si le code est UB et la question ne le demande pas.

1 votes

Il est possible que vous souhaitiez remplacer ce texte par std::cout << std::pow(10.0, 2.0);

0 votes

Il devrait s'agir d'une erreur au moment de la compilation. Il manque également using namespace std; ou using std::pow .

2 votes

@LuketheGeek Une erreur de compilation n'exclut pas l'UB. Et MSVC semble toujours se conformer à la norme en ne lançant pas d'erreur mais en compilant simplement.

2voto

Davis Herring Points 7254

Il est non spécifié si ce programme est bien formé ou mal formé (avec un diagnostic obligatoire, car la recherche par nom ne trouve pas pow ). Les possibilités découlent de l'affirmation selon laquelle un en-tête C++ peut inclure un autre qui accorde autorisation à la mise en œuvre pour donner à ce programme l'une ou l'autre des deux interprétations possibles.

Plusieurs règles similaires ( par exemple (qu'un modèle doit avoir au moins une spécialisation potentielle valide) sont La liberté de choix est décrite comme rendant le programme mal formé, aucun diagnostic n'est requis, mais dans cette situation, cette liberté n'est pas étendue à l'implémentation (ce qui est sans doute préférable). Cela dit, une implémentation est de traiter un programme mal formaté dans un arbitraire tant qu'il émet au moins un message de diagnostic, il n'est donc pas complètement déraisonnable de regrouper cette situation avec un véritable comportement non défini, même si les symptômes diffèrent utilement dans la pratique.

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