Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Xin_J.D en 30 Marzo 2018, 13:14 pm



Título: Violacion segmento en C Linux
Publicado por: Xin_J.D en 30 Marzo 2018, 13:14 pm
Hola muy buenas a todo el mundo.
Tengo que hacer una practica que consiste en hacer una calculadora que recibe los argumentos por linea de comando. Entonces el programa debe hacer la suma, resta, producto , cuociente y potencia.
Mi problema está en encontrar el signo de operacion ya que este no siempre está en la misma posicion.
En el comando podemos introducir por ejemplo 5x6 , 5x 6 , 5 x 6 , -5x6 , -5 x -6 etc.
Yo pensé en usar strcat para unir las cadena y usar un bucle for para encontrar el signo. Si el primer elemento es un signo k empiece por 0 sino por 1. una vez encontrado , break.
Pero en el main del hay un test que pone argv[1]="5.0" , argv[2]="+" , argv[3]="6.0". Alli es donde me da violacion de segmento en la funcion strcat
Espero que algun experto me pueda ayudar😁😁😁


Código
  1. int main(argc,*argv[ ])
  2. {.....
  3. argv[1]="5.0" ;
  4. argv[2]="+" ;
  5. argv[3]="6.0";
  6.  
  7. strcat(argv[1],argv[2]); // Aqui da violacion de segmento
  8.  
  9. .....
  10. }
  11.  


Título: Re: Violacion segmento en C Linux
Publicado por: MAFUS en 30 Marzo 2018, 16:16 pm
No deberías escribir en argv, es para pasarle información al programa.
Cuando uses strcat, strcpy y toda esta lista de instrucciones asegúrate de que el destino tiene el tamaño suficiente como para alojar la cadena de origen.

Para tu caso lo mejor sería crear un búffer que pudiera alojar toda la cadena, algo así como
Código:
char buffer[255] = {0};
for (int i=1; i<argc; ++i)
    strcat(buffer, argv[i]);


Título: Re: Violacion segmento en C Linux
Publicado por: BloodSharp en 31 Marzo 2018, 00:33 am
No deberías escribir en argv, es para pasarle información al programa.
Cuando uses strcat, strcpy y toda esta lista de instrucciones asegúrate de que el destino tiene el tamaño suficiente como para alojar la cadena de origen.

Para tu caso lo mejor sería crear un búffer que pudiera alojar toda la cadena, algo así como
Código:
char buffer[255] = {0};
for (int i=1; i<argc; ++i)
    strcat(buffer, argv[i]);

Como medida de seguridad adicional debería aparte no crear un buffer tan extenso que potencialmente podría ser usado para un ataque de ejecución por overflow:
Código
  1. int main(int argc,char*argv[])
  2. {
  3.    unsigned int uiTotalBufferSize=0;
  4.    char*lpBuffer;
  5.    register unsigned int i;
  6.    for(i=1;i<argc;i++)
  7.        uiTotalBufferSize+=strlen(argv[i]);
  8.    lpBuffer=(char*)malloc(++uiTotalBufferSize);
  9.    if(!lpBuffer)
  10.        return 1;
  11.    lpBuffer[0]=0;
  12.    for(i=1;i<argc;i++)
  13.        strcat(lpBuffer,argv[i]);
  14.    HacerCalculo(lpBuffer);
  15.    free(lpBuffer);
  16.    return 0;
  17. }