Pregunta

Tengo un proyecto en el que acaba de descubrir que la advertencia C4244 (posible pérdida de datos) está siendo suprimida. Tengo la firme sospecha de que algunos encabezado MS mala muerte es la supresión de esta advertencia y dejándolo suprimida para todas las unidades de traducción que incluyen dicha cabecera, pero no hemos determinado cuál de sus múltiples cabeceras puede ser culpable.

Así que, como cualquier otro problema de programación, me gustaría empezar por hacer una búsqueda binaria, imprimiendo el nivel de alerta actual y si es posible las advertencias suprimidas en mi principal Cabecera Pre Compilado.

¿Alguien sabe qué directiva de compilación puede ser que utilice, o qué enfoque que podría ser capaz de tomar que me dé esa información?

No puedo decir lo desagradable que es encontrar que mis declaraciones de tipo cuidadosamente construidas en mis cabeceras están fallando para dar una advertencia del compilador cuando una persona viola el contrato y trata de enviarme un entero en lugar de un byte con signo (que tiene conducido al error actual que estoy tratando de resolver).

Los pensamientos?

NOTAS:

Las búsquedas en #pragma a través de todo mi solución vienen con sólo declaraciones equilibradas de #pragma warning (disable: xxxx) seguido de #pragma warning (por defecto: xxxx). Y ninguno de los Referencia 4244.

Las búsquedas en 4244 a lo largo de toda la solución regresan coincidencias (Nunca omiso de esa advertencia, ni tampoco ninguno de mis bibliotecas incluidas, sub-proyectos, etc.).

Las búsquedas en 4244 en toda la EM incluyen vías de retorno, algunas referencias que aparezcan que ser equilibrada, o casi, en función de los símbolos # define que se establecieron antes de llamar a ellos. De ahí mi sospecha de que la EM es la culpa (combinado con historia previa de MS haciendo el trabajo descuidado en sus cabeceras).

¿Fue útil?

Solución 4

Después de una investigación adicional:

/ P lleva demasiado tiempo (Nunca testigo que ir más allá de unos pocos archivos a lo largo de casi una hora, por lo que la acumulación Cancelé)

Nunca he sido capaz de encontrar una manera clara para imprimir lo que fue el nivel de alerta actual, o cualquier anulación que estaban en vigor en un punto dado en la compilación. Así que la pregunta que hice no es realmente respondió, a menos que el argumento / P en realidad es útil para usted (como he mencionado, no era práctico para mis propósitos).

Lo que yo era capaz de hacer era construir algunas llamadas en línea en las distintas cabeceras que debe generar el requisito de advertencia si el nivel de aviso de advertencia que incluye como activo, para verificar si esa advertencia era activo o no:

inline int prueba (valor char) {return ++ valor; }

incluir "algo"

inline int test1 (int value) {prueba de retorno (valor); } // debe generar C4244 -. Posible pérdida de datos si el # include anterior no estropear el nivel de aviso o advertencia de anulación de 4244

Y así sucesivamente ...

Al final, lo que descubrí fue que 4244, en particular, tiene algunas reglas extrañas asociadas con ella, y que es efectivamente "desactivado" en todo menos en / W4 (nivel de advertencia 4) - el nivel más alto de advertencia. Dado que el nivel de alerta es muy, muy delicado y se queja de un montón de cosas que están más allá de nuestro alcance de hacer nada acerca de ellos, que no quería para activar / W4.

Lo que yo estaba en lugar de poner el siguiente en nuestra PCH stdafx.hy:

Pragma advertencia (error: 4244) // esto permite plenamente las advertencias de una posible pérdida de datos debido a la conversión de tipos implícita en todas las circunstancias, independientemente del nivel de alerta activa

Eso trabajado.

Así, MS no dejó anulaciones de advertencia desequilibradas en cualquiera de sus archivos que nos afectaron. Era sólo que 4244 es muy indulgente excepto en el nivel más alto de advertencia, donde se convierte en verdaderamente útil para nosotros, de todos modos.

Gracias por su ayuda!

Otros consejos

Otra opción es añadir este

#pragma warning (defualt) 

en la parte superior del archivo justo después de las #includes Esto restablece el aviso al defualt, descartando cualquier caso omiso de lo que podría haber sido llamado.

En una nota diferente, creo que es muy poco probable que un encabezado de Microsoft podría desactivar una advertencia.

Puede usted acaba de hacer una búsqueda a través de todos los archivos de cabecera para "C4244" o qué sólo tienen acceso a pre-compilado archivos de cabecera?

scroll top