Welche Zahlen würden diese Funktion zum Absturz bringen?

10

Welche Werte von x und y verursachen bei einigen C-Compilern einen Absturz?

int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}
ugoren
quelle
Da Cs ternäre Operatorverknüpfungen, würde ich sagen, dass keine würde. Diese Frage scheint nicht zum Format dieser Website zu passen, die sich auf Programmrätsel und Codegolf konzentriert. Weitere Informationen finden Sie in der FAQ . Codegolf.stackexchange.com/faq .
Steven Rumbalski
Dies ist kein Code Golf, sondern ein Rätsel. Es gibt eine Antwort und es sind nur ein paar Zahlen.
Ugoren
Ich stehe korrigiert.
Steven Rumbalski
2
Nach dem K & R-Buch zu urteilen, darf diese Funktion eigentlich niemals abstürzen. Nach dem ANSI C-Standard ist das Verhalten in dem jeweiligen Absturzfall jedoch nicht definiert und stürzt bei x86-Compilern ab.
Ugoren
1
@dmckee, Wenn du die richtige Antwort gibst, bist du der Gewinner. Welches Kriterium könnte klarer und objektiver sein? Es gibt nur eine Antwort (oder haben Sie ein anderes Beispiel?)
ugoren

Antworten:

7

-2147483648 (INT_MIN) und -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: Gleitkomma-Ausnahme ./a.out

eregon
quelle
Tatsächlich. Dies sollte jedoch eine Warnung geben, da 2147483648 keine gültige Ganzzahl ist.
Ugoren
1
Ja, deshalb habe ich INT_MIN nachher verwendet, um ein gültiges int zu verwenden. Ich denke, der Grund dafür ist, dass 2147483648 kein gültiger int ist, da INT_MAX 2 ^ 31-1 mit 32-Bit-int ist.
Eregon
Ah. Zwei ergänzen. Das habe ich vermisst.
Steven Rumbalski
Ja, es sollte sauber mit INT_MIN kompiliert werden (das ist -2147483648).
Ugoren
3

Die richtige Antwort ist bereits gegeben, aber ich habe sofort an Microsoft Pex gedacht .

Pex generiert automatisch Testsuiten mit hoher Codeabdeckung. Direkt im Visual Studio-Code-Editor findet Pex interessante Eingabe-Ausgabe-Werte Ihrer Methoden, die Sie als kleine Testsuite mit hoher Codeabdeckung speichern können. Microsoft Pex ist ein Visual Studio-Add-In zum Testen von .NET Framework-Anwendungen

Nachdem Sie Ihr Puzzle in der Sandbox-Site hinzugefügt haben , findet es die Antwort in wenigen Sekunden, genau wie die Antwort von Eregons. (Klicken Sie auf Ask Pex)

Hinweis: Dies geschieht in C #, aber die Sprache ist nicht wirklich relevant.

  • x: int.MinValue
  • y: -1
  • Ausnahme: OverflowException
  • Meldung: Die arithmetische Operation führte zu einem Überlauf.
Ron Sijm
quelle
1
Nett. Es wird es sicherlich nicht brutal erzwingen, weil es nicht in wenigen Sekunden enden würde. Ich denke, jemand in MS hat erkannt, dass Zahlen um 0 und MAX_INT immer interessant sind.
Ugoren
Hoffentlich ist es etwas schlauer. Es könnte schauen (x/y)und wissen , dass INT_MIN, -1, 0usw. sind alle Problemfälle für diesen Ausdruck, und versuchen , einen Weg Reverse Engineering diese Werte zum Zeitpunkt der Auswertung zu erzeugen.
Ahnungslos