Uscita sputa due caratteri di controllo in più, forse un errore di corruzione della memoria?
-
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?
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
};