segmentation raspberry error c segmentation-fault signals

raspberry - Cómo detectar si la variable no iniciada/catch segfault en C



segmentation fault python (3)

Actualmente tengo un programa donde necesito probar si una variable pasada como parámetro no está inicializada. Hasta ahora, parece que esto es bastante difícil de hacer en C, así que mi siguiente idea fue invocar a un manejador de señal para atrapar el segfault. Sin embargo, mi código no está llamando al controlador de señal cuando intenta acceder a la variable no inicializada, así:

void segfault_sigaction(int signal, siginfo_t *si, void *arg) { printf("Caught segfault at address %p/n", si->si_addr); exit(0); } void myfree(void*p, char * file, int line){ struct sigaction sa; memset(&sa, 0, sizeof(sigaction)); sigemptyset(&sa.sa_mask); sa.sa_sigaction = segfault_sigaction; sa.sa_flags = SA_SIGINFO; sigaction(SIGSEGV, &sa, NULL); char up = *((char*)p); //Segfault

EDITAR: en el sistema Linux


Los punteros no tienen valor predeterminado si no lo inicializaste. A veces es NULL (si p es NULL , puedes ver el SIGSEGV ), a veces apunta a una memoria válida y parece que todo está bien. El valor que tienen es cualquier basura que haya en la memoria que están usando ahora. En cuanto a su problema, le sugiero que escriba su propia versión de malloc() y free() , ponga un número mágico en el encabezado de la memoria asignada y pruebe si todavía está allí cuando lo libere.


Esta no es una buena idea Si el programa intenta usar una variable no inicializada, entonces siempre es un error. La forma correcta de encontrar este error es usar un buen compilador con todas las advertencias habilitadas o, mejor aún, una herramienta de análisis estático. El error debe ser encontrado y reparado cuando se desarrolla el programa. No en tiempo de ejecución

Además, con un buen diseño del programa, la persona que llama es responsable de pasar los parámetros correctos a una función. La función no debería tener que preocuparse por la persona que llama en absoluto. Si se pasa un parámetro incorrecto por referencia, todas las apuestas están desactivadas.

El acceso a la memoria apuntada por un puntero no inicializado conduce a un comportamiento indefinido, que incluye los siguientes resultados:

  • Hay una falla de segmentación.
  • Hay un bloqueo del programa.
  • No pasa nada, pero el programa comienza a comportarse de maneras extrañas.
  • No pasa nada y el programa parece funcionar bien.

Si está haciendo esto porque quiere una programación defensiva, debería considerar algún tipo de comprobación de cordura de los valores de las variables en su lugar, preferiblemente a través de assert () o static_assert ().


Intente usar Valgrind con la herramienta memcheck. Puede detectar el acceso a la memoria no inicializada, así como una serie de otros patrones de acceso no válidos. Un tutorial se puede encontrar aquí . Agregar el argumento --track-orígenes = sí (requiere la versión 3.4.0) puede facilitar el uso de la memoria no inicializada.