Desbordamiento de enteros y comportamiento indefinido

Hay muchas preguntas sobre la detección del desbordamiento de enteros ANTES de la sum / substracción real debido a un posible undefined behavior . Entonces, mi pregunta es

¿Por qué producirá este undefined behavior en primer lugar?

Puedo pensar en 2 causas:

1) Un procesador que genera excepción en este caso. Claro, se puede apagar, y lo más probable es que un CRT bien escrito lo haga.

2) Un procesador que usa otras representaciones binarias de números (complemento 1? Base 10?). En ese caso, el comportamiento indefinido se manifestará como un resultado diferente (¡pero no se bloqueará!). Bueno, podríamos vivir con eso.

Entonces, ¿por qué alguien debería evitar causarlo? ¿Me estoy perdiendo de algo?

Aunque la mayoría de las CPU modernas usan el complemento 2, y el desbordamiento entero da como resultado un envolvente de módulo predecible, esto de ninguna manera es universal: para mantener el lenguaje lo suficientemente general como para usarlo en la gama más amplia de architectures, es mejor especificar que el desbordamiento entero es UB .

Si bien el desbordamiento firmado por razón histórica se especificó como un comportamiento indefinido probablemente fueron estas representaciones heredadas falsas (complemento / magnitud de signo) y las interrupciones de desbordamiento, la razón moderna para que siga siendo un comportamiento indefinido es la optimización. Como J-16 SDiZ insinuó, el hecho de que el desbordamiento firmado sea un comportamiento indefinido le permite al comstackdor optimizar algunos condicionales cuya verdad algebraica (pero no necesariamente la verdad del nivel de representación) ya han sido establecidos por una twig previa. También puede permitir al comstackdor simplificar algebraicamente algunas expresiones (especialmente aquellas que involucran multiplicación o división) de forma que podrían dar resultados diferentes al orden de evaluación originalmente escrito si una subexpresión contiene un desbordamiento, ya que el comstackdor puede suponer que se desborda. no sucede con los operandos que le has dado.

El otro gran ejemplo de comportamiento indefinido con el fin de permitir la optimización son las reglas de aliasing.

Los bits de undefined behavior en la especificación implican cierta optimización del comstackdor. Por ejemplo:

 if (a > 0 && b > 0) { if ( a + b < = 0 ) { // this branch may be optimized out by compiler } else { // this branch will always run } } 

Los comstackdores de C modernos no son tan simples, hacen muchas conjeturas y optimizaciones.

Creo que su suposición 1) de que esto puede apagarse para cualquier procesador dado ha sido falsa en al menos una architecture histórica importante, el CDC, si mi memoria es correcta.