Salida escupe dos caracteres de control adicionales, posiblemente un error de corrupción de memoria?

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

  •  04-10-2019
  •  | 
  •  

Pregunta

Tengo el siguiente programa 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;
}

construyo con:

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

Uso g ++ versión 3.4.6

Lo ejecuto a través valgrind y nada se informa mal.

Sin embargo, la salida tiene dos caracteres de control adicionales y se ve así:

....

Eso es un control-X y un control-G en el extremo.

Si cambia el valor de bogus2 se obtiene diferentes caracteres de control. Si cambia el número de períodos en la matriz del problema desaparece o cambia.

Sospecho que es un error de corrupción de memoria en el paquete de compilador o iostream.

¿Qué está pasando aquí?

¿Fue útil?

Solución

En C / C ++, una cadena se almacena por lo general como una matriz de caracteres terminada en nulo.

Su matriz de caracteres sin signo no es terminada en nulo. Por lo general, se vería algo como esto:

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

Si no es terminada en cero, la producción continuará hasta que se encuentre un byte NUL, por eso da salida a los valores que se colocan en la memoria detrás de la matriz, como el bogus2 int (que es 0x00000718 en hexadecimal, almacenados en Little endian formato => 0x18 = Ctrl-X, 0x07 = Ctrl-G, 0x00 los extremos de salida)

Otros consejos

Te estás perdiendo el '\0' al final de la cadena

unsigned char bogus1[] = {
  0x2e, 0x2e, 0x2e, 0x2e, 0x00
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top