Programación C en ubuntu 12.04 stack smashing detected

Imagen de EclipseLunar
0 puntos

Hola a todos!
Estoy aprendiendo a programar en C ... y a la hora de compilar y ejecutar mi programa me sale un error de stack smashing detected y no entiendo por que alguna solución?

int main(int argc, char** argv) {
char nombre1[]="Mi nombre es Eclipse";
char nombre2[]="Mi nombre es Lunar";
printf("%s\n",nombre1);
printf("%s\n",nombre2);

printf("Copiando Eclipse encima de Lunar\n");
strcpy(nombre2,nombre1);//string copy (recibe 2 cadenas)
printf("%s\n",nombre2);

int largo;
largo=strlen(nombre1);
printf("Longitud de nombre1: %d\n",largo);
return 0;

}
-- y Aquí viene el error : (Esta es la salida, como ven ejecuta el programa bien,pero luego sale un error! mi sistema operativo esta basado en ubuntu 12.04 por eso lo posteo aca :/ )

Mi nombre es Eclipse
Mi nombre es Lunar
Copiando Eclipse encima de Lunar
Mi nombre es Eclipse
Longitud de nombre1: 20
*** stack smashing detected ***: /home/bugtraq/NetBeansProjects/Cadenas/dist/Debug/GNU-Linux-x86/cadenas terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb7686045]
/lib/i386-linux-gnu/libc.so.6(+0x103ffa)[0xb7685ffa]
/home/bugtraq/NetBeansProjects/Cadenas/dist/Debug/GNU-Linux-x86/cadenas[0x80485a0]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb759b4d3]
/home/bugtraq/NetBeansProjects/Cadenas/dist/Debug/GNU-Linux-x86/cadenas[0x8048401]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:01 35390567 /home/bugtraq/NetBeansProjects/Cadenas/dist/Debug/GNU-Linux-x86/cadenas
08049000-0804a000 r--p 00000000 08:01 35390567 /home/bugtraq/NetBeansProjects/Cadenas/dist/Debug/GNU-Linux-x86/cadenas
0804a000-0804b000 rw-p 00001000 08:01 35390567 /home/bugtraq/NetBeansProjects/Cadenas/dist/Debug/GNU-Linux-x86/cadenas
08439000-0845a000 rw-p 00000000 00:00 0 [heap]
b754a000-b7566000 r-xp 00000000 08:01 14418895 /lib/i386-linux-gnu/libgcc_s.so.1
b7566000-b7567000 r--p 0001b000 08:01 14418895 /lib/i386-linux-gnu/libgcc_s.so.1
b7567000-b7568000 rw-p 0001c000 08:01 14418895 /lib/i386-linux-gnu/libgcc_s.so.1
b7581000-b7582000 rw-p 00000000 00:00 0
b7582000-b7725000 r-xp 00000000 08:01 14418873 /lib/i386-linux-gnu/libc-2.15.so
b7725000-b7726000 ---p 001a3000 08:01 14418873 /lib/i386-linux-gnu/libc-2.15.so
b7726000-b7728000 r--p 001a3000 08:01 14418873 /lib/i386-linux-gnu/libc-2.15.so
b7728000-b7729000 rw-p 001a5000 08:01 14418873 /lib/i386-linux-gnu/libc-2.15.so
b7729000-b772c000 rw-p 00000000 00:00 0
b7743000-b7747000 rw-p 00000000 00:00 0
b7747000-b7748000 r-xp 00000000 00:00 0 [vdso]
b7748000-b7768000 r-xp 00000000 08:01 14418853 /lib/i386-linux-gnu/ld-2.15.so
b7768000-b7769000 r--p 0001f000 08:01 14418853 /lib/i386-linux-gnu/ld-2.15.so
b7769000-b776a000 rw-p 00020000 08:01 14418853 /lib/i386-linux-gnu/ld-2.15.so
bfdf0000-bfe11000 rw-p 00000000 00:00 0 [stack]

RUN FINISHED; Aborted; core dumped; real time: 80ms; user: 0ms; system: 0ms

he probado usar para compilar: gcc miaplicacion.c -fno-stack-protector, ya que había leido que eso borra la protección para posibles ataques de buffer overflow, pero si hago eso el tamaño de mi array sale como 1 ???
Gracias de antemano :/

Imagen de Goyo
+1
0
-1

Cuenta los bytes.
char nombre1[]="Mi nombre es Eclipse";
char nombre2[]="Mi nombre es Lunar";
nombre2 apunta a un buffer de 19 bytes, nombre1 tiene una longitud de 20 caracteres.
strcpy(nombre2,nombre1);
Estás copiando 21 bytes (20 más el 0 que marca el fin de la cadena) a un buffer de 19 bytes. Eso tiene que provocar un desbordamiento de buffer sin remedio.

PS. Un desbordamiento de buffer siempre es una mala cosa y ninguna indicación que le des al compilador va a hacer que deje de serlo. Puede ser útil para depurar o para optimizar pero el desbordamiento se debe evitar en todo caso.

+1
0
-1
Imagen de rioport
+1
0
-1

No tengo idea de porqué ese error, apenas y sé muy poquito de C, C++, pero éste código no me produce ningún error, ni al compilarse ni al ejecutarse:

#include 
#include 

int main(int argc, char** argv) {
	char nombre1[]="Mi nombre es Eclipse";
	char nombre2[]="Mi nombre es Lunar";
	printf("%s\n",nombre1);
	printf("%s\n",nombre2);

	printf("Copiando Eclipse encima de Lunar\n");
	strcpy(nombre2,nombre1);	//string copy (recibe 2 cadenas)
	printf("%s\n",nombre2);

	int largo;
	largo=strlen(nombre1);
	printf("Longitud de nombre1: %d\n",largo);
	
	return 0;

}

Esto con GCC 4.7.2 y compilando con gcc -Wall copiarcadena.c -o copiarcadena.

Edito: Goyo tiene razón.

+1
0
-1

-- GC --

Imagen de EclipseLunar
+1
0
-1

Vaya no me percate de eso ... Gracias Goyo y rioport por sus respuestas, me quedo claro :D

+1
0
-1