2012-01-24 5 views
7

Tenemos un código escrito en C que a veces no maneja bien los punteros a cero.Manejo de punteros nulos en AIX con GCC C

El código fue escrito originalmente en Solaris y tales punteros causan un error de segmentación. No es ideal, pero es mejor que arar.

Nuestra experiencia es que si se lee de un puntero nulo en AIX se obtiene 0. Si se utiliza el xlc compilador puede agregar una opción -qcheck=all para atrapar a estos punteros. Pero usamos gcc (y queremos seguir usando ese compilador). ¿Ofrece gcc esta opción?

+1

¿Qué quiere decir con "no maneja bien los punteros"? –

+3

Personalmente, considero todas las referencias a NULL (que técnicamente es '0') como errores, y agregaría código para verificarlo en lugar de confiar en que el compilador lo haga por mí. ¿Sobre todo porque el compilador no sabe lo que quiero hacer si hay un puntero 'NULL'? Algunas veces está bien omitir el código de acceso al puntero, a veces es un error fatal que debe abortar el programa. –

+1

AFAIK desreferenciando un puntero NULL conduce a un comportamiento indefinido. –

Respuesta

6

¿Ofrece gcc esta opción?

Soy tímidamente voluntario la respuesta no, no lo hace. Aunque no puedo citar el ausencia de información con respecto a gcc y verificaciones NULL de tiempo de ejecución.

El problema que estás enfrentando es que estás tratando de hacer un comportamiento indefinido un poco más definido en un programa que está mal escrito.

Recomiendo que muerda la viñeta y cambie a xlc o añada manualmente las verificaciones NULL al código hasta que se haya encontrado y eliminado el mal comportamiento.

considerar:

  • Hacer una macro para anular a comprobar un puntero
  • Agregando que la macro después de asignaciones puntero
  • Agregando que la macro al punto de entrada de las funciones que aceptan punteros

A medida que se eliminan errores, puede comenzar a eliminar estos controles.

2
  1. Por favor, háganos un favor a todos y añadir adecuados NULL cheques a su código. No solo tendrá un ligero aumento en el rendimiento al buscar NULL solo cuando sea necesario, en lugar de hacer que el compilador realice la comprobación en todas partes, pero su código será más portátil para otras plataformas.

    Y no mencionemos el hecho de que será más probable que imprima un mensaje de error adecuado en lugar de que el compilador elimine un código de error/ubicación de código de volcado de pila incomprensible que no ayudará a sus usuarios.

  2. AIX utiliza el concepto de página NULL. Esencialmente, NULL (es decir, la dirección virtual 0x0) se asigna a una ubicación que contiene un montón completo de ceros. Esto permite el código de manipulación de cadenas e.t.c. para continuar a pesar de encontrar un puntero NULL.

    Esto es contrario a la mayoría de los demás sistemas tipo Unix, pero no infringe el estándar C, que considera eliminar la referencia NULL de una operación indefinida. En mi opinión, sin embargo, esto está lamentablemente roto: se necesita una aplicación que se bloquee violentamente y la convierta en una que ignore silenciosamente los errores de programación, lo que podría producir resultados totalmente incorrectos.

  3. Por lo que sé, GCC no tiene opciones para evitar el código fundamentalmente roto. Incluso los patrones compatibles históricamente, como los literales de cadena grabables, se han eliminado gradualmente en las versiones más nuevas de GCC.

    Puede haber algo de soporte cuando utilizo opciones de depuración de memoria como -fmudflap, pero realmente no lo sé, en cualquier caso no debería usar código de depuración en sistemas de producción, especialmente para forzar el código dañado.

En pocas palabras: no creo que se puede evitar añadiendo explícitas NULL cheques.

Lamentablemente, ahora llegamos a la pregunta básica: ¿Dónde deberían agregarse las comprobaciones NULL?. Supongo que hacer que el compilador agregue estos controles indiscriminadamente ayudaría, siempre que agregue una verificación explícita cuando descubra un problema.

Desafortunadamente, no hay soporte de Valgrind para AIX. Si tiene efectivo, es posible que desee echarle un vistazo a IBM Rational Purify Plus para AIX, ya que podría detectar dichos errores.

También es posible utilizar xlc en un sistema de prueba y gcc para todo lo demás, pero desafortunadamente no son totalmente compatibles.