Дэвид Малкольм из Red Hat, разработчик GCC, рассказал о новых возможностях в готовящемся к выходу GCC 16. Главное изменение для пользователей — улучшенные сообщения об ошибках в C++. Раньше иерархическая структура ошибок была опциональной, теперь она включена по умолчанию. Сообщения показывают вложенные маркеры, которые точно указывают на проблему — например, несовпадение const в конкретном параметре функции между объявлением и определением. Вернуть старый формат можно флагами -fno-diagnostics-show-nesting или -fdiagnostics-plain-output.
В GCC 16 доработали машинно-читаемый вывод в формате Static Analysis Results Interchange Format (SARIF). Теперь он корректно передаёт вложенность логических локаций — например, пространства имён и классы. Это позволит SARIF-просмотрщикам фильтровать ошибки по пространству имён вроде foo::bar. Также в вывод добавлены данные по нестандартному потоку управления (обработка исключений, longjmp), которые войдут в грядущий стандарт SARIF 2.2.
Появился экспериментальный HTML-вывод диагностики (флаг -fdiagnostics-add-output=experimental-html). Особенно полезно для встроенного статического анализатора: HTML-страницы визуализируют путь выполнения с вложенными стековыми фреймами и теневыми блоками. Есть даже пасхалка: клавиши j и k листают события и показывают состояние памяти и указателей на каждом шаге.
Сам статический анализатор (-fanalyzer) получил серьёзные внутренние улучшения. Его ключевую структуру данных "supergraph" переписали с нуля — теперь чётко разделены места в коде пользователя и операции между ними. Симуляцию буферов памяти перевели с хэширования на простой std::map — стало понятнее и быстрее.
Коллега Малкольма, Эндрю Маклауд, несколько лет работал над проектом Ranger для отслеживания свойств значений (диапазоны чисел, известные биты). В GCC 16 анализатор начали подключать к этим данным — это должно уменьшить количество ложных срабатываний.
И наконец, самая долгожданная новость: -fanalyzer наконец работает с C++ кодом. Малкольм реализовал поддержку обработки исключений и именованной оптимизации возвращаемого значения (NRVO). Но есть нюанс: пока анализатор справляется только с небольшими примерами. На сложном коде он быстро исчерпывает бюджет анализа и сдаётся, сжигая CPU без полезного результата. Ложные срабатывания сменились пропущенными ошибками. Масштабирование планируют в GCC 17. Попробовать GCC 16 можно уже сейчас на Compiler Explorer (как GCC trunk) или в Fedora 44.