[Borland] Goto bypasses initialization of a local variable
3 réponses
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/
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/
"Martinez Jerome" <jerome.martinez@aenlever-orangefrance.com> a écrit dans
le message de news:bmp0hr$qvj2@news.rd.francetelecom.fr...
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/
"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/
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
|> 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:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> 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
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
Alexandre wrote:
"Martinez Jerome" <jerome.martinez@aenlever-orangefrance.com> a écrit
dans le message de news:bmp0hr$qvj2@news.rd.francetelecom.fr...
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...
"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...