Programmation C/C++ : les meilleurs bugs

Mod Message lu Posté le 24 Août 2008 à 19:55 Bulle
Avatar de Mod
Webmaster

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 :love: .
akd Message lu Posté le 25 Août 2008 à 10:20 Bulle
Avatar de akd
Membre Confirmé

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... :absurd:
Gregouar Message lu Posté le 25 Août 2008 à 10:39 Bulle
Avatar de Gregouar
Membre Evolué

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 Message lu Posté le 25 Août 2008 à 14:39 Bulle
Avatar de Darktib
Membre Ultime

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 :lol: - et ce dans le main du programme que je faisais...
Gregouar Message lu Posté le 25 Août 2008 à 14:44 Bulle
Avatar de Gregouar
Membre Evolué

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 Message lu Posté le 25 Août 2008 à 14:52 Bulle
Avatar de leonsulivan
Membre Confirmé

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é :proud:
Darktib Message lu Posté le 25 Août 2008 à 14:57 Bulle
Avatar de Darktib
Membre Ultime

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 Message lu Posté le 25 Août 2008 à 16:26 Bulle
Avatar de akd
Membre Confirmé

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 Message lu Posté le 25 Août 2008 à 16:36 Bulle
Avatar de noob4ever
Explorateur

Messages : 295
GCPoints : 48742

Citation :

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 := )


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 Message lu Posté le 25 Août 2008 à 16:38 Bulle
Avatar de Darktib
Membre Ultime

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 Message lu Posté le 25 Août 2008 à 16:39 Bulle
Avatar de Mod
Webmaster

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 :embarassed: .
leonsulivan Message lu Posté le 25 Août 2008 à 17:04 Bulle
Avatar de leonsulivan
Membre Confirmé

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.

:proud:
noob4ever Message lu Posté le 25 Août 2008 à 17:06 Bulle
Avatar de noob4ever
Explorateur

Messages : 295
GCPoints : 48742

Citation :

Voila ce qu'est bien avec C++ c'est que tout s'explique


Bof, tu veux un code inexplicable ?
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?

I'm your folder
Mod Message lu Posté le 25 Août 2008 à 17:08 Bulle
Avatar de Mod
Webmaster

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 Message lu Posté le 27 Août 2008 à 00:39 Bulle
Avatar de NicoL3AS
Membre Novice

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 Message lu Posté le 27 Août 2008 à 13:53 Bulle
Avatar de Mod
Webmaster

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 Message lu Posté le 27 Août 2008 à 20:09 Bulle
Avatar de noob4ever
Explorateur

Messages : 295
GCPoints : 48742

Citation :

Avec quel compilateur ? GCC ?
C'est quand même une erreur suffisamment visible pour le compilateur la détecte. Bizarre que ça passe :s.


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 Message lu Posté le 29 Août 2008 à 10:31 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Il faudra que je vérifie cela, mais ça ne m'étonnerait pas que le compilateur refuse ça.
noob4ever Message lu Posté le 29 Août 2008 à 11:24 Bulle
Avatar de noob4ever
Explorateur

Messages : 295
GCPoints : 48742

Citation :

Il faudra que je vérifie cela, mais ça ne m'étonnerait pas que le compilateur refuse ça.


Le refuser non, évoquer un warning oui.
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?

I'm your folder
Mod Message lu Posté le 29 Août 2008 à 11:32 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Ca ne compilerait donc probablement pas chez moi ("treat warnings as errors").
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0581 secondes