SIGSEGVを発生させる最短のコード

セグメンテーション違反(SIGSEGV)を発生させる最短のコードを記述します任意のプログラミング言語。

コメント

  • うわー。おそらく最短の成功した質問です。
  • @MatthewRoh興味深いことに、私はこの SEDEクエリを作成しました。 +10以上のものがいくつかあるようですが、これは+40を超える最初のものです

回答

C、5文字

main; 

変数宣言-intタイプが暗黙指定されます(機能はからコピーされます) B言語)および0がデフォルト値です。これを実行すると、数値が実行され(数値は実行できません)、SIGSEGVが発生します。 。

オンラインでお試しください!

コメント

  • @Macmade:実際は0です。 static変数は0で始まり、main;static、関数の外で宣言したので。 c-faq.com/decl/initval.html
  • 前回このことで遊んだとき、そこにあることがわかりました’セグメンテーション違反のさまざまな理由。まず、mainを呼び出すと、値ではなくmainの場所にジャンプします。別のことは、mainはintであり、’ ■.bssにあり、通常、関数は.textにあり、カーネルがelfプログラムをロードすると、

.bssの場合は実行不可です。したがって、mainを呼び出すと、実行不可能なページにジャンプし、そのようなページで何かを実行すると、保護障害。

  • はい、Cのセグメンテーション違反はほとんどデフォルトです:P
  • main __attribute__((section(".text#")))=0xc3; FTFY(少なくともそれなしで戻るようですx86でクラッシュします。
  • @jozxyqk以下、const main=195;。 ‘が機能しているのは興味深いことですが、このコードゴルフの課題の目標は、コードをセグメンテーション違反にすることであり、機能しないことでした:)
  • 回答

    Bash、11            

    kill -11 $$ 

    コメント

    • 11文字の信号11。正当なようです。
    • @ nyuszika7hコメントに賛成するつもりでしたが、現在11の賛成票があるので、’そのままにしておきます。 :P
    • @AlexL。他の人はそれを台無しにしたようです:(
    • @theonlygustiうん…それは’ひどいです。:(まあ、それなら私は今それを賛成することができます。
    • 最大42の賛成票、タッチなし!

    回答

    アセンブリ(Linux 、x86-64)、1バイト

    RET 

    このコードはセグメンテーション違反です。

    コメント

    • MSDOS .comファイルとして、エラーなしで実行および終了します。
    • 私の要点は、「アセンブリ」を指定するだけでは’十分ではありません。
    • @JB:MS DOSでは、 no プログラムは決してセグメンテーション違反を発生させません。’は、MSDOSがメモリ保護が存在しないリアルモードで実行されるためです。
    • @celtschk IIRC NTVDMは、存在しないアドレスとMS-DOSに割り当てられていないアドレスで発生します。
    • @celtschk:とにかく次のようにセグメンテーション違反を起こすことができます:mov bx、1000h; shr ebx、4; mov eax、[ebx]-> CPUレイズs基盤となるSEGV(AFAIK there ‘誰もそれを処理できません)

    回答

    Python 2、13

    exec"()"*7**6 

    Windowsはc00000fd(Stack Overflow)のエラーコードを報告します。これは次のサブタイプであると想定しています。セグメンテーション違反。

    Alex A.とMegoのおかげで、MacおよびLinuxシステムでもセグメンテーション違反が発生することが確認されています。 Pythonは、プログラムを移植可能にクラッシュさせるために選択される言語です。

    コメント

    • Segmentation fault: 11 Mac
    • Segmentation fault (core dumped) Linuxの場合
    • これは最初にハングアップしますか?
    • @MegaMan同様に終了するのに長い時間がかかります?いいえ、7 ** 6は約100Kしかないため、’目に見える遅延はありません。
    • @MaxGasnerプログラミング言語をもう一度読んでみてください:)

    回答

    pdfTeX( 51)

    \def~#1{\meaning}\write0{\expandafter~\string}\bye 

    これは実際にはおそらくバグですが、 Knuthによって作成された元のTeX:pdftex filename.texの代わりにtex filename.texを使用してコードをコンパイルしてもセグフォールトは生成されません。

    回答

    LOLCODE、4バイト

    OBTW 

    オンラインでは機能しません。 Cインタープリターで。

    コメント

    • LOL FANCY CODE M8 8/8 KTHXBYE

    回答

    Python、33文字

    >>> import ctypes;ctypes.string_at(0) Segmentation fault 

    出典: http://bugs.python.org/issue1215#msg143236

    Python、60文字

    >>> import sys;sys.setrecursionlimit(1<<30);f=lambda f:f(f);f(f) Segmentation fault 

    出典: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup

    これはPythonバージョンですnテスト中:

    Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin 

    一般にPythonインタープリターはクラッシュしにくいですが、上記は選択的な虐待です…

    回答

    4番目-3文字

    0 @ 

    @はフェッチです)

    コメント

    • 最新のシステムで動作するこれまでで最も短いものです。
    • どのフォース? Gforthは、”無効なメモリアドレス”

    回答

    とだけ言っています

    W32.com実行可能ファイル-0バイト

    これは奇妙に思えますが、32ビットWindowsシステムでは、空の.comファイルを作成して実行する場合があります / em>何かに応じて、セグメンテーション違反を引き起こします。 DOSはそれを受け入れるだけで(8086にはメモリ管理がなく、障害を起こす意味のあるセグメントはありません)、64ビットWindowsはそれを実行しません(x86-64には.comファイルを実行するv86モードがありません)。

    回答

    C、18

    main(){raise(11);} 

    コメント

    • コードリストに#include < signal.h >を追加する必要がありますか?
    • @FlorianCastellane:C90以下では、表示された宣言なしで実行された関数呼び出しの場合、コンパイラーは暗黙的にint func()として宣言します。つまり、intを返す関数で、指定されていないパラメータを取ります。この場合、raiseはintを返す関数であり、int引数を取るので、これはうまくいきます(コンパイラが文句を言っても)。
    • @Hasturkun main(){main();}

    回答

    Perl(< 5.14)、9文字

    /(?{??})/ 

    5.14では、この方法でクラッシュしないように正規表現エンジンが再入可能になりましたが、5.12とこれを試してみると、以前はsegfaultになります。

    コメント

    • これは、Perl 5.14(Debian)および5.18(Arch Linux)で再現できます。 sprunge.us/RKHT
    • Perl v5.20.2(windows)で再現
    • /(?R)/古いPerlバージョンでは?

    回答

    brainfuck(2)

    <. 

    はい、これは実装に依存します。 SIGSEGVは、優れたコンパイラの結果である可能性があります。

    コメント

    • その” good “?その<は効果がないか、ラップアラウンドする必要があります。
    • プログラマーがバグを見つけて修正できるため、境界違反でランタイムエラーをすぐに生成するのが最適です。できるだけ速く。バグのあるプログラムをしばらく実行し、クラッシュする前にメモリを無計画に破損させると、問題の診断が難しくなります。あなたが示唆するように、クラッシュを完全に防ぐことは最悪です。プログラマーは、プログラム”が動作する”を取得し、標準のコンパイラーやインタープリターでクラッシュすると、公に屈辱を受ける可能性があります。
    • 逆に、実行前に境界違反をキャッチすることは、一般的には不可能であり、可能である場合には特に役立ちません。より説明的なランタイムエラーを生成することは問題ありませんが、’速度コストがないため、オペレーティングシステムにセグメンテーション違反としてキャッチさせることは素晴らしいことです。 (’が明確でない場合、コンパイラ自体は’セグメンテーション違反を行いません。試行するとすぐにセグメンテーション違反を起こす実行可能ファイルを生成します。範囲外のメモリにアクセスします。)
    • この動作を生成し、このチャレンジが投稿される前に作成された実装を提供できますか?そうでない場合、この回答は無効です。
    • 境界チェックは実装固有であるため、’エラーが発生する可能性があるものがあると確信しています。ただし、SIGSEGVはありますか?疑わしい。ただし、左側の配列の折り返しに依存するプログラムは多数あります。両側に拡張可能なストレージがあると、かなり便利な場合があります。

    回答

    Haskell、31

    foreign import ccall main::IO() 

    これは、GHCでコンパイルして実行すると、セグメンテーション違反を生成します。 Foreign FunctionInterfaceはHaskell2010標準に含まれているため、拡張フラグは必要ありません。

    コメント

    • Awwww。 import Foreign;main=peek nullPtr::IO Intを投稿するつもりでしたが、’ s40です。

    回答

    Bash、4バイト

    ゴルフ

     . $0  

    スクリプトを再帰的にそれ自体に含めます。

    説明

    再帰的”ソース”(。)操作は最終的にスタックオーバーフローを引き起こし、 Bash libsigsegv と統合されないため、これによりSIGSEGVが発生します。

    これはバグではなく、ここで説明されているように、予想される動作であることに注意してください。

    テスト

     ./bang Segmentation fault (core dumped)  

    オンラインでお試しください!

    回答

    Python 33

    import os os.kill(os.getpid(),11) 

    Pythonでシグナル11(SIGSEGV)を送信しています。

    コメント

    • 33文字:from os import*およびkill(getpid(),11)

    回答

    C- 11(19) 7(15) 6(14) 1文字、AT & T x86アセンブラ-8(24)文字

    Cバージョンは次のとおりです。

    *(int*)0=0; 

    プログラム全体(ISOではありません) -準拠、K & RC)の長さが19文字であると仮定します:

    main(){*(int*)0=0;} 

    アセンブラバリアント:

    orl $0,0 

    プログラム全体の長さは24文字です(実際にはアセンブラーではないため、評価用です):

    main(){asm("orl $0,0");} 

    編集

    Cバリアントのカップル。 1つ目はグローバルポインタ変数のゼロ初期化を使用します:

    *p;main(){*p=0;} 

    2つ目は無限再帰を使用します:

    main(){main();} 

    最後のバリアントは最短のもの- 7(15)文字です。

    編集2

    上記のいずれよりも短いもう1つのバリアント(6(14)文字)を発明しました。リテラル文字列が読み取り専用セグメントに配置されることを前提としています。

    main(){*""=0;} 

    編集3

    最後の試み-1文字の長さ:

    P 

    そのようにコンパイルするだけです:

    cc -o segv -DP="main(){main();}" segv.c 

    コメント

    • in C isn ‘ t main; 5文字のみ
    • :Linkerは’メインが機能しているかどうかをチェックしません。ローダーとリターン sigsegv
    • @FUZxxlこの場合、mainはゼロで初期化されたグローバルint変数であるため、次のようになります。いくつかのゼロバイトを実行しようとした結果。 x86では、’はadd %al,(%rax)のようなもので、%rax。そこに適切なアドレスがある可能性は最小限です。
    • もちろん、最後のエントリはすべてに使用できます。適切なコンパイラ引数を指定するだけです。これは、コードゴルフコンテストの自動勝者になるはずです。 🙂
    • 通常、使用する言語バージョンを選択するもの以外のコンパイラフラグは、合計にカウントされます。

    回答

    Perl、10/12文字

    少し厄介な解決策は、 JoeyAdams “バッシュトリックから1文字を削ることです。

    kill 11,$$ 

    ただし、Perlで実際のセグメンテーション違反を取得するには、unpack pが明白な解決策です。 :

    unpack p,1x8 

    技術的には、アドレス0x31313131(または64ビットシステムでは0x3131313131313131)であるため、これはセグメンテーション違反に対して保証されません。たまたま有効なアドレス空間を指している可能性があります。しかし、オッズはそれに反対しています。また、ポインタが64ビットより長いプラットフォームにperlを移植する場合は、x8を増やす必要があります。

    コメント

    • この1x8とは何ですか?
    • @HannesKarppila It ‘ "11111111".

    divを書く簡単な方法>

    回答

    dc-7文字

    [dx0]dx 

    スタックオーバーフローが発生します

    コメント

    • 動作しますが、詳しく説明していただけますか?なぜそのように動作するのですか?
    • [dx0]はスタックにdx0を格納し、次にdは最上位のスタック要素を複製し、次にxが最上位のスタック要素(dx0)をポップして実行します。これは最上位のスタック要素を複製し、実行を開始します… 0は、これが末尾呼び出しになるのを防ぐためにそこにある必要があるため、すべてが蓄積されます。

    回答

    PicoLisp-4文字

    $ pil : ("0) Segmentation fault 

    これ意図された動作です。彼らのウェブサイトで説明されているように:

    一部のプログラミング言語が「プログラミングのスイス陸軍ナイフ」であると主張する場合、PicoLispは「スカルペル」と呼ばれることもあります。 of Programming」:シャープ、正確、小型、軽量ですが、経験の浅い人にとっては危険です。

    回答

    F90-39バイト

    real,pointer::p(:)=>null() p(1)=0. end 

    コンパイル:

    gfortran segv.f90 -o segv 

    実行:

    ./segv Program received signal SIGSEGV: Segmentation fault - invalid memory reference. Backtrace for this error: #0 0x7FF85FCAE777 #1 0x7FF85FCAED7E #2 0x7FF85F906D3F #3 0x40068F in MAIN__ at segv.f90:? Erreur de segmentation (core dumped) 

    資料:

    gfortran --version GNU Fortran (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4 

    コメント

    • 最初の投稿がいい。

    回答

    実際には 17 16 11 10 9バイト

    ⌠[]+⌡9!*. 

    オンラインでお試しください!

    上記がクラッシュしない場合は、数字を増やしてみてください(複数桁の数字は実際には先頭のコロンで指定されています)

    インタプリタをクラッシュさせるr 深くネストされたitertools.chainオブジェクトを含むPythonのバグを悪用します。これは実際に+演算子。

    回答

    OCaml、13バイト

    Obj.magic 0 0 

    これは関数Obj.magicを使用します。これは、任意の2つのタイプを安全に強制しません。この場合、0(GCで使用されるタグビットのために即値1として格納される)を関数型(ポインタとして格納される)に強制します。したがって、アドレス1を逆参照しようとしますが、これはもちろんセグメンテーション違反になります。

    コメント

    • it coerces 0 (stored as the immediate value 1) -0が1として格納されるのはなぜですか?
    • @Skyler編集を参照
    • Obj.magic()0は1文字短くなります:)

    回答

    Pyth、3文字

    j1Z 

    これは、私が合法的に手がかりがないことを除いて、私がこの答えを思いついた方法を説明する部分です。誰かが私にこれを説明してくれるなら、私は感謝します。

    ここにオンライン通訳があります。

    説明

    jベースを2乗し、ベースが少なくとも数値と同じになるまで再帰的に呼び出します。ベースは 0 なので、再帰制限が十分に高いと、セグメンテーション違反が発生します。

    デニス♦

    コメント

    • Pyth ‘のソースを閲覧したところ、このコードは1jを実行していることがわかりました。 / div>と0は、1をベース0

    。なぜそのセグメンテーション違反が発生するのか、私にはありませんアイデア…

  • こちらをご覧ください。 jは底辺を二乗し、底辺が少なくとも数値と同じになるまで再帰的に呼び出します。ベースは 0 なので、それは決して起こりません。再帰制限が十分に高いと、セグメンテーション違反が発生します。
  • @Dennis IDEone
  • @SeeRhino ThePythインタープリター再帰制限を100,000に設定します。少なくともTIOでは、’はセグメンテーション違反に十分です。
  • 回答

    C#-62

    System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero); 

    C#/ unsafe、23バイト

    unsafe{int i=*(int*)0;} 

    なんらかの理由でわかりませんが、*(int*)0=0はNullReferenceExceptionをスローしますが、このバージョンでは適切なアクセス違反が発生します。

    コメント

    • int i=*(int*)0;はNullReferenceExceptionを返します。
    • *(int*)-1=0のような否定的な場所にアクセスして、アクセス違反を取得することができます。
    • 特定の例外は、clrそれを包み込み、重要ではありません。これらすべての場合、OS自体が実際にセグメンテーション違反を引き起こします。
    • *(int*)0=0が例外をスローする理由は、おそらく最適化によるものです。具体的には、nullのチェックのコストを回避するために、オプティマイザはnullチェックを削除できますが、セグメンテーション違反が発生すると、適切なNullReferenceException

    回答

    Cで19文字

    main(a){*(&a-1)=1;} 

    main関数の戻りアドレス値が破損しているため、mainの戻り時にSIGSEGVを取得します。

    コメント

    • スタックフレームのレイアウトに依存するため、一部のアーキテクチャでは失敗しない可能性があります。
    • 単純にmain;、またはmain(){*""=0;}
    • @Sapphire_Brick main;はすでに別の回答で示されています。
    • @saeednでは、なぜ投稿するのですか?これは’ 2番目に短いものでもありません!
    • @Sapphire_Brick私が投稿したとき、main; ‘は投稿されておらず、’それが機能することを知りませんでした。私はそれがすでに与えられていることを指摘しているだけで、私の答えを変える意味はありません。さらに、ここの人々は’最短の投稿だけでなく、問題を解決する別の方法も興味深い場合があります。

    回答

    Cython、14

    これは、デバッグの目的で役立つことがよくあります。

    a=(<int*>0)[0] 

    回答

    J(6)

    memf 1 

    memfは空きメモリを意味し、1はポインタとして解釈されます。

    コメント

    • 0ではなく1なのはなぜですか? Jでnullポインタを解放することは合法ですか?

    回答

    Matlab-はい、可能です!

    私の質問への回答で、アムロは次の癖を思いつきました:

    S = struct(); S = setfield(S, {}, "g", {}, 0) 

    コメント

    • Matlabバージョンを指定してください-R2015B(および2016Bも)はエラーをスローします:setfieldの使用エラー(56行目)少なくとも1つインデックスが必要です。
    • @FlorianCastellane現在すべてのバージョンを試すことはできませんが、かなりのバージョンでセグフォールトが発生することが確認されています。最新は2014b、最も古い2012aです。

    回答

    C-14文字

    必ず

    説明:

    問題は、_startをC関数であるかのように扱ったことです。そしてそれから戻ろうとしました。実際には、これは関数ではありません。リンカがプログラムのエントリポイントを見つけるために使用するオブジェクトファイル内の単なるシンボルです。プログラムが呼び出されると、直接呼び出されます。見てみると、スタックの一番上の値が1であることがわかります。これは、確かにアドレスに似ていません。実際、スタック上にあるのは、プログラムのargc値です。この後、終了NULL要素を含むargv配列の要素が続き、その後にenvpの要素が続きます。これですべてです。スタックにリターンアドレスはありません。

    コメント

    • I ‘追加の引数でスコアリングする必要があることは間違いありません
    • 特別なフラグ用に14バイトを追加する必要があります。
    • @ErikGolferエリックゴルファー-nostartfilesis実際には13バイトの長さです:)
    • @CharlesPauletスペースも数える必要があると思います。

    回答

    Unix PDP-11アセンブリ、18バイトのバイナリ、7バイトのソース

    (これは私にとってテーマになりつつあります。おそらくそれが私が知っている唯一の言語だからです-他の1つはここにあります。)

    inc(r0) 

    r0の初期値(simhデバッガーによると05162)でアドレス指定された1バイトをインクリメントします。プログラムの開始。

    0000000 000407 000002 000000 000000 000000 000000 000000 000000 0000020 005210 000000 

    そして、いつものように、最後の余分なバイトはストリップで削除できます。

    いくつか作成しましたソースを短くしようとしますが、常にgeになります構文エラーまたはSIGBUSのいずれかを入力します。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です