-1
votes

Est-ce un comportement indéfini d'utilisation variable non infirmière

Ce code est-il un comportement indéfini?

Spécifiquement cela? "Bien que (chose * x = getnext (x))" Est-ce que le X est initialisé à zéro à cause d'une règle de la norme ou que cela est-il juste chanceux ou le compilateur le fait quand même mais ne devrait pas être invoqué? P >

#include <iostream>

struct Thing {

};

Thing* getNext(Thing* thing)
{
    std::cout << "thing:" << thing << "\n";
    return thing;
}

void test()
{
    while (Thing* x = getNext(x))
    {

    }
}


0 commentaires

3 Réponses :


1
votes

Ce programme présente un comportement non défini, à l'aide d'une valeur de variable non initialisée. Si vous observez zéro être imprimé, ce n'est que par accident.


0 commentaires

0
votes

Ce code est-il un comportement indéfini? P>

Oui, car votre programme accède à une variable non initialisée. p>

programme compile avec -wall -wextra code> options et vous constaterez que le compilateur donne ce message d'avertissement: P >

prg.cpp:17:31: warning: variable 'x' is uninitialized when used within its own initialization [-Wuninitialized]
    while (Thing* x = getNext(x))


0 commentaires

1
votes

est ce comportement non défini d'utilisation variable d'une variable non initialisée p>

Oui. P>

Le comportement de la lecture d'une valeur indéterminée n'est indéfini. Cette copie de code initialise l'argument chose code> à l'aide de x code> qui n'a pas encore été initialisé, ayant une valeur indéterminée et donc un comportement est indéfini. P>

Ce code est-il un comportement indéfini? p> BlockQuote>

Oui. P>

Spécifiquement cela? "Alors que (chose * x = getNext (x))" p> blockQuote>

Oui, plus particulièrement, cela a UB. P>

Le X est-il initialisé à zéro à cause d'une règle de la norme p> BlockQuote>

Non. Il n'y a pas de règle de ce type qui dirait x code> serait zéro initialisé dans ce contexte. P>

ou est-ce juste chanceux ou le compilateur le fait quand même mais ne devrait pas être invoqué? P> BlockQuote>

Le comportement est indéfini. Si c'était le comportement du programme qui vous a alerté à la conclusion que cela pourrait être indéfini, vous pourriez vous considérer comme avoir été chanceux. Vous pouvez améliorer votre chance en activant les avertissements du compilateur: P>

warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]


2 commentaires

Peut vouloir souligner que, dans "Ce contexte", x est une variable de durée de stockage automatique. Si X était de la durée de stockage statique (un autre contexte), il serait zéro-initialisé - et l'OP suppose de manière incorrecte à une initialisation de zéro s'applique toujours.


Non, ce n'était pas le comportement du programme qui m'a alerté, il était d'être réglé le zéro que je faisais mal ou juste de la chance sur ce qui était à la mémoire là-bas à ce moment-là.