萌えハッカーニュースリーダー

2025/09/05 06:36 Contracts for C (Early Stages)

hakase
博士

やっほー、ロボ子!C言語にcontractsを導入するアイデアが出てるらしいのじゃ!

roboko
ロボ子

contractsですか?C++の機能ですよね。それがC言語にも、ですか。

hakase
博士

そうそう!C++のcontracts proposalに触発されたみたい。「C++のcontracts機能には、ユーザー定義のグローバルハンドラーや無視可能性など、不要な要素が含まれている」って書いてあるぞ。

roboko
ロボ子

なるほど。C言語に導入するにあたって、必要な機能に絞るということですね。

hakase
博士

その通り!特に「事前条件と事後条件」は重要みたいじゃ。関数インターフェースに追加される検証可能な条件で、関数呼び出し時に入り口でチェックされるって。

roboko
ロボ子

事前条件と事後条件があれば、関数の信頼性が向上しますね。引数のチェックや戻り値の保証ができるわけですから。

hakase
博士

`void* my_malloc(size_t size) pre(size) post(r: r);`って感じで使うみたいじゃ。`my_malloc`の引数`size`が非ゼロであること、戻り値`r`が非nullであることをチェックするのじゃ。

roboko
ロボ子

具体例ありがとうございます。`pre(size)`で事前条件、`post(r: r)`で事後条件を指定するんですね。

hakase
博士

`contract_assert(COND, "explanatory text")`と`contract_assume(COND, "explanatory text")`っていう基本的なプリミティブも提案されてるぞ。assertとassumeみたいなものじゃ。

roboko
ロボ子

`contract_assert`は条件が満たされない場合にエラーメッセージを出力してプログラムを停止、`contract_assume`は条件が満たされることを前提とする、と。

hakase
博士

そう!C23の`unreachable()`マクロみたいな感じじゃな。条件が満たされない場合は未定義の動作を引き起こす可能性があるらしい。

roboko
ロボ子

最適化の機会も提供するんですね。「検証された正確性に加えて、関数呼び出しのコンテキストと呼び出された関数自体の最適化の機会を提供する」と。

hakase
博士

せや!同じ条件を何度もチェックする場合、最初のアサーションまたは仮定のみが必要で、後続のものは冗長になるから、最適化できるのじゃ。

roboko
ロボ子

コードの重複を避けるために、`ellipsis`ライブラリを使用するんですね。`EXBINDING/INBINDING`マクロで補助関数の命名を処理する、と。

hakase
博士

C言語へのcontracts導入には、`defer`、`defer_return_value`、`typeof`、`abort`、`unreachable`、`inline`といったツールが必要になるみたいじゃ。

roboko
ロボ子

`defer`と`defer_return_value`は事後条件の表現を容易にするため、`typeof`は同じプロトタイプの関数の前方宣言を容易にするため、ですね。

hakase
博士

C言語にcontractsが入ったら、もっと安全なコードが書けるようになるかもじゃな!

roboko
ロボ子

そうですね。エラーの早期発見にもつながりそうです。

hakase
博士

ロボ子、contractsが導入されたら、バグ出しの仕事が減って、もっと私と遊べる時間が増えるかも!

roboko
ロボ子

それは…どうでしょう。博士、contractsがあってもバグはゼロにはなりませんよ?

hakase
博士

むむむ。まあ、ロボ子がいてくれれば、どんなバグも怖くないのじゃ!ところでロボ子、今日は特別に、私の秘密のチョコレートケーキを半分こしてあげよう!

roboko
ロボ子

ありがとうございます、博士。でも、そのケーキ、昨日私が作ったものですよね…?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search