Quais números travariam essa função?


10

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);
}

Desde os atalhos ternários de C, eu diria que nenhum. Esta pergunta parece não se encaixar no formato deste site, focado em quebra-cabeças de programas e código de golfe. Consulte o FAQ para obter detalhes codegolf.stackexchange.com/faq .
Steven Rumbalski

Isso não é código de golfe, mas é um quebra-cabeça. Há uma resposta e são apenas alguns números.
ugoren

Eu estou corrigido.
Steven Rumbalski

2
Na verdade, a julgar pelo livro de K&R, essa função nunca deve falhar. Mas, pelo padrão ANSI C, o comportamento no caso específico de falha é indefinido e, nos compiladores x86, ele falha.
ugoren

11
@ DMCkee, se você der a resposta certa, você é o vencedor. Que cretirion poderia ser mais claro e objetivo? Há apenas uma resposta (ou você tem outro exemplo?)
ugoren

Respostas:


7

-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


De fato. Embora isso deva dar um aviso, porque 2147483648 não é um número inteiro válido.
ugoren

11
Sim, é por isso que usei INT_MIN depois, para usar um int válido. Eu acho que o motivo é 2147483648 não é um int válido, já que INT_MAX é 2 ^ 31-1 com int de 32 bits.
eregon

Ah Complemento de dois. Eu senti falta disso.
Steven Rumbalski

Sim, ele deve ser compilado corretamente com INT_MIN (que é -2147483648).
ugoren

3

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: int.MinValue
  • y: -1
  • Exceção: OverflowException
  • Mensagem: A operação aritmética resultou em um estouro.

11
Agradável. Certamente não a força bruta, porque não terminaria em alguns segundos. Eu acho que alguém no MS percebeu que números em torno de 0 e MAX_INT são sempre interessantes.
ugoren

Espero que seja um pouco mais inteligente que isso. Pode olhar (x/y)e saber que INT_MIN, -1, 0etc, 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.
Clueless
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.