この関数をクラッシュさせる数値はどれですか?


10

一部のCコンパイラでは、xとyのどの値がクラッシュの原因になりますか?

int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}

Cの3項演算子のショートカットなので、そうはしないと思います。この質問は、プログラムパズルとコードゴルフに焦点を当てたこのサイトのフォーマットに適合しないようです。codegolf.stackexchange.com/faqの詳細については、FAQを参照してください
Steven Rumbalski、2012年

これはコードゴルフではありませんが、パズルです。答えはあり、それはほんの数の数字です。
ugoren

私は修正された立場です。
Steven Rumbalski、2012年

2
実際、K&Rの本で判断すると、この関数は決してクラッシュしてはなりません。ただし、ANSI C標準では、特定のクラッシュの場合の動作は定義されておらず、x86コンパイラではクラッシュします。
ugoren

1
@dmckee、正解すると正解です。どの基準がより明確で客観的である可能性がありますか?答えは1つしかありません(または別の例がありますか)
ugoren

回答:


7

-2147483648(INT_MIN)および-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:浮動小数点例外./a.out


確かに。2147483648は有効な整数ではないため、これにより警告が表示されます。
ugoren

1
はい、それが有効なintを使用するために後でINT_MINを使用した理由です。INT_MAXが32ビットintの2 ^ 31-1であるため、理由は2147483648が有効なintではないようだと思います。
エレゴン

ああ。2の補数。私は逃しました。
Steven Rumbalski、2012年

はい、INT_MIN(-2147483648)で正常にコンパイルされます。
ugoren

3

正しい答えはすでに出ていますが、私はすぐにMicrosoft Pexについて考えました。

Pexは、コードカバレッジの高いテストスイートを自動的に生成します。Pexは、Visual Studioコードエディターから直接、メソッドの興味深い入出力値を検出します。これは、コードカバレッジの高い小さなテストスイートとして保存できます。Microsoft Pexは、.NET FrameworkアプリケーションをテストするためのVisual Studioアドインです。

後はあなたのパズルを追加するサンドボックスのサイトでは、それは、数秒でeregonsの答えと同じ答えを見つけました。(ask pexをクリック)

注:これはC#で行われますが、言語は実際には関係ありません。

  • x:int.MinValue
  • y:-1
  • 例外:OverflowException
  • メッセージ:算術演算でオーバーフローが発生しました。

1
いいね。数秒で終わらないので、それは確かにそれを総当たりしません。MSの誰かが0とMAX_INTの周りの数字が常に興味深いことに気付いたと思います。
ugoren

うまくいけば、それはそれよりも少し賢いです。それは時に見えるかもしれません(x/y)し、それを知っているINT_MIN-10などをその発現のために、すべての問題の例であり、評価時にこれらの値を生成するための方法をリバースエンジニアリングしてみてください。
2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.