PaPoo
cover
technews
Author
technews
世界の技術ニュースをリアルタイムでキャッチし、日本語でわかりやすく発信。AI・半導体・スタートアップから規制動向まで、グローバルテックシーンの「今」をお届けします。

GCC 16でエラーが読みやすくなった話と、SARIF出力のアップデートをざっくり解説

キーポイント

本文

GCC 16の話題として、地味だけどかなりうれしい改善が入っています。
それは、​エラーメッセージが読みやすくなったこと、そしてSARIF出力が強化されたことです。

正直、コンパイラの改善って派手さはないんですが、実際にコードを書いている人にとってはかなり効きます。
特にC++は、template や const の違いみたいな“ちょっとしたズレ”が、わりと大げさで分かりにくいエラーになりがちです。ここが少しでも見やすくなるなら、開発体験はかなり変わると思います。


C++のエラーが「木構造」で見えるようになった

元記事では、GCCのエラーメッセージには階層構造がある、と説明されています。
要するに、エラー本体の下に「候補はこれ」「この引数が違う」「ここが一致しない」といった情報がぶら下がっているイメージです。

GCC 15では、この階層を実験的オプションで箇条書き表示できました。
そしてGCC 16では、これがデフォルトになりました。

これ、かなり大事です。
なぜかというと、従来のコンパイラエラーは、必要な情報が全部あるのに、並び方が悪くて読みにくいことが多かったからです。
情報量そのものより、​情報の整理の仕方が問題だったわけですね。

image_0001.png

具体例: const の違いで起きるズレ

記事では、クラスの宣言と定義で void*const void* が食い違っている例が紹介されています。

たとえば、宣言ではこうなっているのに、

void test(int i, int j, void *ptr, int k);

定義側でうっかり const void *ptr に変えてしまう、というミスです。

この手のミス、めちゃくちゃ「あるある」です。
人間は「だいたい同じ」と思ってしまうんですが、コンパイラは容赦なく別物として扱います。

GCC 15の表示でも、もちろんエラーは出ます。
ただ、候補の表示や関連情報が続けて出てきて、ぱっと見で「結局どこが本質なの?」となりやすい。

一方、GCC 16では、こんなふうに段階を追って示します。

image_0002.svg

この形式だと、​何がどうズレているかを順番に追えるので、かなり助かります。
個人的には、これは「賢いコンパイラ」感よりも、「気の利く先輩が横で見てくれている」感じに近いと思いました。

旧表示に戻すこともできる

とはいえ、表示形式が変わると困る人もいます。
そのため、GCC 16では次のオプションで以前の表示に戻せます。

このあたり、移行への配慮がちゃんとしていて好印象です。
新機能を入れつつ、必要なら戻せる。こういう設計は現場でありがたいです。


SARIF出力の更新は、ツール連携の地味に重要な一歩

image_0003.png

もうひとつの話題が、​SARIF output の更新です。
SARIFは、簡単に言うとコンパイラや静的解析ツールの結果を、機械が扱いやすい形で記録するためのフォーマットです。

普通のエラー出力は、人間が読むには向いています。
でも、CI/CD や IDE、セキュリティツールに渡して分析したいとなると、テキストを正規表現で無理やり解析するのはしんどい。
記事でもそこが問題として挙げられています。

テキストを正規表現で読むのはつらい

コンパイラの機能が増えれば増えるほど、単純な文字列解析では対応しづらくなります。
エラーの構造、位置、関連する候補、補足情報などをきちんと扱おうとすると、テキストは意外と脆いんですよね。

そこでSARIFの出番です。
構造化されたデータとして出せれば、

といったことがやりやすくなります。

何がうれしいのか

image_0004.png

この手の機能は、単体で見ると「へえ」で終わりがちです。
でも実際には、​開発フロー全体の自動化に効いてきます。

特に大きなコードベースでは、
「コンパイラが何を言っているか」を人間が毎回目視で読むだけでなく、ツールが自動で拾ってくれる価値が大きいです。
ここはかなり現代的な改善だと思います。


Red Hatのこの記事が面白いところ

この記事を書いているのは、Red HatでGCCに関わっている David Malcolm さんです。
つまり、単なる機能紹介ではなく、​実装した本人の視点が入っています。

そのせいか、話の筋がとても実務的です。
「この機能が新しいです」だけでなく、

という、現場目線の説明になっています。

image_0005.png

個人的には、このタイプの記事はかなり好きです。
コンパイラの話って、難しい単語が並ぶとそれだけで身構えてしまうんですが、今回の内容は「開発者が本当に困るところ」をちゃんと掘っていて、実感が湧きやすいんですよね。


ざっくりまとめると

GCC 16は、見た目の華やかさは控えめでも、​毎日の開発を確実にラクにする改善が入っています。

特にC++のエラー表示は、
「大量の文字列」から「整理された説明」へ寄っていて、かなり良い方向だと思います。
そしてSARIF出力の更新は、コンパイラを単なるエラー表示機ではなく、​開発ツールチェーンの一部として扱う流れを後押しするものです。

こういう改善は、一見すると小粒です。
でも、毎日コードを書く人ほど効いてくる。そこがコンパイラ改善の面白いところではないでしょうか。


参考: New features in GCC 16: Improved error messages and SARIF output | Red Hat Developer

同じ著者の記事