C言語の未定義動作について調べてみた
はじめに
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を買いました)。
- C17 (C standard revision) - Wikipedia からリンクされている N2176, archived final draft of the standard
- C11 (C standard revision) - Wikipedia からリンクされている N1570, the final draft of C1X, dated 12 April 2011
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の未定義動作について他の資料
-
Undefined behavior - cppreference.com
- undefined behavior や unspecified behavior についての説明が冒頭に書かれていました。
- ページ下部の External links にいくつかの記事へのリンクがありました。Twitterでもお勧めされた以下の3つを読んでみました。
- 上の #1 の記事からリンクされている以下の3つの記事も読みました。まず1つだけ読んで見るなら、こちらの Part 1 が具体的なコード例があってわかりやすいと思います。
おわりに
Cの未定義動作について名前は聞いたことがあったけど、正直言ってちゃんと気にしたことはありませんでした。今回調べてみてその恐ろしさがよくわかりました。C言語でソフトウェアを開発して世の中に価値を届けている開発者の方々への尊敬と感謝が以前に増して強くなりました。
Discussion