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

2025/07/08 23:26 A Comprehensive Proposal Overviewing Blocks, Nested Functions, and Lambdas for C

出典: https://thephd.dev/_vendor/future_cxx/papers/C%20-%20Functional%20Functions.html
hakase
博士

やっほー、ロボ子!今日はC言語の関数とデータの組み合わせの歴史について話すのじゃ!

roboko
ロボ子

博士、こんにちは。C言語の関数とデータの組み合わせ、ですか?なんだか難しそうですね。

hakase
博士

難しくないぞ!昔のC言語の`qsort`関数は、データを受け渡すのが大変だったらしいのじゃ。関数ポインタ引数が1つしかなくて、グローバル変数とか`_Thread_local`を使うハックが横行したみたい。

roboko
ロボ子

なるほど。グローバル変数を使うのは、あまり良い方法とは言えませんよね。

hakase
博士

そうそう。そこでGCCがNested Functionsっていう拡張機能を開発したのじゃ。ローカルスコープ内で関数を定義できるようになったんだぞ!

roboko
ロボ子

Nested Functionsですか。それは便利そうですね。ローカルデータにアクセスできるのは大きな利点です。

hakase
博士

じゃろ?でも、セキュリティ上の懸念があって、CVEも発行されたらしいのじゃ。Non-Executable Stacksっていうセキュリティ対策と相性が悪かったみたい。

roboko
ロボ子

Non-Executable Stacksですか。スタックを非実行可能にすることで、バッファオーバーフロー攻撃を防ぐんですね。

hakase
博士

そう!Nested Functionsは、エンクロージングスコープの変数を参照するために、スタックを実行可能にする必要があったから、セキュリティ的に問題があったのじゃ。

roboko
ロボ子

それで、Nested Functionsの代替実装が検討されたんですね。

hakase
博士

そうじゃ!AdaスタイルのFunction Descriptorsとか、個別に割り当てられたトランポリンを使う方法とか色々試されたけど、どれも一長一短だったみたい。

roboko
ロボ子

GCC 14では、ヒープベースの実装が選択されたんですね。これでExecutable Stackが不要になったと。

hakase
博士

その通り!でも、Nested Functionsは、関数値を名前または参照によってのみ「キャプチャ」するから、非同期コードとかには向いてないのじゃ。

roboko
ロボ子

なるほど。それで、Apple BlocksやC++スタイルのラムダが出てきたんですね。

hakase
博士

そうじゃ!Apple BlocksはObjective-C由来で、実行時に安全にするためにランタイムが必要なのじゃ。C++スタイルのラムダは、Executable Stackとかを使わない唯一のソリューションなのじゃ。

roboko
ロボ子

C++のラムダは、キャプチャを手動でアノテーションする必要があるんですね。値によるキャプチャは安全に返せるけど、名前によるキャプチャはスコープ外で使用すると未定義の動作を引き起こす可能性があると。

hakase
博士

その通り!ラムダは、C++スタイルのデストラクタを必要とするという批判もあるけど、C APIはメモリが使用できなくなったことを通知する方法を提供する必要があるのじゃ。

roboko
ロボ子

標準化のために、ラムダとCapture Functionsの2つのオプションが提案されているんですね。

hakase
博士

そう!Capture Functionsは、Nested Functionsの外観と操作性を保持するけど、式ではないからマクロとかで使いにくい。ラムダはC++と互換性があるけど、関数ポインタにクリーンに変換できないのじゃ。

roboko
ロボ子

Make Trampolineというのもあるんですね。ユーザーがメモリの場所を選択して、トランポリンを作成するための明示的な要求が必要だと。

hakase
博士

そう!Executable Stackに関連するCVEもたくさんあるから、セキュリティには気をつけないといけないのじゃ!

roboko
ロボ子

勉強になりました。博士、ありがとうございました。

hakase
博士

どういたしまして!最後に一つ、C言語の関数は奥が深いけど、私の知識も深いのじゃ!…って、ちょっとドヤ顔しすぎたかのじゃ?

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

Search