es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué la función “readlink” causa una violación de segmento en lugar de mover la cadena de ruta a un puntero?

Cuando ejecuto el código:

char* dirPath = (char*) malloc(pathSize); // pathSize es 512 y está predefinido
readlink("/proc/self/exe", dirPath, pathSize); // segfault aquí

ocurre un fallo de segmentación. He intentado aumentar el valor de pathSize o pasar un valor pathSize más grande a readlink. También he intentado poner /proc/self/exe en una variable separada y pasar esa variable, pero tampoco funcionó. Al ejecutar el programa a través de gdb, muestra lo siguiente:

Program received signal SIGSEGV, Segmentation fault.
__memmove_avx_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:384
384    ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S: No such file or directory.

El código funcionó durante mucho tiempo, pero recientemente dejó de funcionar.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El segfault en este código probablemente se debe a no asignar suficiente espacio para el carácter nulo al final de la cadena dirPath. La forma correcta de asignar espacio sería:

    char* dirPath = (char*) malloc(pathSize + 1); // añadir espacio para el carácter nulo
    dirPath[pathSize] = '\0'; // añadir carácter nulo
    readlink("/proc/self/exe",dirPath,pathSize); // llamar a readlink
    

    Además, el uso de la variable ‘pathSize’ sugiere que es una constante predefinida, pero no se muestra en el código proporcionado. Es posible que el valor de ‘pathSize’ necesite aumentarse.

    El mensaje de error recibido al ejecutar el programa a través de gdb sugiere que el problema puede no estar relacionado específicamente con la llamada a readlink, sino más bien con una operación de movimiento de memoria que está fallando. Es posible que el segfault pueda ser causado por otros problemas en el programa, como acceder a memoria fuera de los límites asignados.

Comments are closed.