2009-10-21 11 views
9

Tengo una gran base de código que usa una serie de funciones inseguras, como gmtime y strtok. En lugar de intentar buscar a través de la base de código y reemplazar estos al por mayor, me gustaría hacer que el compilador emita una advertencia o un error cuando los vea (para resaltar el problema a los desarrolladores de mantenimiento). ¿Es esto posible con GCC?Marcar las funciones de la biblioteca como obsoletas/inutilizables sin modificar su código fuente

Ya sé acerca de __attribute__((deprecated)), pero AFAIK no puedo usarlo ya que no tengo control de los archivos de encabezado donde se declaran estas funciones.

+0

Si pudiera cambiar el origen de la biblioteca: http://stackoverflow.com/questions/295120/c-mark-as-deprecated –

Respuesta

12

Cree un encabezado personalizado deprecated.h. Allí, cree sus propias funciones de contenedor, deprecated_strtok(), etc. que simplemente llamen al strtok. Marque ésos con __attribute__((deprecated)). Debajo de esas definiciones, #define strtok deprecated_strtok. Finalmente, use -include deprecated.h

+0

Lo único que no me gusta de esto es que tengo que repetir la firma de la función completa, y un error de transcripción (o un ligero cambio en la interfaz entre las versiones de gcc/libc) puede producir misteriosos errores de vinculación. Sin embargo, usando esta estrategia puedo usar tanto '__attribute __ ((obsoleto))' para las sugerencias, y '#pragma GCC poison' para los mandatos. – Tom

7

Pruebe esto en un archivo fuente, con un gcc suficientemente reciente que debe evitar que los desarrolladores utilicen estas dos funciones.

#pragma GCC poison gmtime 
#pragma GCC poison strtok 

El inconveniente es que solo es válido para una unidad de compilación. Si usas encabezados precompilados (lo que seguro harás si tu proyecto es grande), podrías ponerlos allí. Al menos esta solución no implica la decoración de declaraciones de funciones en los encabezados del sistema y funciona en tiempo de compilación.

Poison es quizás un poco difícil ya que produce errores y no advertencias. ¿Alguien sabe cómo debilitarlo? Al menos es una buena manera de hacer cumplir una política NO USAR FUNCIÓN xxx.

+0

Estoy satisfecho con un error. Voy a verificar esto. Además, no, no usamos encabezados precompilados. La vinculación ya domina nuestro tiempo de construcción (y no se paraleliza tan bien), por lo que no hay beneficio en optimizar el lado de la compilación. – Tom

+0

¿Debe asegurarse de no incluir ningún encabezado estándar después de usar el veneno pragma? ¿O solo es un error para las llamadas a funciones y no para las declaraciones? – bk1e

+0

El envenenamiento reacciona tanto en el uso como en la declaración. Eso agrega la restricción que mencionas. Lo estoy usando al final del encabezado precompilado y realmente no me importaba antes. – jdehaan

Cuestiones relacionadas