GameCorp - Index des forumsGame MakingProgrammationLangages C et C++Programmation C/C++ : les meilleurs bugs
Programmation C/C++ : les meilleurs bugs
| Mod |
Posté le 24 Août 2008 à 19:55
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Parfois, je me dis qu'un tel sujet peut-être intéressant. Ne serait-ce que parce que l'on ne pense pas forcément à tous les effets que peut avoir une cause quelconque en C ou C++. Source d'inspiration pour toute sorte de bugs difficilement résolvables, en quelque sorte. J'en veux pour exemple le bug qui m'a tenu en haleine toute la journée. Je travaillait sur un programme qui utilisait des vector. Rien de bizarre jusque là, si ce n'est que dans ce programme, quoique je fasse, il crashait lorsque j'ajoutais le 43ème élément du vecteur via la méthode push_back. A cela s'ajoutait un autre gros problème : impossible de débugguer facilement. Lorsque je testais mon programme en l'ayant lancé depuis Visual Studio, pas de crash. Le même programme en le lançant via l'explorateur Windows, crashait. Hum. Bizarre. Après de nombreux essais, j'ai fini par remarquer que le 43ème élément correspondait à une réallocation du vector (un vector étant initialisé pour un nombre de X éléments, puis chaque fois qu'il est nécessaire de dépasser ce nombre X, une réallocation d'un nombre supérieur d'éléments a lieu). Curieux, d'autant plus que strictement aucune exception n'était envoyée. Crash pur et simple. De nombreux essais plus tard, à force de tests sauvages, j'ai remarqué que mon programme crashait lorsque j'utilisais une certaine chaîne de caractères, créée à partir d'une autre. Et là, petite surprise. La copie avait de mémoire allouée pour tous les caractères de l'orignal, sauf un. En l'occurence, un octet. Un octet, pour une après-midi entière de debugging. Je crois que j'aime le C |
|
| akd |
Posté le 25 Août 2008 à 10:20
|
|
![]() Messages : 319 GCPoints : 75439 |
Les erreurs de segmentation sous linux je crois que c'est mes préférées (j'étais spécialiste des insertions hors des limites des tableaux du temps où je faisais du C++) Et en règle général comme ca tombait systématiquement dans des boucles for imbriquées ou autre joyeuseté de ce genre... |
|
| Gregouar |
Posté le 25 Août 2008 à 10:39
|
|
![]() Messages : 989 GCPoints : 84732 |
J'avais eu un problème plus ou moins similaire que Mod avec un string que j'envoyais via une fonction get dans une boucle ( en fait le nom des monstres ^^ ).
Holyspirit c'est :
85 Fichiers sources | 18 349 Lignes de codes 503 Fichiers ressources | 240 Mo 101 Dossiers | 2800 téléchargements |
|
| Darktib |
Posté le 25 Août 2008 à 14:39
|
|
![]() Messages : 4017 GCPoints : 347288 |
Un bug de compilation que j'ai adoré >< : pendant une matinée entiere j'ai cherché dans une centaine de gros fichiers sources la cause d'une insulte du compilateur. A la fin j'ai trouvé : oublie d'un point-virgule a la fin d'une déclaration struct |
|
| Gregouar |
Posté le 25 Août 2008 à 14:44
|
|
![]() Messages : 989 GCPoints : 84732 |
Une matinée ? Ca m'étonne, souvent, on retrouve vite un oubli de ";". ^^
Holyspirit c'est :
85 Fichiers sources | 18 349 Lignes de codes 503 Fichiers ressources | 240 Mo 101 Dossiers | 2800 téléchargements |
|
| leonsulivan |
Posté le 25 Août 2008 à 14:52
|
|
![]() Messages : 129 GCPoints : 27551 |
D'ailleurs Gregouar en disant ça tu me fait penser à une erreur assez méchante que nous avait parlé notre prof de c++ dans ma première année de dut Code :
#include <iostream>
int main()
{
int valeur = 1;
if( valeur == 1);
{
std::cout << "Bonjour la valeur est a un" << std::endl;
}
std::cout << " voila c'est tout" << std::endl;
return 0;
}
resultat : Code : $ ./a.out $ voila c'est tout Erreur vraiment toute conne mais qui peut être dur a déceler si ça ne vous est jamais arrivé |
|
| Darktib |
Posté le 25 Août 2008 à 14:57
|
|
![]() Messages : 4017 GCPoints : 347288 |
En fait un matinée parce que gcc me disais toutes les erreurs possibles... sauf celles des points-virgule^^ Comme je programme en dbp et C++ et que je le fait par 'périodes' (+ C++ un moment, +dbp un autre, etc...), repasser de dbp a C++ est plus dur que l'inverse. @leonsulivan : pas mal l'erreur... ca ne m'est jamais arrivé pour l'instant (je fais gaffe aux conditions en général) mais comme ca je le saurait pour l'avenir^^ |
|
| akd |
Posté le 25 Août 2008 à 16:26
|
|
![]() Messages : 319 GCPoints : 75439 |
leonsulivan ton bug m'a fait penser à un autre truc relativement courant tout langage confondu. Le coup du if (i =1 ) au lieu de if ( i==1) Le genre de truc qui arrive souvent quand tu switches joyeusement entre C/C++ et SQL par exemple ( en sql la comparaison est = et l'affectation := ) Petit mais costaud ! |
|
| noob4ever |
Posté le 25 Août 2008 à 16:36
|
|
![]() Messages : 295 GCPoints : 48742 |
Citation :
Moi ça se passe quand je switch OCaml --> C++, mais en général dans mes programmes, dans les algo que j'établis j'utilise très peu de test d'égalité, surtout des testes de différence.
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|
| Darktib |
Posté le 25 Août 2008 à 16:38
|
|
![]() Messages : 4017 GCPoints : 347288 |
Et chez moi c'est en dbp... Je pense d'ailleurs que je ne suit pas le seul qui passe régulierement de Dbp a C++ - et qui assez souvent en éprouve quelques bugs... |
|
| Mod |
Posté le 25 Août 2008 à 16:39
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Ah, oui, le i = 1 au lieu de i == 1, c'est une plaie. Ca m'arrive facilement une fois par semaine à force de changer constamment de langage. A force je fini quand même par y penser, mais pas tout le temps. @ leonsulivan : sur les compilateurs que j'utilise habituellement pour le C++, Visual Studio 8 ou 9, je risque de me faire insulter si je tente de faire ça |
|
| leonsulivan |
Posté le 25 Août 2008 à 17:04
|
|
![]() Messages : 129 GCPoints : 27551 |
Non pas de soucis pour les complos car ce code est tout à fait valide : Code :
#include <iostream>
int maint()
{
int valeur = 1;
{
int test = 3;
std::cout << " coucou dans un bloc : " << test << std::endl;
}
std::cout << " coucou dans le main" << std::endl;
}
résultat : Code : $./a.out $ coucou dans un bloc : 3 $ coucou dans un main En fait les accolades en c++ ne servent qu'a créer des blocs. Et c'est parfaitement logique car regardez : derriere un if on est pas obligé de mettre d'accolades dans ce cas seul l'instruction suivante est conditionnelle Code : if( booléen ) Instruction conditionnelle Instruction qui sera effectuée quoi qu'il arrive Mettre des accolades signifie donc que le if rends conditionnel le prochain bloc ( de la même façon qu'il rendrai la prochaine instruction conditionnelle ). Code : if( booléen )
{
// Bloc qui ne sera exetuté que si la condition est vraie
std::cout << "test" << std::endl;
std::cout << "test1" << std::endl;
std::cout << "test2" << std::endl;
}
{
//-> Bloc qui sera toujours executé
std::cout << "coucou" << std::endl;
std::cout << "coucou2" << std::endl;
std::cout << "coucou3" << std::endl;
}
Voila ce qu'est bien avec C++ c'est que tout s'explique, bon je reconnait que les blocs sans if ( while ou for ) c'est pas super utilisés mais ça peut permettre de créer une variable qui ne sera visible que dans cette portion de code. |
|
| noob4ever |
Posté le 25 Août 2008 à 17:06
|
|
![]() Messages : 295 GCPoints : 48742 |
Citation :
Bof, tu veux un code inexplicable ?
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|
| Mod |
Posté le 25 Août 2008 à 17:08
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Le principe des blocs est bien connu et exploité, avec tout ce qui va avec (variables locales), mais le point que le compilateur n'aimera pas, c'est d'avoir une condition qui n'aboutit sur rien, qu'elle soit vraie ou fausse. | |
| NicoL3AS |
Posté le 27 Août 2008 à 00:39
|
|
![]() Messages : 27 GCPoints : 7947 |
Code :int i=0;
while(i<5);
{
cout << i << endl;
i++;
}
Le point virgule derrière un while plutôt qu'un if c'est très drôle, on a tout de suite affaire à des boucles infinies.
La Destinée du Feu
Action-RPG 2D gratuit |
|
| Mod |
Posté le 27 Août 2008 à 13:53
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Avec quel compilateur ? GCC ? C'est quand même une erreur suffisamment visible pour le compilateur la détecte. Bizarre que ça passe :s. |
|
| noob4ever |
Posté le 27 Août 2008 à 20:09
|
|
![]() Messages : 295 GCPoints : 48742 |
Citation :
Le coup du while(); ? C'est pas un erreur, ça veut dire que la boucle s'execute sans instruction conditionnel.
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|
| Mod |
Posté le 29 Août 2008 à 10:31
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Il faudra que je vérifie cela, mais ça ne m'étonnerait pas que le compilateur refuse ça. | |
| noob4ever |
Posté le 29 Août 2008 à 11:24
|
|
![]() Messages : 295 GCPoints : 48742 |
Citation :
Le refuser non, évoquer un warning oui.
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|
| Mod |
Posté le 29 Août 2008 à 11:32
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Ca ne compilerait donc probablement pas chez moi ("treat warnings as errors"). | |
GameCorp - Index des forumsGame MakingProgrammationLangages C et C++Programmation C/C++ : les meilleurs bugs
Répondre








