macOS High Sierraをフリーズさせるわずか17行のCプログラムが発見され話題となっています(Hacker News)。
不具合を発見したJulia Evans氏は、自身が開発するRubyのサンプルプロファイラ「rbspy」のサポート中にMacがフリーズする現象に遭遇したとのこと。当初メモリが大量に割り当てられたためだと考えていたようですが、プログラムを分析していった結果、task_for_pidという名前のMach関数の呼び出しに原因があることをつきとめます。
最終的には以下の17行のCプログラムによってフリーズが発生することが示されています。
#include
#include
#include
#include
#include
int main() {
for (;;) {
pid_t pid = fork();
if (pid == 0) execv("/usr/bin/true", NULL);
mach_port_name_t task = MACH_PORT_NULL;
task_for_pid(mach_task_self(), pid, &task);
printf("Ran task_for_pid\n");
int wait_status;
wait(&wait_status);
}
}
上記プログラムコンパイルして./freeze-mac
として実行するとプログラムがフリーズし、ターミナルの他のタブでpsを実行するとこちらもハング。psをCtrl+Cで止めることもできないようです。
execのあと即時にtask_for_pidを呼び出すことが原因のようで、task_for_pidの呼び出しを数ミリ秒遅らせるだけで、フリーズを回避できるとのこと。
環境が整っている方は以下のようにして試してみることができます。
wget https://gist.githubusercontent.com/jvns/16c1ea69352a81658d6d8e9c5a289f2a/raw/ea11fa0a16bfcd4fd019666b790c6c8fe624f9f0/freeze-mac.c cc -o freeze-mac freeze-mac.c ./freeze-mac # try running `ps` / starting Activity Monitor, they don't work!
macOS High Sierraで環境で実行するとフリーズする危険性があるのでご注意ください。ブログの記事にはCtrl-Cで./freeze-mac
を止めると元に戻るとありますが、手元の環境(macOS High Sierra 10.13.3)では強制電源オフしないと復活しませんでした。
なおこの不具合はhtopをmacOS High Sierraで動かすとフリーズする不具合にも関係しているのではないかと考えられていて、macOS側の早急な対策が望まれます。