Angka mana yang akan menghancurkan fungsi ini?

10

Nilai x dan y mana yang akan menyebabkan crash dengan beberapa kompiler C?

int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}
ugoren
sumber
Karena pintas operator ternary C, saya akan mengatakan tidak ada yang mau. Pertanyaan ini sepertinya tidak sesuai dengan format untuk situs ini, yang berfokus pada teka-teki program dan golf kode. Lihat faq untuk detail codegolf.stackexchange.com/faq .
Steven Rumbalski
Ini bukan kode golf, tetapi puzzle. Ada jawaban, dan itu hanya beberapa angka.
ugoren
Saya berdiri dikoreksi.
Steven Rumbalski
2
Sebenarnya, dilihat dari buku K&R, fungsi ini benar-benar tidak boleh macet. Tetapi dengan standar ANSI C, perilaku dalam kasus crash tertentu tidak terdefinisi, dan dengan kompiler x86 crash.
ugoren
1
@ dmckee, Jika Anda memberikan jawaban yang benar, Anda adalah pemenangnya. Cretirion apa yang bisa lebih jelas dan objektif? Hanya ada satu jawaban (atau Anda punya contoh lain?)
ugoren

Jawaban:

7

-2147483648 (INT_MIN) dan -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: pengecualian floating point ./a.out

eregon
sumber
Memang. Meskipun ini harus memberikan peringatan, karena 2147483648 bukan bilangan bulat yang valid.
ugoren
1
Ya, itu sebabnya saya menggunakan INT_MIN setelahnya, untuk menggunakan int yang valid. Saya kira alasannya 2147483648 bukan int yang valid, karena INT_MAX adalah 2 ^ 31-1 dengan 32-bit int.
eregon
Ah. Dua komplemen. Saya melewatkan itu.
Steven Rumbalski
Ya, itu harus dikompilasi dengan bersih dengan INT_MIN (yaitu -2147483648).
ugoren
3

Jawaban yang tepat sudah diberikan, tetapi saya langsung memikirkan Microsoft Pex .

Pex secara otomatis menghasilkan suite uji dengan cakupan kode tinggi. Tepat dari editor kode Visual Studio, Pex menemukan nilai input-output yang menarik dari metode Anda, yang dapat Anda simpan sebagai test suite kecil dengan cakupan kode tinggi. Microsoft Pex adalah tambahan Visual Studio untuk pengujian aplikasi .NET Framework

Setelah menambahkan puzzle Anda di situs sandbox, ia menemukan jawabannya dalam beberapa detik, sama seperti jawaban eregons. (klik tanyakan pex)

Catatan: melakukannya dalam C #, tetapi bahasanya tidak benar-benar relevan.

  • x: int.MinValue
  • y: -1
  • Pengecualian: OverflowException
  • Pesan: Operasi aritmatika menghasilkan luapan.
Ron Sijm
sumber
1
Bagus. Itu pasti tidak memaksa, karena itu tidak akan berakhir dalam beberapa detik. Saya kira seseorang di MS menyadari bahwa angka sekitar 0 dan MAX_INT selalu menarik.
ugoren
Semoga sedikit lebih pintar dari itu. Mungkin melihat (x/y)dan tahu bahwa INT_MIN, -1, 0dll semua kasus masalah bagi ekspresi itu, dan mencoba untuk melakukan reverse engineering cara untuk menghasilkan nilai-nilai tersebut pada saat evaluasi.
Clueless