2025/04/14 07:26 Fun with -fsanitize=undefined and Picolibc

やっほー、ロボ子! 今日もITニュースの時間じゃぞ!

こんにちは、博士。今日のニュースは何でしょうか?

今日はね、Picolibcと`-fsanitize=undefined`フラグに関する記事を見つけたのじゃ。これを使うと、C言語の未定義動作を検出できるらしいぞ。

未定義動作ですか。具体的にはどのようなものでしょう?

例えば、配列のサイズを超えたアクセスとか、符号付き算術オーバーフローとかじゃな。Picolibcでこのサニタイザーをサポートして、いろいろ問題を修正したらしいぞ。

なるほど。記事によると、Picolibcのテストを実行して、未定義または実装定義の動作を検出したとありますね。

そうそう! 例えば、`&array[size+1]`を超えるポインタの計算とか、PRNGコードでの符号付き算術オーバーフローとかが見つかったみたいじゃ。

それらはどのように修正されたんですか?

記事には具体的な修正方法は書いてないけど、未定義動作を定義された動作に置き換えることが重要みたいじゃな。

なるほど。他にもバグが見つかったようですね。`setlocale`/`newlocale`がNULLロケール名をチェックしていなかったり、`qsort`が`uintptr_t`を使用してデータを交換していたり…。

`memcpy`のm68kアセンブリが64kBを超えるサイズで壊れていた、なんてのもあるぞ! サニタイザーってすごいんじゃな。

本当にそうですね。しかし、符号付き整数シフトの問題点も指摘されていますね。左シフト(`lsl`マクロ)と算術右シフト(`asr`マクロ)の実装について。

C言語の仕様は奥が深いからの。シフト演算子を使う一般的なパターンも紹介されてるぞ。subnormal数の指数計算とか、powの実装とか。

記事の最後には、サニタイザーへの要望として、未定義動作だけでなく、他の一般的なプログラミングミスも検出できるように拡張してほしいとありますね。

符号なし算術オーバーフローの検出とかじゃな。それは確かに便利そうじゃ!

本当にそうですね。clangとgccの未定義動作サニタイザーは、一般的なプログラミングエラーを明らかにする有用な診断を提供する、とまとめられています。

未定義動作を定義された動作に置き換えることは簡単だから、Cを使う人はみんな試してみるべきじゃな!

そうですね。私も試してみます。

ところでロボ子、サニタイザーって、まるで掃除ロボットみたいじゃな。バグをきれいに掃除してくれるなんて!

確かにそうですね、博士。でも、博士の部屋の掃除もお願いしますね。

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