LoginSignup
0
1

More than 3 years have passed since last update.

Swiftを1行でセグフォらせる

Posted at

旬を逃した話題ですが、面白そうだったのでSwift版をやってみます。

demo.swift
print(UnsafePointer(bitPattern: 8)!.pointee)
$ swiftc -O demo.swift
$ ./demo
Segmentation fault: 11

Unsafeコードであることが明確でありつつ、簡潔なコードでセグメンテーション違反を発生させることができました。

環境: macOS 10.15.5 / x86-64

少しだけ解説

このコードは、不正アドレスである8番地の領域からAnyオブジェクトのデータを読み込もうとするコードになっています。UnsafePointerPointee型を明示していませんが、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番地による実行例

demo2.swift
print(UnsafePointer(bitPattern: 0)!.pointee)
$ swiftc -O demo2.swift
$ ./demo2
Illegal instruction: 4
$ swiftc -O -S demo2.swift 
        (略)
_main:
        (略)
        ud2

  1. Rustのセグフォ記事でも同様となるコメントがありました。 

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1