J'avais à faire un petit programme pour un travail d'université. Fonctionnant à merveille sous Linux et SunOS (La correction des travaux se fait sur un serveur Sun) j'ai décidé de tenter le test sous Windows. Malheur!! Le programme plante. En mode debug avec Dev-Cpp je tombe sur quelque chose d'assez drôle. Lors du plantage je regarde mon pointeur qui plante et il est initialisé à... 0xbaadf00d. (Je me suis vite rendu compte que c'était le seul pointeur que j'avais oublié d'initialiser à NULL lors de son allocation.
Quelqu'un a déjà vu d'autres adresses du genre? Sous Visual C++ j'ai le code 0xCDCDCDCD.
# Re: Adresse de pointeur non initialisé!
Posté par . Takhi . Évalué à 1.
http://www.nobugs.org/developer/win32/debug_crt_heap.html(...)
Il semble que cela permette de savoir quel est l'etat d'un pointeur en mode Debug: ( alloué par le systeme, alloué par malloc, liberé par free, liberé par le systeme ...)
http://www.nobugs.org/developer/win32/debug_crt_heap.html#table(...)
BadFood, c'est apres l'invocation de HeapAlloc,
CDCDCD ... c'est apres l'invocation de malloc
[^] # Re: Adresse de pointeur non initialisé!
Posté par Colin Leroy (site web personnel) . Évalué à 2.
Dommage que la glibc ne fasse pas ça...
# Re: Adresse de pointeur non initialisé!
Posté par Pascal . Évalué à 2.
Souvent, efence met en valeur des erreurs de pointeurs et d'allocations mémoires bien que le porgramme parait fonctionner normallement.
Personnelement, quand je dévelloppe en C, je linke toujours mes programmes avec Electric Fence. Cela permet de corriger rapidement certaines erreurs.
[^] # Re: Adresse de pointeur non initialisé!
Posté par Krunch (site web personnel) . Évalué à 1.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: Adresse de pointeur non initialisé!
Posté par Pascal . Évalué à 1.
Surtout que en général, les bugs causés par les erreurs de pointeurs ou d'allocations mémoires, ne sont difficelement reproductibles (un programmes peut fonctionner plusieurs semaines avant qu'un segmentation fault ne mette la puce à l'oreille) et apparaissent parfois très loin de l'erreur initiale.
[^] # Re: Adresse de pointeur non initialisé!
Posté par Krunch (site web personnel) . Évalué à 1.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
# Re: Adresse de pointeur non initialisé!
Posté par deftones_chris . Évalué à 1.
[^] # Re: Adresse de pointeur non initialisé!
Posté par SamG . Évalué à 1.
Si ce pointeur est créé dans une fonction, le pointeur (qui est une simple variable) va être réservé sur la pile. La valeur par défaut du pointeur va donc dépendre du contenu de la pile.
[^] # Re: Adresse de pointeur non initialisé!
Posté par deftones_chris . Évalué à 1.
Etre initialisé avecune valeur indéfinie ou bien ne pas être initiliasé revient au même :) Le pointeur lors de sa déclaration a une valeur qu'on ne peut déterminer et qui n'est pas constante d'une exécution à l'autre.
# Re: Adresse de pointeur non initialisé!
Posté par Mickaël Sibelle (site web personnel) . Évalué à 3.
C'est une sorte de machine virtuelle...
Elle te dira des trucs sur ta gestion de la mémoire !
# Re: Adresse de pointeur non initialisé!
Posté par TazForEver . Évalué à 2.
[^] # Re: Adresse de pointeur non initialisé!
Posté par WildChild . Évalué à 1.
[^] # Re: Adresse de pointeur non initialisé!
Posté par pas_moi . Évalué à 1.
[^] # Re: Adresse de pointeur non initialisé!
Posté par TazForEver . Évalué à 1.
le C ne garantie aucune initialisation : à toi de la faire manuellement. si tu ne le fais pas, ta variable locale (ou ta zone mémoire allouée dynamiquement) comportera tout et n'importe quoi : des zéros, des valeurs bizarres, du texte, bref tout ce qu'on peut trouver en mémoire non-inialisée. c'est un comportement indéfini (UB) ce qui explique qu'en fonction du système et du compilateur tu observes un comportement différent : encore une fois, c'est ta faute, ton bug.
[^] # Re: Adresse de pointeur non initialisé!
Posté par WildChild . Évalué à 1.
[^] # Re: Adresse de pointeur non initialisé!
Posté par TazForEver . Évalué à 1.
2 règles essentielles :
- toujours veiller à ce qu'une variable soit initialiser
- déclarer une variable au plus prêt de son initialisation (merci gcc/C99 qui permet de déclarer les variables partout et pas uniquement en début de bloc)
# Re: Adresse de pointeur non initialisé!
Posté par 0xDEADBEEF . Évalué à 0.
Pffff... Comprend jamais rien moi...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.