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);
}
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);
}
Jawaban:
-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
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/y)
dan tahu bahwa INT_MIN
, -1
, 0
dll semua kasus masalah bagi ekspresi itu, dan mencoba untuk melakukan reverse engineering cara untuk menghasilkan nilai-nilai tersebut pada saat evaluasi.