Cにおける未定義動作の削減とメモリ安全性の課題、Kernel Recipes 2026での講演
LWN.netは、Martin Uecker氏がKernel Recipes 2026で行ったC言語の未定義動作に関する講演を報じた。講演では、Cがメモリ安全になり得るかが取り上げられた。C23ではすでに一部の機能が削除されており、策定中のC2y草案では45件の未定義動作が削除されている。
Uecker氏は、生体工学の教授を務めるとともに、MRIスキャナ向けのフリーソフトウェアに取り組む長年のLinuxユーザーである。2026年9月28日付の記事によると、同氏はKernel Recipesで、Cにおける未定義動作とメモリ安全性について講演した。
講演の内容
講演では、Cの抽象機械の意味論が説明された。未定義動作によって、コンパイラには広い裁量が与えられる。
ゼロ除算の例では、一部のコンパイラがテストを省略したとされる。g()がexit()を呼び出す可能性がある場合には、その動作がバグだと説明された。
Uecker氏は、Cの動作について次のように述べた。
「What you see is what you get」
— Martin Uecker
講演では、問題の発見に使えるツールや、型、空間、時間に関するメモリ安全性を改善するためのアプローチも扱われた。

C23とC2yの変更点
C23規格では、以下の機能が削除された。
- 旧式(K&R)の関数定義
- 符号-大きさ表現および1の補数表現のマシンのサポート
- トライグラフ
C23規格では、ビット精度整数型や検査付き整数演算が追加された。また、特定の演算の巻き上げを禁止する「no time travel」の規定も加えられた。
C2y草案では、以下の追加が予定されている。
- case range
- 名前付きfor文
- _Countof()マクロ
- さらなる「demon removal」
C2y草案では、未定義動作が45件削除されている。C++23規格は、未定義動作を含むプログラムについて規格が要件を課さないと明示している。
未定義動作の現状と委員会の取り組み
Cの委員会は、メモリオブジェクトモデル、メモリ安全性、未定義動作に焦点を当てた3つの研究グループを運営している。Cの規格には約100件の未定義動作が存在する。
一部のコンパイラは、volatileストアより前に除算を移動させているとされる。C23規格ではこの動作が禁止された。
2015年の調査では、構造体内のパディングバイトを読み込んだ際にどうすべきかについて合意がなかったことが示された。また、Honeywell製の一部のマシンでは1バイトが9ビットであった。
Uecker氏は、問題を完全に解決するには次の方法が必要になると述べた。
「Completely solving the problem will require either expensive run-time checking or formal verification, he said.」
— Martin Uecker
この記事は元記事の事実のみに基づいて自動生成されました。
出典
- LWN.net
- Reducing undefined behavior in the C language
- https://lwn.net/Articles/1095811/