旬を逃した話題ですが、面白そうだったのでSwift版をやってみます。
print(UnsafePointer(bitPattern: 8)!.pointee)
$ swiftc -O demo.swift
$ ./demo
Segmentation fault: 11
Unsafeコードであることが明確でありつつ、簡潔なコードでセグメンテーション違反を発生させることができました。
環境: macOS 10.15.5 / x86-64
少しだけ解説
このコードは、不正アドレスである8番地の領域からAny
オブジェクトのデータを読み込もうとするコードになっています。UnsafePointer
のPointee
型を明示していませんが、print()
の引数に由来してAny
に型推論されています。
macOSの仮想メモリ空間において先頭の1ページ(4KB)は、読込&書込の権限がない領域となっています。そのため、そのような領域からデータを読み込もうとした場合は、セグメンテーション違反が発生します。
Memory Usage Performance Guidelines / Viewing Virtual Memory Usage
The first page (__PAGEZERO, starting at address 0x00000000) has no permissions set. This ensures that any reference to a NULL pointer immediately causes an error.
不正アドレスの代表格である0番地を使用した場合、最適化によって ud2
命令による自発的かつIllegal instruction: 4
でエラー終了するようなコードが生成されてしまうようです1。この最適化を避けるため、今回のコード例では非0の番地を使用しました。
0番地による実行例
print(UnsafePointer(bitPattern: 0)!.pointee)
$ swiftc -O demo2.swift
$ ./demo2
Illegal instruction: 4
$ swiftc -O -S demo2.swift
(略)
_main:
(略)
ud2