Quais valores de x e y causarão uma falha em alguns compiladores C?
int f(int x, int y) {
return (y==0) ? 0 : (x/y);
}
Quais valores de x e y causarão uma falha em alguns compiladores C?
int f(int x, int y) {
return (y==0) ? 0 : (x/y);
}
Respostas:
-2147483648 (INT_MIN) e -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: exceção de ponto flutuante ./a.out
A resposta certa já foi dada, mas pensei imediatamente no Microsoft Pex .
O Pex gera automaticamente suítes de teste com alta cobertura de código. Diretamente do editor de código do Visual Studio, o Pex encontra valores interessantes de entrada e saída de seus métodos, que você pode salvar como um pequeno conjunto de testes com alta cobertura de código. Microsoft Pex é um suplemento do Visual Studio para testar aplicativos do .NET Framework
Depois de adicionar seu quebra-cabeça no site da sandbox, ele encontra a resposta em alguns segundos, o mesmo que o eregons responde. (clique em pedir pex)
Nota: faz isso em C #, mas o idioma não é realmente relevante.
(x/y)
e saber que INT_MIN
, -1
, 0
etc, são todos os casos de problemas para essa expressão, e tentar fazer engenharia reversa de uma maneira de produzir esses valores no momento da avaliação.