OVH Cloud OVH Cloud

[Borland] Goto bypasses initialization of a local variable

3 réponses
Avatar
Martinez Jerome
Bon...
Petit casse tete, qui compile avec Visual C++, mais pas Borland C++ :

int A;
int B;
while (1)
{
if (B > 0)
{
break;
}
if (1)
{
int C = 0; //<---- Ligne 1
while (A != NULL) {}; //<---- Ligne 2
}
} // while (1)


Ca, fait une fois, ne pose aucun probleme.
Fait de facon recursive (codé en dur, donc une fonction a rallonge...
pas beau, mais bon, ce n'est pas mon code), la partie while etant
remplacée par les memes lignes de codes 4 ou 5 fois, me donne cette erreur :

E2203 Goto bypasses initialization of a local variable
In C++, it is illegal to bypass the initialization of a local variable.
This error indicates a goto statement that can transfer control past
this local variable.

Question : est-ce que c'est normal (faut pas programmer comme ca) et
j'insulte le programmeur de la chose, ou est-ce que c'est le compilo qui
merde.
Pour info si je suprime "Ligne 1" ou "Ligne 2", au choix :), l'erreur
n'apparait pas, ca compile peinard.

Pour les curieux, c'est le fichier MatroskaUtils.cpp de ce projet la :
http://corecodec.org/projects/matroska/

3 réponses

Avatar
Alexandre
"Martinez Jerome" a écrit dans
le message de news:bmp0hr$
Bon...
Petit casse tete, qui compile avec Visual C++, mais pas Borland C++ :

int A;
int B;
while (1)
{
if (B > 0)
{
break;
}
if (1)
{
int C = 0; //<---- Ligne 1
while (A != NULL) {}; //<---- Ligne 2
}
} // while (1)

Code horrible. des tests pour savoir si 1 est vrai (while(1)), des

interruptions d'iterations (break).... une boucle while avec rien dedans qui
change ....
Une variable A qui est testée sans jamais avoir été initialisée...
Si c'était un de mes étudiants qui avait codé ça, il aurait eu 0.
C'est surprenant que qqn ait écrit ça. Il a du faire exprès ?
Tu es sur que ce n'est pas écrit en assembleur ?
ça ne sortirait pas d'un décompilateur C, par hasard ?


Ca, fait une fois, ne pose aucun probleme.
Fait de facon recursive (codé en dur, donc une fonction a rallonge...
pas beau, mais bon, ce n'est pas mon code), la partie while etant
remplacée par les memes lignes de codes 4 ou 5 fois, me donne cette erreur
:


E2203 Goto bypasses initialization of a local variable
In C++, it is illegal to bypass the initialization of a local variable.
This error indicates a goto statement that can transfer control past
this local variable.
Pas surprenant.



Question : est-ce que c'est normal (faut pas programmer comme ca) et
j'insulte le programmeur de la chose, ou est-ce que c'est le compilo qui
merde.
Non, pauvre compilo, laisse-le tranquille. Une horreur pareille !


Pour info si je suprime "Ligne 1" ou "Ligne 2", au choix :), l'erreur
n'apparait pas, ca compile peinard.
Si tu supprimes toutes les lignes, le compilo ne rales plus non plus ;-)




Pour les curieux, c'est le fichier MatroskaUtils.cpp de ce projet la :
http://corecodec.org/projects/matroska/



Avatar
James Kanze
Martinez Jerome writes:

|> Petit casse tete, qui compile avec Visual C++, mais pas Borland C++ :

|> int A;
|> int B;
|> while (1)
|> {
|> if (B > 0)
|> {
|> break;
|> }
|> if (1)
|> {
|> int C = 0; //<---- Ligne 1
|> while (A != NULL) {}; //<---- Ligne 2
|> }
|> } // while (1)

|> Ca, fait une fois, ne pose aucun probleme.

Ah, bon. Parce que tu commences par tester la valeur de B, sans jamais
l'avoir initialisé. C'est un comportement indéfini, et ça
risque dans la réalité d'avoir un comportement aléatoire.

La même chose vaut pour le test sur A en ligne 2.

|> Fait de facon recursive (codé en dur, donc une fonction a
|> rallonge... pas beau, mais bon, ce n'est pas mon code), la partie
|> while etant remplacée par les memes lignes de codes 4 ou 5 fois,
|> me donne cette erreur :

|> E2203 Goto bypasses initialization of a local variable
|> In C++, it is illegal to bypass the initialization of a local variable.
|> This error indicates a goto statement that can transfer control past
|> this local variable.

Bien, je ne comprends pas vraiment ce que fait le code réel. Mais
passons.

|> Question : est-ce que c'est normal (faut pas programmer comme ca) et
|> j'insulte le programmeur de la chose, ou est-ce que c'est le compilo
|> qui merde.

Ça dépend du code réel. Si un goto (ou son équivalent,
c-à-d un switch), saut au délà d'une définition avec
initialisation -- soit que l'auteur a écrit une initialisation
explicite, soit que le type en question a un constructeur non trivial,
c'est bien une erreur.

Plus généralement, si tu utilises une variable sans
initialisation, il y a un comportement indéfini. Si le compilateur le
detecte (ce qui n'est pas forcement possible dans tous les cas), ça
serait bien gentil de sa parte de t'en informer, au moyen d'un
avertissement.

|> Pour info si je suprime "Ligne 1" ou "Ligne 2", au choix :),
|> l'erreur n'apparait pas, ca compile peinard.

S'il s'agit du code que tu as posté, je ne comprends vraiment pas. Il
n'y a pas de goto, ni d'expression equivalente (comme switch).

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Christophe Lephay
Alexandre wrote:
"Martinez Jerome" a écrit
dans le message de news:bmp0hr$
Bon...
Petit casse tete, qui compile avec Visual C++, mais pas Borland C++ :

int A;
int B;
while (1)
{
if (B > 0)
{
break;
}
if (1)
{
int C = 0; //<---- Ligne 1
while (A != NULL) {}; //<---- Ligne 2
}
} // while (1)

Code horrible. des tests pour savoir si 1 est vrai (while(1)), des

interruptions d'iterations (break).... une boucle while avec rien
dedans qui change ....
Une variable A qui est testée sans jamais avoir été initialisée...
Si c'était un de mes étudiants qui avait codé ça, il aurait eu 0.
C'est surprenant que qqn ait écrit ça. Il a du faire exprès ?
Tu es sur que ce n'est pas écrit en assembleur ?
ça ne sortirait pas d'un décompilateur C, par hasard ?


Hum, je crois que tu n'as pas bien compris le propos de Jerome...

Chris