102 (2025-09-05) Ранее передача опции
-Safe1в качестве флага линковки (то есть передача в драйвер (gcc), который вызывает линкер (ld)) приводила к тому, что библиотекаlibubsanвсегда линковалась с конечной программой. Теперь это исправлено для сценариев, когда в линковке нет необходимости (freestanding программы).В README был добавлен краткий пример корректной компоновки с
libsanitizerдля класса защищённости 1 (-Safe1) при использованииautotools/make(добавлено использованиеLDFLAGS):$ CFLAGS="-Safe1 -O2" LDFLAGS="-Safe1" ./configure && makeВ будущем планируется более подробное описание этапа линковки при использовании SAFEC для сборки проекта.
100 (2025-09-01) Отключена динамическая перестановка функций для уровней слабее
-Safe1в сборке addon-toolchain, см. патч в binutils.99 (2025-08-28) Исправлена ошибка компоновщика в составе сборки addon-toolchain, приводившая к некорректному формированию секции
.init_arrayпри динамической загрузке, см. патч в binutils.98 (2025-08-28) Статические библиотеки, поставляемые с SAFEC, теперь собираются с
-fPIE. Это позволяет использовать эти библиотеки при компоновке позиционно-независимых исполняемых файлов.97 (2025-08-26) Удалена опция
--dump-sbomи возможность генерации базы данных компиляции.96 (2025-07-22) Переименована опция
-Wno-parameter-types, отключающая предупреждение об отсутствии типа параметра в объявлении функции на языке C. Новое название опции соответствует аналогичной опции, введенной в GCC начиная с 14-й версии —-Wno-declaration-missing-parameter-type. Дополнительно, при попытке использовать данную опцию при компиляции исходного кода на языке C++, будет выдаваться предупреждение. Ранее для C++ опция ошибочно принималась, но не влияла на поведение компилятора.95 (2025-07-22) Исправлена ошибка, возникавшая при использовании опции
-floc-var-per, выполняющей перестановку локальный переменных (опция включается в составе-Safe1при использовании-fno-dynamic-func-reorder). На архитектуре aarch64 c векторными инструкциями из набора SVE (Scalable Vector Extension) перестановка переменных на стеке не производилась, иногда формировалась внутренняя ошибка компиляции (ICE). После исправления корректно поддерживается случай векторов переменной длины.88 (2025-06-16) В
-Safe[1..3]теперь принудительно включается опция-D_FORTIFY_SOURCE=3вместо-D_FORTIFY_SOURCE=2, что улучшает проверку переполнения буфера при вызове функций стандартной библиотеки.87 (2025-05-27) Исправлена ошибка, позволявшая переопределить уровень
_FORTIFY_SOURCE, гарантируемый опцией-Safe[1..3], меньшим уровнем через командную строку.86 (2025-04-04) Исправлена ошибка в addon-toolchain, приводившая к компоновке с системной libc, если в качестве директории для поиска библиотек (с помощью -L) была передана директория, содержащая компоненты libc.
Этот патч не меняет поведение в случае, если компонента libc передана явно (в строке компиляции указан полный путь до библиотеки). В таком случае будет произведена компоновка с этой библиотекой, что может привести к ошибке компоновки.
83 (2025-03-24) Исправлена выдача диагностики о выходе за границы массива (
-Warray-bounds) при использовании-Safe2: вместо предупреждения теперь диагностируется ошибка. Ошибка была вызвана патчем #add-wextra-array-bounds.75 (2024-11-21) Исправлен некорректный запрет
getsв случае, если до#include<stdio.h>словоgetsопределяется как макрос (например:#define gets my_gets).Ошибка проявлялась следующим образом:
- Запрет срабатывал на
my_getsвместоgets. - Cнятие определения макроса (
#undef gets) после#include <stdio.h>приводило к обходу запретаgetsпри его использовании ниже.
Теперь такой макрос отключается (
#undef gets) внутри заголовочных файлов с проверками безопасности.- Запрет срабатывал на
72 (2024-11-21) Исправлена ошибка заголовочных файлов с проверками безопасности, встретившаяся в libtar. Ошибка заключалась в некорректной обработке функций
[v]snprintfс-std=c89. Эти функции были добавлены cо стандарта C99, что не было должным образом учтено в заголовочных файлах. Это приводило к их неявному объявлению и, как следствие, к потенциальному неопределенному поведению.71 (2024-11-12) Исправлено поведение ThreadSanitizer при выводе summary: санитайзер ранее не распознавал стековые фреймы, порождённые вызванными из libtsan функциями, как внутренние, вследствие чего некорректно выводилось место ошибки.
69 (2024-11-06) Исправлен ICE
-Wclobbered, встретившийся в LXC. Причиной является неожиданная оптимизация, в ходе которой атрибутreturns_twiceбыл утерян после инлайнинга функции.67 (2024-10-24) В конфигурацию сборки добавлен флаг
--enable-checking=release, отключающий внутренние проверки компилятора, предназначенные для разработчиков.66 (2024-09-27) Обновлены binutils до 2.41 и glibc до 2.40.
63 (2024-08-02) Добавлена новая опция
--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
-
60 (2024-07-11) Исправлено ложное срабатывание
-fsanitize=function(входит в-Safe1), встретившееся на QEMU.59 (2024-07-11) Предупреждения, контролируемые опцией
-Warray-boundsв прошлых версиях безопасного компилятора, разбиты на две группы. Часть предупреждений вынесена под опцию-Wextra-array-bounds.Первая группа теперь включает только срабатывания
-Warray-boundsкомпилятора GCC соответствующей версии. Поведение, контролируемое опцией-Warray-boundsбезопасного компилятора, приведено в соответствие с одноимённой опцией GCC.Во вторую группу вынесены дополнительные срабатывания, реализованные ранее в безопасном компиляторе. Для управления предупреждениями второй группы добавлена опция
-Wextra-array-bounds.Предупреждения, контролируемые новой опцией, по-прежнему включены в набор предупреждений
-Safe3и более высоких классов защищённости. Однако теперь они не приводят к остановке трансляции, если опция-Werror=extra-array-boundsне указана явно.UPD: данное изменение содержало ошибку, исправленную в #fix-safe2-warray-bounds.
58 (2024-07-11) Добавлена возможность генерации детального SBoM (Software Bill of Materials) с помощью опции
--dump-sbom. SBoM содержит информацию о компонентах компиляции, зависимостях, конфигурациях и результирующих выходных файлах.58 (2024-07-11) В скрипт
comp_db_parserдобавлена опция--format {all, infiles}, благодаря которой можно настроить выходные данные: распечатать информацию обо всех исходных файлах, вошедших в программу (all), или только о файлах, непосредственно переданных как аргументы командной строки компилятора (infiles).58 (2024-07-11) Исправлена работа опции
--dump-sbomпри использовании режима препроцессирования без компиляции. В этом сценарии выходной JSON не содержал поляdependencies.58 (2024-07-11) Исправлена ошибка в работе опции
--dump-sbomв C++. В этом сценарии в выходном JSON содержимое поляdependenciesбыло пустым вне зависимости от наличия подключаемых заголовочных файлов.