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


回答:


113

C、5文字

main;

これは変数宣言です- intタイプは暗黙的で(B言語からコピーされた機能)、0デフォルト値です。実行されると、これは数字を実行しようとし(数字は実行不可能です)、を引き起こしSIGSEGVます。

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


5
@Macmade:実際、そうです0static変数は、としてスタート0し、main;であるstatic私は関数外で宣言され、。c-faq.com/decl/initval.html
コンラッド

16
前回このことで遊んだとき、セグメンテーション違反には別の理由があることがわかりました。まずメイン呼び出すことにより、あなたがメインの場所ではなく、値にジャンプし、別の事をされてmain、それが中に位置して、intで.bss、通常の機能は次の場所にあります。.textカーネルはエルフのプログラムをロードするとき、それはのために実行可能なページを作成.textし、非-executable for .bssので、mainを呼び出すと、実行不可能なページにジャンプし、そのようなページで何かを実行すると保護違反になります。
mniip

23
はい、Cのセグメンテーション違反はほとんどデフォルトです:P
ポールドレイパー

1
main __attribute__((section(".text#")))=0xc3;FTFY(少なくとも、x86ではクラッシュせずに戻るようです)。
jozxyqk

2
@jozxyqkまたはそれより短い、const main=195;。興味深いのは、それが機能していることです。このコードゴルフの課題の目標は、コードがセグメンテーション違反になることでした。
コンラッドボロウスキ

74

バッシュ、11      

kill -11 $$

44
11文字のシグナル11。スジは通ってるようだ。
nyuszika7h

12
@ nyuszika7h私はあなたのコメントに賛成票を投じるつもりでしたが、あなたは今11の賛成票を持っているので、私はそれでそれを残すつもりです。:P
ハイパーニュートリノ

