142 (2025-09-05) Ранее передача опции
-Safe1в качестве флага линковки (то есть передача в драйвер (gcc), который вызывает линкер (ld)) приводила к тому, что библиотекаlibubsanвсегда линковалась с конечной программой. Теперь это исправлено для сценариев, когда в линковке нет необходимости (freestanding программы).В README был добавлен краткий пример корректной компоновки с
libsanitizerдля класса защищённости 1 (-Safe1) при использованииautotools/make(добавлено использованиеLDFLAGS):$ CFLAGS="-Safe1 -O2" LDFLAGS="-Safe1" ./configure && makeВ будущем планируется более подробное описание этапа линковки при использовании SAFEC для сборки проекта.
140 (2025-09-01) Отключена динамическая перестановка функций для уровней слабее
-Safe1в сборке addon-toolchain, см. патч в binutils.139 (2025-08-29) Исправлена ошибка компоновщика в составе сборки addon-toolchain, приводившая к некорректному формированию секции
.init_arrayпри динамической загрузке, см. патч в binutils.138 (2025-08-28) Статические библиотеки, поставляемые с SAFEC, теперь собираются с
-fPIE. Это позволяет использовать эти библиотеки при компоновке позиционно-независимых исполняемых файлов.137 (2025-08-06) Удалена опция
--dump-sbomи возможность генерации базы данных компиляции.136 (2025-07-23) Переименована опция
-Wno-parameter-types, отключающая предупреждение об отсутствии типа параметра в объявлении функции на языке C. Новое название опции соответствует аналогичной опции, введенной в GCC начиная с 14-й версии —-Wno-declaration-missing-parameter-type. Дополнительно, при попытке использовать данную опцию при компиляции исходного кода на языке C++, будет выдаваться предупреждение. Ранее для C++ опция ошибочно принималась, но не влияла на поведение компилятора.135 (2025-07-15) Внедрены исправления для CVE-2023-4039 — уязвимости опции
-fstack-protectorна архитектуре aarch64. Подробное описание уязвимости и примененных исправлений доступно по ссылке. Для версий начиная с 11 уязвимость была исправлена в оригинальном коде компилятора GCC.134 (2025-07-15) Исправлена ошибка, возникавшая при использовании опции
-floc-var-per, выполняющей перестановку локальный переменных (опция включается в составе-Safe1при использовании-fno-dynamic-func-reorder). На архитектуре aarch64 c векторными инструкциями из набора SVE (Scalable Vector Extension) перестановка переменных на стеке не производилась, иногда формировалась внутренняя ошибка компиляции (ICE). После исправления корректно поддерживается случай векторов переменной длины.128 (2025-05-27) Исправлена ошибка, позволявшая переопределить уровень
_FORTIFY_SOURCE, гарантируемый опцией-Safe[1..3], меньшим уровнем через командную строку.127 (2025-04-09) Исправлена ошибка в addon-toolchain, приводившая к компоновке с системной libc, если в качестве директории для поиска библиотек (с помощью -L) была передана директория, содержащая компоненты libc.
Этот патч не меняет поведение в случае, если компонента libc передана явно (в строке компиляции указан полный путь до библиотеки). В таком случае будет произведена компоновка с этой библиотекой, что может привести к ошибке компоновки.
124 (2025-03-24) Исправлена выдача диагностики о выходе за границы массива (
-Warray-bounds) при использовании-Safe2: вместо предупреждения теперь диагностируется ошибка. Ошибка была вызвана патчем #add-wextra-array-bounds.113 (2024-11-21) Исправлен некорректный запрет
getsв случае, если до#include<stdio.h>словоgetsопределяется как макрос (например:#define gets my_gets).Ошибка проявлялась следующим образом:
- Запрет срабатывал на
my_getsвместоgets. - Cнятие определения макроса (
#undef gets) после#include <stdio.h>приводило к обходу запретаgetsпри его использовании ниже.
Теперь такой макрос отключается (
#undef gets) внутри заголовочных файлов с проверками безопасности.- Запрет срабатывал на
110 (2024-11-21) Исправлена ошибка заголовочных файлов с проверками безопасности, встретившаяся в libtar. Ошибка заключалась в некорректной обработке функций
[v]snprintfс-std=c89. Эти функции были добавлены cо стандарта C99, что не было должным образом учтено в заголовочных файлах. Это приводило к их неявному объявлению и, как следствие, к потенциальному неопределенному поведению.109 (2024-11-12) Исправлено поведение ThreadSanitizer при выводе summary: санитайзер ранее не распознавал стековые фреймы, порождённые вызванными из libtsan функциями, как внутренние, вследствие чего некорректно выводилось место ошибки.
108 (2024-11-07) Исправлен ICE
-Wclobbered, встретившийся в Boost, вызванный некорректной инструментацией UndefinedSanitizer, вследствие которой вызовsetjmpнаходился не на первом месте в базовом блоке.107 (2024-11-06) Исправлен ICE
-Wclobbered, встретившийся в LXC. Причиной является неожиданная оптимизация, в ходе которой атрибутreturns_twiceбыл утерян после инлайнинга функции.105 (2024-10-29) В конфигурацию сборки добавлен флаг
--enable-checking=release, отключающий внутренние проверки компилятора, предназначенные для разработчиков.104 (2024-09-27) Обновлены binutils до 2.41 и glibc до 2.40.
100 (2024-09-20) Добавлена новая опция
--print-safe-options=<level>, которая распечатывает набор опций безопасного компилятора, эквивалентный опции-Safe<level>. (*)Эта опция помогает оценить сложность перехода на использование полноценного безопасного компилятора класса
level. Также она позволяет минимизировать комбинацию опций при отладке проблем.(*): Получаемый набор опций имеет следующие отличия от
-Safe<level>.-
Не используется механизм, запрещающий отключение отдельных опций.
Благодаря этому можно оценить общее число проблем, выявляемых безопасным компилятором заданного класса на кодовой базе. При использовании самих
-Safe-опций остановка трансляции или выполнения не позволяет увидеть все проблемные места сразу. -
Допускается понижение классов предупреждений (например, error до warning) для отдельного файла или функции через прагмы
pragma GCC diagnostic. -
В него не входят флаги, передаваемые компоновщику.
В этой версии распечатка не включает флаги, передаваемые компоновщику. Поэтому для эмуляции поведения
-Safe1нужно передать дополнительные опции либо выполнить фазы компиляции и линковки отдельными командами:gcc -c -O2 $(gcc --print-safe-options=1) foo.c bar.c && gcc -O2 -Safe1 foo.o bar.o
-
96 (2024-06-04) Исправлена ошибка в работе опции
--dump-sbomв C++. В этом сценарии в выходном JSON содержимое поляdependenciesбыло пустым вне зависимости от наличия подключаемых заголовочных файлов.95 (2024-05-31) Исправлено ложное срабатывание
-fsanitize=function(входит в-Safe1), встретившееся на QEMU.94 (2024-04-16) Исправлена работа опции
--dump-sbomпри использовании режима препроцессирования без компиляции. В этом сценарии выходной JSON не содержал поляdependencies.93 (2024-04-09) В скрипт
comp_db_parserдобавлена опция--format {all, infiles}, благодаря которой можно настроить выходные данные: распечатать информацию обо всех исходных файлах, вошедших в программу (all), или только о файлах, непосредственно переданных как аргументы командной строки компилятора (infiles).91 (2024-04-03) Предупреждения, контролируемые опцией
-Warray-boundsв прошлых версиях безопасного компилятора, разбиты на две группы. Часть предупреждений вынесена под опцию-Wextra-array-bounds.Первая группа теперь включает только срабатывания
-Warray-boundsкомпилятора GCC соответствующей версии. Поведение, контролируемое опцией-Warray-boundsбезопасного компилятора, приведено в соответствие с одноимённой опцией GCC.Во вторую группу вынесены дополнительные срабатывания, реализованные ранее в безопасном компиляторе. Для управления предупреждениями второй группы добавлена опция
-Wextra-array-bounds.Предупреждения, контролируемые новой опцией, по-прежнему включены в набор предупреждений
-Safe3и более высоких классов защищённости. Однако теперь они не приводят к остановке трансляции, если опция-Werror=extra-array-boundsне указана явно.UPD: данное изменение содержало ошибку, исправленную в #fix-safe2-warray-bounds.
90 (2024-02-19) Добавлена возможность генерации детального SBoM (Software Bill of Materials) с помощью опции
--dump-sbom. SBoM содержит информацию о компонентах компиляции, зависимостях, конфигурациях и результирующих выходных файлах.