2011-09-20 7 views
5

¿Hay alguna manera de protegerse contra el código binario resultante del código en this question? Idealmente por medio de un error en tiempo de compilación. Código de ejemplo de la pregunta:¿Hay alguna manera de provocar un error de compilación si intenta asignar un número negativo a un contenedor sin firmar?

unsigned int nVal = 0; 
nVal = -5; // no error! 
+0

'compiler error' at runtime? * La asignación * ocurre en tiempo de ejecución. – Nawaz

+1

Puede haber una forma de explotar reglas de conversión complicadas, pero significaría cambiar su código para que ya no use 'unsigned int', sino algo así como' EnforcedUnsignedInt' con otras clases intermedias para causar una generación de código diferente cuando se usa 'operator = 'con firmado/sin firmar. Veredicto: no es práctico/realista. – tenfour

+1

La asignación inicial de '0' (que está firmada), en lugar de' 0u', presumiblemente también generaría la advertencia/error que desea. –

Respuesta

10

Si está utilizando g ++, el interruptor -Wsign-conversion advertirá acerca de la conversión, y -Werror hará que un error de advertencia.

+0

Perfecto, ¡justo lo que buscaba! –

+0

En Visual Studio, también puede activar la característica "tratar advertencias como errores" en las opciones de compilación de un proyecto. Y el compilador debería generar una advertencia de posible pérdida de datos al convertir de int a unsigned int. – Seb

4

Editar: Aparte de la respuesta de @thiton.

Con la asignación simple no es posible. Sin embargo, si asigna el valor en un pequeño forma envolvente especial, entonces puede ayudar. es decir

nVal = -5; 

debe sustituirse con,

Assign<-5>(nVal); 

Cuando, Assign() parece,

template<int VAL> 
void Assign (unsigned int &nVal) 
{ 
    typedef int arr[(VAL >= 0) 1 : -1]; 
    nVal = VAL; 
} 

Demo.

Cuestiones relacionadas