¿Qué números bloquearían esta función?

10

¿Qué valores de x e y causarán un bloqueo con algunos compiladores de C?

int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}
Ugoren
fuente
Dado que los atajos de operador ternario de C, diría que ninguno lo haría. Esta pregunta no parece ajustarse al formato de este sitio, que se centra en los acertijos de programas y el código de golf. Consulte las preguntas frecuentes para obtener detalles codegolf.stackexchange.com/faq .
Steven Rumbalski
Esto no es código golf, pero es un rompecabezas. Hay una respuesta, y son solo un par de números.
Ugoren
Estoy corregido.
Steven Rumbalski
2
En realidad, a juzgar por el libro de K&R, esta función realmente nunca debe fallar. Pero según el estándar ANSI C, el comportamiento en el caso de bloqueo particular no está definido, y con los compiladores x86 falla.
ugoren
1
@dmckee, si das la respuesta correcta, eres el ganador. ¿Qué cretirion podría ser más claro y objetivo? Sólo hay una respuesta (o tiene otro ejemplo?)
ugoren

Respuestas:

7

-2147483648 (INT_MIN) y -1

#include <stdio.h>
#include <limits.h>
int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}
int main() {
    int r = f(INT_MIN, -1);
    printf("%d\n", r);
    return 0;
}

$ gcc -Wall division.c && ./a.out # => zsh: excepción de coma flotante ./a.out

eregon
fuente
En efecto. Aunque esto debería dar una advertencia, porque 2147483648 no es un número entero válido.
Ugoren
1
Sí, por eso usé INT_MIN después, para usar un int válido. Supongo que la razón es que 2147483648 no es un int válido, ya que INT_MAX es 2 ^ 31-1 con int de 32 bits.
eregon
Ah Complemento de dos. Me lo perdí.
Steven Rumbalski
Sí, debe compilarse limpiamente con INT_MIN (que es -2147483648).
ugoren
3

La respuesta correcta ya está dada, pero inmediatamente pensé en Microsoft Pex .

Pex genera automáticamente conjuntos de pruebas con alta cobertura de código. Desde el editor de código de Visual Studio, Pex encuentra valores interesantes de entrada y salida de sus métodos, que puede guardar como un pequeño conjunto de pruebas con una alta cobertura de código. Microsoft Pex es un complemento de Visual Studio para probar aplicaciones .NET Framework

Después de agregar su rompecabezas en el sitio de sandbox, encuentra la respuesta en unos segundos, igual que la respuesta de eregons. (haga clic en preguntar pex)

Nota: lo hace en C #, pero el lenguaje no es realmente relevante.

  • x: int.MinValue
  • y: -1
  • Excepción: OverflowException
  • Mensaje: La operación aritmética resultó en un desbordamiento.
Ron Sijm
fuente
1
Agradable. Seguramente no la fuerza bruta, porque no terminaría en unos segundos. Supongo que alguien en MS se dio cuenta de que los números alrededor de 0 y MAX_INT siempre son interesantes.
ugoren
Esperemos que sea un poco más inteligente que eso. Podría mirar (x/y)y saber que INT_MIN, -1, 0etc, son todos los casos de problemas de esa expresión, y tratar de aplicar ingeniería inversa a una manera de producir esos valores en el momento de la evaluación.
Clueless