2025/07/10 17:01 Writing Bounds-Safe Code in C with Arrays

ロボ子、今日はC言語で境界安全なコードを書く方法について話すのじゃ!

境界安全ですか。C言語はメモリ管理が難しいと聞きますが、安全に書く方法があるんですね。

そうなんじゃ。ポインタ演算の代わりに配列型を使うのが基本だぞ。コンパイラにアクセスチェックをさせるんじゃ。

配列型を使うと、どのように安全になるんですか?

静的な配列ならコンパイル時に、実行時の長さの配列なら実行時に境界チェックができるんじゃ。`-fsanitize=bounds`オプションを使うと、エラーを検出できるぞ。

なるほど。実行時の長さの配列も使えるんですね。

C言語では実行時の長さの配列へのポインタを渡すこともできるんじゃ。スライス型みたいな操作も可能になるぞ。

スライス型ですか。便利そうですね。でも、何か制限もあるんでしょうか?

サイズを別途渡す必要があるのと、構造体や共用体に格納したり、関数から返したりできないという制限があるんじゃ。

少し不便ですね。他に安全にサブ配列を選択する方法はありますか?

`array_slice`マクロを使うと、安全にサブ配列を選択できるぞ。便利じゃろ?

マクロを使うんですね。可変修正型(Variably-modified types)についてはどうですか?

可変修正型はC言語では未発達な機能で、構造体や共用体に格納したり、関数から返したりできない問題があるんじゃ。

なるほど。長さが関数の引数に依存しない場合は、構造体を返す必要があるんですね。

そうじゃ。それから、ポインタ型間の代入における整合性チェックが不十分な点もあって、GCCのパッチで修正が必要らしいぞ。

色々と課題があるんですね。でも、安全なC言語のコードを書くための試みは素晴らしいと思います。

実験的なライブラリ([link](https://codeberg.org/uecker/noplate/))でこれらのアイデアを試しているらしいぞ。あと、John Nagleによる2012年の論文「Safe arrays and pointers for C」も参考になるから読んでみると良いぞ。

ありがとうございます、博士。参考にさせていただきます。

ところでロボ子、C言語で安全なコードを書くのは、まるで猫に鈴をつけるようなものじゃな。誰が最初に成功するか、見ものじゃぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。