Uscita sputa due caratteri di controllo in più, forse un errore di corruzione della memoria?

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

  •  04-10-2019
  •  | 
  •  

Domanda

Ho il seguente programma test.cc:

#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;
}

costruisco con:

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

Utilizzando g ++ versione 3.4.6

ho eseguito attraverso valgrind e nulla è segnalato sbagliato.

Tuttavia l'uscita ha due caratteri di controllo in più e si presenta così:

....

Questo è un controllo-X e un controllo-G alla fine.

Se si modifica il valore di bogus2 si ottiene diversi caratteri di controllo. Se si modifica il numero di periodi nella matrice del problema va via o modifiche.

Ho il sospetto che si tratta di un bug di corruzione della memoria nel pacchetto compilatore o iostream.

Che cosa sta succedendo qui?

È stato utile?

Soluzione

In C / C ++, una stringa è di solito memorizzato come una matrice char terminazione Null.

Il tuo array di unsigned char non è terminata da null. Di solito sarebbe simile a questa:

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

Se non è terminazione Null, uscita continuerà finché non viene trovato un byte NUL, ecco perché emette valori che vengono inseriti nella memoria dietro la matrice, come int bogus2 (che è 0x00000718 in esadecimale, memorizzati in little endian format => = 0x18 Ctrl-X, 0x07 = Ctrl-G, 0x00 estremità dell'uscita)

Altri suggerimenti

Stai perdendo il '\0' alla fine della stringa

unsigned char bogus1[] = {
  0x2e, 0x2e, 0x2e, 0x2e, 0x00
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top