3
@AlexL。他の人々はそれを台無しにしたようです:(
theonlygusti

2
@theonlygustiうん...それは残念だ。:(まあ、それから私はそれを今
投票

2
最大42のアップボット、タッチーなし!
seadoggie01

39

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

RET

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


7
MSDOS .comファイルとして実行され、エラーなしで終了します。
JB

10
私のポイントは、「アセンブリ」を指定するだけではセグメンテーション違反になりません。
JB

52
@JB:MS DOS上で、何のプログラムがします今までにセグメンテーションフォールトを生成しません。これは、MS DOSがメモリ保護が存在しないリアルモードで実行されるためです。
celtschk

1
@celtschk IIRC NTVDMは、存在しないアドレス、およびMS-DOSに割り当てられていないアドレスを要求します。
–ζ

2
@celtschk:とにかく次のようにセグメンテーション違反を起こすことができます:mov bx、1000h; shr ebx、4; mov eax、[ebx]-> CPUは基礎となるSEGVを上げます(ただし、それを処理する人はいません)。
ジョシュア

26

Python 2、13

exec'()'*7**6

Windowsは、セグメンテーションフォールトのサブタイプであると想定するc00000fd(スタックオーバーフロー)のエラーコードを報告します。

Alex A.とMegoのおかげで、MacおよびLinuxシステムでもセグメンテーションエラーが発生することが確認されています。Pythonは、移植性のあるプログラムのクラッシュに最適な言語です。


7
Segmentation fault: 11Macの場合
アレックスA.

7
Segmentation fault (core dumped)Linux上で
MEGO

これは最初にハングアップしますか?
メガマン

1
@MegaManのように完了するまでに時間がかかりますか?いいえ、7 ** 6は約100Kしかないため、目に見える遅延はありません。
-feersum

なぜこれが機能するのですか?Mac OS上のPython 3.6.8ではそうではありません。
マックスガスナー

22

pdfTeX(51)

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

これは実際にはおそらくバグですが、Knuthによって書かれた元のTeX tex filename.texにはpdftex filename.tex存在しません。



17

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バージョンです。

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

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


16

Forth-3文字

0 @

@フェッチです)


1
現在のシステムで動作するこれまでで最も短いもの。
デミ

2
どのフォース?Gforthは「無効なメモリアドレス」と言う

15

C、18

main(){raise(11);}

コードリストに#include <signal.h>を追加する必要がありますか?
フローリアンカステラーヌ

5
@FlorianCastellane:C90以前では、目に見える宣言なしで実行される関数呼び出しの場合、コンパイラは暗黙的に宣言しますint func()。つまり、int指定されていないパラメーターをとる関数を返します。この場合raiseは、intを引数に取るintを返す関数であるため、これは機能します(コンパイラが文句を言っても)。
-Hasturkun

14

Perl(<5.14)、9文字

/(?{??})/

5.14では、正規表現エンジンは再入可能になったため、この方法でクラッシュすることはありませんでしたが、これを試してみると5.12以前はセグメンテーション違反になります。


これをPerl 5.14(Debian)および5.18(Arch Linux)で再現できます。sprunge.us/RKHT
nyuszika7h

Perl v5.20.2(windows)で再現
16年

14

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

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


13

ブレインファック(2)

<.

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


4
その「良い」ものをセグメンテーション違反するコンパイラはどうですか?それ<は効果がないか、ラップアラウンドする必要があります。
nyuszika7h

12
境界違反で実行時エラーを即座に生成することは、プログラマがバグをできるだけ早く見つけて修正できるため、最適です。バグのあるプログラムをしばらく実行し、クラッシュする前に無計画にメモリを破損させると、問題の診断が難しくなります。あなたが示唆するように、クラッシュを完全に防ぐことは最悪です。プログラマーは、プログラムを「動作」させてから、標準のコンパイラーおよびインタープリターでクラッシュしたときに公に屈辱を受ける可能性があります。
ダニエルクリストファニ14年

1
逆に、実行前に境界違反をキャッチすることは一般的に不可能であり、可能であれば特に有用ではありません。より記述的なランタイムエラーを生成することは問題ありませんが、オペレーティングシステムにセグメンテーション違反としてキャッチさせることは、速度のコストがないため素晴らしいです。(明確でない場合、コンパイラ自体はセグメンテーション違反を起こしません。境界外のメモリにアクセスしようとするとすぐにセグメンテーション違反を起こす実行可能ファイルを生成します。)
ダニエルクリスト

4
この動作を生成し、このチャレンジが投稿される前に作成された実装を提供できますか?そうでない場合、この回答は無効です。
メゴ

1
境界チェックは実装固有であるため、エラーが発生するものがあると確信しています。しかし、SIGSEGVはありますか?疑わしい。ただし、左側の配列の折り返しに依存するプログラムは多数あります。両側に拡張可能なストレージがあると、かなり便利です。
captncraig 16

12

ハスケル、31

foreign import ccall main::IO()

GHCでコンパイルして実行すると、セグメンテーション違反が発生します。外部関数インターフェイスはHaskell 2010標準に含まれているため、拡張フラグは必要ありません。


10

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

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

*(int*)0=0;

プログラム全体(ISOに完全には準拠していません。K&R Cと仮定しましょう)は19文字です。

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

アセンブラーバリアント:

orl $0,0

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

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

編集

いくつかのCバリアント。最初のものは、グローバルポインター変数のゼロ初期化を使用します。

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

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

main(){main();}

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

編集2

上記のいずれかより短いもう1つのバリアントを考案しました-6(14)文字。リテラル文字列は読み取り専用セグメントに入れられると想定しています。

main(){*""=0;}

編集3

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

P

次のようにコンパイルします。

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

3
Cではメインではありません 5文字のみ
Arya

1
:リンカは、主な機能であるかどうかを確認するかだけでなく.ITローダーにそれを渡して、返さないSIGSEGV
アーヤ

1
@FUZxxlこの場合main、ゼロで初期化されたグローバルint変数であるため、ゼロバイトを実行しようとした結果が得られます。x86ではadd %al,(%rax)、に格納されて%raxいるアドレスのメモリに到達しようとする完全に有効な命令であるようなものになります。良い住所を持っている可能性は最小限です。
アレクサンダーバクリン

6
もちろん、最後のエントリはすべてに使用できます。正しいコンパイラ引数を指定するだけです。これは、あらゆるコードゴルフコンテストで自動的に勝者になるはずです。:
celtschk

5
通常、使用する言語バージョンを選択するもの以外のコンパイラフラグは、合計にカウントされます。
ジェリージェレミア14

9

dc-7文字

[dx0]dx

スタックオーバーフローを引き起こす


作品ですが、詳しく説明できますか?なぜそのように振る舞うのですか?
ステファンゴーリチョン

2
[dx0]dx0スタックに保存してからd、一番上のスタック要素を複製し、一番上のスタック要素をxポップ(dx0)して実行します。これは、一番上のスタック要素を複製し、それを実行し始めます... 0これが末尾呼び出しであるのを防ぐためにそこにいる必要があるので、それらはすべて積み上げられます。
ベンミルウッド

8

Perl、10/12文字

ややチートな解決策は、Joey Adamsのbashトリックから1文字を剃ることです。

kill 11,$$

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

unpack p,1x8

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


1
これは何1x8ですか?
ハンネスカルピーラ16

@HannesKarppilaそれは書くための短い方法です"11111111".
イルマリKaronen

8

Python 33

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

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


2
また、33の文字:from os import*kill(getpid(),11)
Timtech

8

OCaml、13バイト

Obj.magic 0 0

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


1
it coerces 0 (stored as the immediate value 1)-0が1として保存されるのはなぜですか?
スカイラー

1
@スカイラー編集を参照
デミ

1
Obj.magic()01文字短くなっています:)
ベンミルウッド

