Quels nombres planteraient cette fonction?

10

Quelles valeurs de x et y provoqueront un crash avec certains compilateurs C?

int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}
ugoren
la source
Depuis les raccourcis de l'opérateur ternaire de C, je dirais que non. Cette question ne semble pas correspondre au format de ce site, qui se concentre sur les puzzles de programme et le code golf. Consultez la FAQ pour plus de détails codegolf.stackexchange.com/faq .
Steven Rumbalski
Ce n'est pas du golf de code, mais c'est un puzzle. Il y a une réponse, et ce ne sont que quelques chiffres.
ugoren
Je me suis trompé.
Steven Rumbalski
2
En fait, à en juger par le livre K&R, cette fonction ne doit vraiment jamais tomber en panne. Mais selon la norme ANSI C, le comportement dans le cas particulier de plantage n'est pas défini et avec les compilateurs x86, il se bloque.
ugoren
1
@dmckee, Si vous donnez la bonne réponse, vous êtes le gagnant. Quel crétirion pourrait être plus clair et objectif? Il n'y a qu'une seule réponse (ou avez-vous un autre exemple?)
ugoren

Réponses:

7

-2147483648 (INT_MIN) et -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: exception à virgule flottante ./a.out

eregon
la source
En effet. Bien que cela devrait donner un avertissement, car 2147483648 n'est pas un entier valide.
ugoren
1
Oui, c'est pourquoi j'ai utilisé INT_MIN après, pour utiliser un int valide. Je suppose que la raison est que 2147483648 n'est pas un entier valide, car INT_MAX est 2 ^ 31-1 avec un entier 32 bits.
eregon
Ah. Complément à deux. J'ai manqué ça.
Steven Rumbalski
Oui, il devrait compiler proprement avec INT_MIN (qui est -2147483648).
ugoren
3

La bonne réponse est déjà donnée, mais j'ai immédiatement pensé à Microsoft Pex .

Pex génère automatiquement des suites de tests avec une couverture de code élevée. Dès l'éditeur de code Visual Studio, Pex trouve des valeurs d'entrée-sortie intéressantes de vos méthodes, que vous pouvez enregistrer en tant que petite suite de tests avec une couverture de code élevée. Microsoft Pex est un complément Visual Studio pour tester les applications .NET Framework

Après avoir ajouté votre puzzle dans le site sandbox, il trouve la réponse en quelques secondes, la même que la réponse eregons. (cliquez sur demander pex)

Remarque: il le fait en C #, mais le langage n'est pas vraiment pertinent.

  • x: int.MinValue
  • y: -1
  • Exception: OverflowException
  • Message: L'opération arithmétique a entraîné un débordement.
Ron Sijm
la source
1
Agréable. Cela ne le force sûrement pas, car cela ne se terminerait pas en quelques secondes. Je suppose que quelqu'un dans MS a réalisé que les nombres autour de 0 et MAX_INT sont toujours intéressants.
ugoren
J'espère que c'est un peu plus intelligent que ça. Il peut regarder (x/y)et savoir que INT_MIN, -1, 0etc. sont tous les cas de problème pour cette expression, et essayer de désosser une façon de produire ces valeurs au moment de l' évaluation.
Clueless