Sortie deux recrache caractères de contrôle supplémentaires, peut-être un bug de corruption de mémoire?

StackOverflow https://stackoverflow.com/questions/2889074

  •  04-10-2019
  •  | 
  •  

Question

Je le test.cc de programme suivant:

#include <iostream>
unsigned char bogus1[] = {
  // Changing # of periods (0x2e) changes output after periods.
  0x2e, 0x2e, 0x2e, 0x2e
};
unsigned int bogus2 = 1816; // Changing this value changes output.

int main()
{
  std::clog << bogus1;
}

Je construis avec:

g++ -g -c -o test.o test.cc; g++ -static-libgcc -o test test.o

Utilisation g ++ version 3.4.6

je le lance à travers valgrind et rien est rapporté mal.

Cependant, la sortie a deux caractères de contrôle supplémentaires et ressemble à ceci:

....

C'est un contrôle-X et un contrôle-G à la fin.

Si vous modifiez la valeur de bogus2 vous obtenez différents caractères de contrôle. Si vous modifiez le nombre de périodes dans le tableau de la question disparaît ou des changements.

Je pense qu'il est un bug de corruption de mémoire dans le package du compilateur ou iostream.

Qu'est-ce qui se passe ici?

Était-ce utile?

La solution

C / C ++, une chaîne est habituellement stockée sous la forme d'un tableau de caractères à zéro terminal.

Votre tableau unsigned char n'est pas terminée par NULL. Habituellement, il ressemblerait à quelque chose comme ceci:

unsigned char bogus1[] = {
  0x2e, 0x2e, 0x2e, 0x2e,
  0x00 // terminating NUL byte
};

Si ce n'est pas nul terminé, la sortie continuera jusqu'à ce qu'un octet NUL se trouve, c'est la raison pour laquelle il émet des valeurs qui sont placées dans la mémoire derrière votre tableau, comme le bogus2 int (qui est 0x00000718 dans l'hexagone, stockées dans format little endian => 0x18 = Ctrl-X, 0x07 = Ctrl-G, 0x00 extrémités de la sortie)

Autres conseils

Vous êtes absent le '\0' à la fin de la chaîne

unsigned char bogus1[] = {
  0x2e, 0x2e, 0x2e, 0x2e, 0x00
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top