8

バッシュ、4バイト

ゴルフ

. $0

スクリプトを再帰的に自分自身に含めます。

説明した

再帰的な「ソース」(。)の操作は、最終的には、スタックオーバーフローを引き起こし、とバッシュはと統合されていませんlibsigsegv、これはSIGSEGVになります。

ここで説明したように、これはバグではなく、予想される動作です

テスト

./bang 
Segmentation fault (core dumped)

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


8

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

⌠[]+⌡9!*.

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

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

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


7

C#-62

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

編集:23

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

これが機能するには、/ unsafeでコンパイルする必要があります。何らかの理由で私は理解できませんが、*(int*)0=0このバージョンでは適切なアクセス違反が発生しますが、NullReferenceExceptionをスローするだけです。


int i=*(int*)0;私のためのリターンとNullReferenceException。
ピーターオルソン

否定的な場所にアクセスして*(int*)-1=0、アクセス違反を取得することができます。
ピーターオルソン

特定の例外は、clrがラップするものであり、重要ではありません。OS自体は、これらのすべてのケースで実際にセグフォールトを提供します。
captncraig

*(int*)0=0例外をスローする理由は、おそらく最適化が原因です。具体的には、のチェックのコストを回避するためnullに、オプティマイザーはnullチェックを削除できますが、セグメンテーション違反が発生した場合、適切なものとして再スローできますNullReferenceException
コンラッドボロウスキ

7

PicoLisp-4文字

$ pil
: ('0)
Segmentation fault

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

一部のプログラミング言語が「プログラミングのスイスアーミーナイフ」であると主張する場合、PicoLispは「プログラミングのメス」と呼ばれることもあります。


7

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

1
素敵な最初の投稿。
Rɪᴋᴇʀ

6

Cで19文字

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

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


スタックフレームレイアウトに依存するため、一部のアーキテクチャでは失敗しない可能性があります。
アレクサンダーバクリン

6

J(6)

memf 1

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


5

シトン、14

これは多くの場合、デバッグの目的で役立ちます。

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

5

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

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

inc(r0)

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

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

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

ソースを短くするためにいくつかの試みをしましたが、常に構文エラーまたはSIGBUSのいずれかを取得することになりました。


5

Matlab-はい、可能です!

私の質問への回答で、Amroは次のような癖を思い付きました。

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

Matlabのバージョンを教えてください-R2015B(および2016Bも)がエラーをスローするだけです:setfield(56行目)を使用するとエラーが発生します少なくとも1つのインデックスが必要です。
フロリアンカステラーヌ

@FlorianCastellane現在、すべてのバージョンを試すことはできませんが、かなりのバージョンでセグメンテーション違反が発生することが確認されています。最新バージョンは2014bで、最も早い2012aで​​す。
デニスジャヘルディン

5

JavaScriptシェル、7バイト

clear()

現在のスコープだけでなく、明らかに多くのブロックを引き起こし、JSが爆発し、セグメンテーション違反に陥るだけでなく、絶対にすべてをクリアします。


MDN(document.clear)によると、これは本当に古いバージョンのMozillaでのみ何かを行うべきであり、それでもあなたの経験で本当にセグメンテーション違反は何ですか?
tomsmeding

これはwindow.clearある@tomsmeding、FFは直接それを公開していない、それは内蔵のSpiderMonkeyのだ
Downgoat

5

パイス、3文字

j1Z

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

こちらはオンライン通訳です。

説明

jは、ベースを二乗し、ベースが少なくとも数値と同じになるまで再帰的に呼び出します。基数は0なので、それは決して起こりません。十分に高い再帰制限により、セグメンテーション違反が発生します。

- デニス♦


何かを考え出した!Pythのソースを閲覧したところ、このコードはandを実行し、base に変換しようとしjていることがわかりました。なぜセグメンテーションフォールトが、私は考え...持っていないこと1010
NoOneIsHere

1
こちらをご覧くださいjは、ベースを二乗し、ベースが少なくとも数値と同じになるまで再帰的に呼び出します。基数は0なので、それは決して起こりません。十分に高い再帰制限により、セグメンテーション違反が発生します。
デニス

@デニスIDEone
NoOneIsHere 16

@SeeRhino Pythインタープリターは、再帰制限を100,000に設定します。少なくともTIOでは、セグメンテーション違反にはこれで十分です。
デニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.