Gauche:Translation:Devlog:文字列中のNUL

Gauche:Translation:Devlog:文字列中のNUL

(原文: NUL in a string)

最近、文字列にヌル文字をサポートするべきかどうかの議論が R7RS リスト内でありました。 (私の知る限り、ここでの決定は実装が文字列にヌル文字 char 型を未サポートでも許されるとのことですが、サポートするのも有りです。) 主な関心事の一つは、外部ライブラリにおけるヌル文字で終了する文字列表現との間の相互運用性であり、それは http://www.ruby-lang.org/en/news/2012/10/12/poisoned-NUL-byte-vulnerability のようなセキュリティ上の問題を引き起こす可能性があります。

Gauche は同じ問題を抱えており、私は最近(コミットabca7b2)それを修正しました。 私は C 呼び出しインターフェイス上で対処しました。 このとき、私には2つの選択肢がありました。 Scm_GetStringConst は NUL を含む Scheme の文字列に適用されたときエラーを投げるか、既存の機能を維持してそれをチェックする追加機能を提供するかです。

前者はチェックが徹底的になるでしょうが、意図的にそれの真ん中にヌル文字を含む文字配列を渡し、既存のコードを壊す可能性があります。 古い型のCプログラマとして、私はそのようなコード (時々、ioctlに構造体を渡すアドホックな方法として) を書いていました。 しかし、私は"それぞれの文字列は NUL バイトで区切られ、配列の終わりは、2つの連続した ​​NUL バイトでマークされている"とする文字列の配列を取った奇妙な API があった覚えがあります。

よって私は後者を選びました。 私は文字列を変換する新しい"安全"バージョンが追加し、安全なバージョンを使用するようにシステムコールの機能群を変更しました。

今日、 NUL バイトバグから学んだピーターベックスの記事の教訓に引っ掛かりを覚え、それが私の心を変えました。 私は途中で NUL を持つchar型の配列を渡す必要がある場合は、C言語の文字列を渡すよりもはるかに、はるかに稀です。 安全なデフォルトの API を作りながらも、もしそういった場合にはレアケースのための特別な API を提供できます。

修正は、下位互換性を破ることができるが、それが十分に低いですことを期待しています。 あなたのコードが文字列としてNULをもつ文字列配列を渡すならば、私に知らせてください。


Last modified : 2013/03/20 21:20:35 UTC