2012-06-02 9 views
6

Duplicar posible:
Best way to detect integer overflow in C/C++detección automática de desbordamiento en C++?

A menudo, cuando he codificado algo en C++ utilizando un gran número que no puedo decir cuando se produce desbordamiento, incluso si estoy usando algo así como una largo largo u otro tipo de datos de 64 bits. ¿Existe una manera efectiva de detectar cuándo se está produciendo el desbordamiento que presenciar valores erróneos?

+1

En lugar de utilizar valores enteros en bruto, se puede usar objetos con los operadores aritméticos sobrecargados que generen excepciones cuando se produce desbordamiento. – jamesdlin

+2

¿cuál es la operación que está haciendo con los números? – Baget

+0

@Baget podría ser cualquier cosa. suma, resta, multiplicación, exponente, etc. depende del programa –

Respuesta

2

Puede que no haya mucho que se podrían obtener de C++ estándar:

5 Expresiones

No Si durante la evaluación de una expresión, el resultado es matemáticamente definida o no en el rango de valores representables para su tipo, el comportamiento no está definido. [Nota: la mayoría de las implementaciones existentes de C++ ignoran los desbordamientos de enteros. El tratamiento de la división por cero, formando un resto usando un divisor cero, y todas las excepciones de punto flotante varían entre las máquinas, y generalmente se puede ajustar mediante una función de biblioteca . nota -fin]

Su mejor opción es utilizar probablemente los tipos enteros ancho fijo estándar definidos en <cstdint> como uint32_t.

Eche un vistazo al encabezado <cerrno> también para los códigos de error como EOVERFLOW. Luego están las clases overflow_error/underflow_error de <stdexcept>.

+0

EOVERFLOW se puede configurar mediante las funciones de la biblioteca, pero no se establece mediante operaciones aritméticas. –

1

En realidad, ni siquiera puede detectar el desbordamiento de forma fiable después del hecho, porque el desbordamiento en las operaciones de entero con signo da como resultado un comportamiento indefinido. Si el compilador puede ver que solo se llega a una ruta de código en caso de un desbordamiento, se puede optimizar completamente (ya que en el caso de comportamiento indefinido puede hacer cualquier cosa). Los tipos sin signo son diferentes porque tienen características de desbordamiento definidas (realizan la aritmética del módulo).

Por lo tanto, la única forma de detectar el desbordamiento con los tipos firmados es realizar la comprobación adecuada de antemano, lo cual es bastante caro. Casi siempre es mucho más eficiente diseñar cosas de modo que una constante de su algoritmo asegure que no puede haber un desbordamiento.

En cuanto a los recursos de detectar la posible desbordamiento antes de que suceda, ver https://stackoverflow.com/a/199413/445525

Cuestiones relacionadas