🌋

C言語の未定義動作について調べてみた

2022/07/17に公開

はじめに

ZigについてのメモZig 言語のスローガンと概要 に「C で大量にある未定義動作を Zig ではかなり少なくしています(といってもちゃんと数えたわけではないですが)」と書いたのですが、その後ちゃんと数えてみました。

最終版ドラフトで未定義動作の個数を数えてみた

ISO - ISO/IEC 9899:2018 - Information technology — Programming languages — C でPDFがCHF 198で販売されています(Google検索によると2022-07-17時点で28,077.01 円)。
が、この価格では私にはちょっと手が出ないので以下の2つの最終版ドラフトを参照しました (と書いたのですが、その後上記のPDFを買いました)。

J.2 Undefined behavior に N2176 では pp.405〜415、N1570 では pp.557〜571 に渡って番号なしリストの箇条書きで未定義動作が書かれていました。これをコピペしてMarkdownファイルとして整形して確認したところ、 N2176 では 211 個、N1570 では 203 個の未定義動作がありました (この Markdown ファイルはせっかくなので公開したいところですが、販売されている著作物ですし量的にも引用の枠を超えていると思うので非公開とします)。

また J.2 Undefined behavior の前に J.1 Unspecified behavior というのもありました。

Cの未定義動作について他の資料

おわりに

Cの未定義動作について名前は聞いたことがあったけど、正直言ってちゃんと気にしたことはありませんでした。今回調べてみてその恐ろしさがよくわかりました。C言語でソフトウェアを開発して世の中に価値を届けている開発者の方々への尊敬と感謝が以前に増して強くなりました。

Discussion