C言語のあらゆる処理が未定義動作を引き起こすリスク
原題: Everything in C is undefined behavior
なぜ重要か
メモリ安全性が重視される現代において、レガシー言語の根本的リスクを再認識する重要な指摘
プログラマーのブログで、30年間C/C++を使用してきた経験から、C言語のコードには予想以上に多くの未定義動作が潜んでおり、最も熟練したプログラマーでも完全に正しいCコードを書くことは不可能だと主張。メモリアクセス違反以外にも、アライメント不正やオーバーフローなど様々な未定義動作が存在することを指摘している。
プログラマーのブログで、30年間にわたりC/C++を日常的に使用してきた経験者が、C言語における未定義動作の深刻な問題について論じている。著者は「最も熟練したCプログラマーが書いた6行のコードでも、未定義動作を引き起こす箇所を見つけることができる」と主張している。
従来知られているメモリ安全性の問題(二重解放、解放後使用、配列境界外アクセス、未初期化メモリアクセス)に加え、より微妙で非論理的な未定義動作が多数存在することを指摘。例として、正しくアライメントされていないオブジェクトへのアクセスを挙げ、同じコードでもLinux Alpha、SPARC、x86で全く異なる動作を示すことを説明している。
著者は最適化を無効にしても未定義動作の問題は解決しないと強調。コンパイラが意図的に敵対的になるのではなく、コードが有効であることを前提として動作するため、プログラマーの意図がコンパイラステージ間やモジュール間で正確に伝わらない可能性があると説明している。C++(1985年)やC(1972年)が設計された時代の環境と現在の環境は大きく異なるため、これらの言語の継続使用について疑問を呈している。