fopenの不思議
インターネット黎明のころ、パソコン通信のBBSへの書き込みした方からその当時どんな雰囲気だったかを聞きます。
com(168/565) 93/09/12 23:52 fopenの不思議
3rep 210B
NEWSで
fopen( "", "r" )
なんて事が出来てしまうのが判明した・・・。(NULL は返ってこない)
おまえはいったい何を読んだんだ?
当時SONYからNEWSというワークステーションが発売されていて、NEWS-OSでのプログラミング中にfopenの不思議な挙動があったようです。いったい何が読めるのでしょう?
何が読めるのか確かめてみよう!と思っても、NEWSなんて手元にはもちろん無いし、エミュレータとかあるのかどうかもしらない(ありそうだけど)
ではということで、手元のいくつかの環境で試してみました。CentOS, macOS はもちろんダメ。NULL が返ってきます。NEWS-OS は BSD ですから、同じ BSD ということで FreeBSD ならどうだろうと試したけどこちらも NULL。まあ、当たり前ですな。
ということで何が読めたかは謎のままなんですが、予想としてはカレントディレクトリの先頭ファイルが読めたんじゃないかなぁという気がします。多分、ファイル名のマッチングがこんな感じで実装されてたんじゃないかという気がするから。
int filename_match(char *a, char *b)
{
while(*a != NULL) {
if(*a != *b) {
return(0);
}
a++;
b++;
}
return(1);
}
a に1文字以上の文字列が渡されたら正常に動作しますが、空文字列を渡されたら無条件にマッチしたと返してしまいますね。ディレクトリの先頭ファイルから順に検索していったら、ファイル名がなんであったとしても最初のファイルがマッチしてしまう。
ありていに言ってバグなんですが、当時のプログラミングでは「そんな引数を渡す方が悪い」という雰囲気があったような気がします。なんせ1990年頃の話ですから、コンピュータを使うのは一部の人のみで信頼できる身内ばかりだったという感覚。この頃でもウィルスはありましたし、悪意あるハッカー(=クラッカー)も存在していたんですが、そもそもコンピュータがそれほど広く使われていなかったから、悪影響があってもしれてたんですよね。
そんな牧歌的なプログラムが広く社会で使われるようになり、バッファーオーバーフロー脆弱性が大問題になったのは、この書き込みから10年後くらいの話ですね。って、それ自体も現代から20年近く前ってことに気が付いて、今頭を抱えてるわけですが(^^)。
なお、今回この書き込みを見て再現プログラムのために久しぶりにC言語を書いたんですが、#include <stdio.h>から FILE *fp; fp = fopen();まで、流れるようにタイプしてしまって、ああ当時散々タイプしたし、C言語が自分にとってのネイティブ言語なんだなぁということを再確認したのでした(実際にはその前にBASICをやってるんだが、黒歴史ということで封印w)
書き込みに対するリプライでSUNでは正常にNULLが返ってきましたとあり、特定環境のみの問題みたいです。書き込みをした方がいくつかの環境で試してNULLがちゃんとかえされるとのことなので、よりいっそうどんなファイルが開かれているのかが気になるところです。
用語
・NEWS
SONYから発売されたワークステーション。他社のワークステーションよりコストパフォーマンスが良く、大学などで多く利用されていた。1993年まではベースUNIXが4.2BSDまたは4.3BSD。

インターネット黎明のころの草の根BBSももりこみつつ、いろんなエピソードをつめこんだ「ちょっと偏ったインターネット老人会へようこそ」を同人誌として頒布します。
参加予定イベント
12月31日 V-43a コミックマーケット 101
同人サークル BLACK FTZやってます twitter @black_ftz