2025-09-05 Ранее передача опции
-Safe1в качестве флага линковки (то есть передача в драйвер (gcc), который вызывает линкер (ld)) приводила к тому, что библиотекаlibubsanвсегда линковалась с конечной программой. Теперь это исправлено для сценариев, когда в линковке нет необходимости (freestanding программы).В README был добавлен краткий пример корректной компоновки с
libsanitizerдля класса защищённости 1 (-Safe1) при использованииautotools/make(добавлено использованиеLDFLAGS):$ CFLAGS="-Safe1 -O2" LDFLAGS="-Safe1" ./configure && makeВ будущем планируется более подробное описание этапа линковки при использовании SAFEC для сборки проекта.
Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 154 (2025-09-05) safec9 351 (2025-09-05) safec10 142 (2025-09-05) safe-11.4 151 (2025-09-05) safe-12.3 117 (2025-09-05) safe-13.3 102 (2025-09-05) 2025-09-01 Отключена динамическая перестановка функций для уровней слабее
-Safe1в сборке addon-toolchain, см. патч в binutils.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 152 (2025-09-01) safec9 349 (2025-09-01) safec10 140 (2025-09-01) safe-11.4 149 (2025-09-01) safe-12.3 115 (2025-09-01) safe-13.3 100 (2025-09-01) 2025-08-28 Статические библиотеки, поставляемые с SAFEC, теперь собираются с
-fPIE. Это позволяет использовать эти библиотеки при компоновке позиционно-независимых исполняемых файлов.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 150 (2025-08-28) safec9 347 (2025-08-28) safec10 138 (2025-08-28) safe-11.4 147 (2025-08-28) safe-12.3 113 (2025-08-28) safe-13.3 98 (2025-08-28) 2025-08-28 Исправлена ошибка компоновщика в составе сборки addon-toolchain, приводившая к некорректному формированию секции
.init_arrayпри динамической загрузке, см. патч в binutils.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 151 (2025-08-29) safec9 348 (2025-08-29) safec10 139 (2025-08-29) safe-11.4 148 (2025-08-29) safe-12.3 114 (2025-08-29) safe-13.3 99 (2025-08-28) 2025-08-06 Удалена опция
--dump-sbomи возможность генерации базы данных компиляции.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 149 (2025-08-21) safec9 346 (2025-08-06) safec10 137 (2025-08-06) safe-11.4 146 (2025-08-25) safe-12.3 112 (2025-08-21) safe-13.3 97 (2025-08-26) 2025-07-17 Переименована опция
-Wno-parameter-types, отключающая предупреждение об отсутствии типа параметра в объявлении функции на языке C. Новое название опции соответствует аналогичной опции, введенной в GCC начиная с 14-й версии —-Wno-declaration-missing-parameter-type. Дополнительно, при попытке использовать данную опцию при компиляции исходного кода на языке C++, будет выдаваться предупреждение. Ранее для C++ опция ошибочно принималась, но не влияла на поведение компилятора.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 148 (2025-07-23) safec9 345 (2025-07-23) safec10 136 (2025-07-23) safe-11.4 145 (2025-07-17) safe-12.3 111 (2025-07-17) safe-13.3 96 (2025-07-22) 2025-07-15 Внедрены исправления для CVE-2023-4039 — уязвимости опции
-fstack-protectorна архитектуре aarch64. Подробное описание уязвимости и примененных исправлений доступно по ссылке. Для версий начиная с 11 уязвимость была исправлена в оригинальном коде компилятора GCC.Поддерживаемые версии: safec8 — safec10
Ветка Версия (дата) safec8 147 (2025-07-15) safec9 344 (2025-07-15) safec10 135 (2025-07-15) safe-11.4 Не требуется safe-12.3 Не требуется safe-13.3 Не требуется 2025-07-12 Исправлена ошибка, возникавшая при использовании опции
-floc-var-per, выполняющей перестановку локальный переменных (опция включается в составе-Safe1при использовании-fno-dynamic-func-reorder). На архитектуре aarch64 c векторными инструкциями из набора SVE (Scalable Vector Extension) перестановка переменных на стеке не производилась, иногда формировалась внутренняя ошибка компиляции (ICE). После исправления корректно поддерживается случай векторов переменной длины.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 146 (2025-07-12) safec9 343 (2025-07-13) safec10 134 (2025-07-15) safe-11.4 144 (2025-07-17) safe-12.3 110 (2025-07-17) safe-13.3 95 (2025-07-22) 2025-06-16 В
-Safe[1..3]теперь принудительно включается опция-D_FORTIFY_SOURCE=3вместо-D_FORTIFY_SOURCE=2, что улучшает проверку переполнения буфера при вызове функций стандартной библиотеки.Поддерживаемые версии: safe-12.3 — safe-13.3
Ветка Версия (дата) safec8 Не требуется safec9 Не требуется safec10 Не требуется safe-11.4 Не требуется safe-12.3 104 (2025-06-16) safe-13.3 88 (2025-06-16) 2025-05-27 Исправлена ошибка, позволявшая переопределить уровень
_FORTIFY_SOURCE, гарантируемый опцией-Safe[1..3], меньшим уровнем через командную строку.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 140 (2025-05-27) safec9 337 (2025-05-27) safec10 128 (2025-05-27) safe-11.4 137 (2025-05-27) safe-12.3 103 (2025-05-27) safe-13.3 87 (2025-05-27) 2025-04-04 Исправлена ошибка в addon-toolchain, приводившая к компоновке с системной libc, если в качестве директории для поиска библиотек (с помощью -L) была передана директория, содержащая компоненты libc.
Этот патч не меняет поведение в случае, если компонента libc передана явно (в строке компиляции указан полный путь до библиотеки). В таком случае будет произведена компоновка с этой библиотекой, что может привести к ошибке компоновки.
Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 139 (2025-04-09) safec9 336 (2025-04-09) safec10 127 (2025-04-09) safe-11.4 136 (2025-04-09) safe-12.3 102 (2025-04-09) safe-13.3 86 (2025-04-04) 2025-03-24 Исправлена выдача диагностики о выходе за границы массива (
-Warray-bounds) при использовании-Safe2: вместо предупреждения теперь диагностируется ошибка. Ошибка была вызвана патчем #add-wextra-array-bounds.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 136 (2025-03-24) safec9 333 (2025-03-24) safec10 124 (2025-03-24) safe-11.4 133 (2025-03-24) safe-12.3 99 (2025-03-24) safe-13.3 83 (2025-03-24) 2024-11-21 Исправлен некорректный запрет
getsв случае, если до#include<stdio.h>словоgetsопределяется как макрос (например:#define gets my_gets).Ошибка проявлялась следующим образом:
- Запрет срабатывал на
my_getsвместоgets. - Cнятие определения макроса (
#undef gets) после#include <stdio.h>приводило к обходу запретаgetsпри его использовании ниже.
Теперь такой макрос отключается (
#undef gets) внутри заголовочных файлов с проверками безопасности.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 133 (2024-11-21) safec9 330 (2024-11-21) safec10 113 (2024-11-21) safe-11.4 122 (2024-11-21) safe-12.3 83 (2024-11-21) safe-13.3 75 (2024-11-21) - Запрет срабатывал на
2024-11-21 Исправлена ошибка заголовочных файлов с проверками безопасности, встретившаяся в libtar. Ошибка заключалась в некорректной обработке функций
[v]snprintfс-std=c89. Эти функции были добавлены cо стандарта C99, что не было должным образом учтено в заголовочных файлах. Это приводило к их неявному объявлению и, как следствие, к потенциальному неопределенному поведению.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 130 (2024-11-21) safec9 327 (2024-11-21) safec10 110 (2024-11-21) safe-11.4 119 (2024-11-21) safe-12.3 80 (2024-11-21) safe-13.3 72 (2024-11-21) 2024-11-12 Исправлено поведение ThreadSanitizer при выводе summary: санитайзер ранее не распознавал стековые фреймы, порождённые вызванными из libtsan функциями, как внутренние, вследствие чего некорректно выводилось место ошибки.
Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 129 (2024-11-12) safec9 326 (2024-11-12) safec10 109 (2024-11-12) safe-11.4 118 (2024-11-12) safe-12.3 79 (2024-11-12) safe-13.3 71 (2024-11-12) 2024-11-07 Исправлен ICE
-Wclobbered, встретившийся в Boost, вызванный некорректной инструментацией UndefinedSanitizer, вследствие которой вызовsetjmpнаходился не на первом месте в базовом блоке.Поддерживаемые версии: safec8 — safe-12.3
Ветка Версия (дата) safec8 128 (2024-11-07) safec9 325 (2024-11-07) safec10 108 (2024-11-07) safe-11.4 117 (2024-11-07) safe-12.3 78 (2024-11-07) safe-13.3 Не требуется 2024-11-06 Исправлен ICE
-Wclobbered, встретившийся в LXC. Причиной является неожиданная оптимизация, в ходе которой атрибутreturns_twiceбыл утерян после инлайнинга функции.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 127 (2024-11-06) safec9 324 (2024-11-06) safec10 107 (2024-11-06) safe-11.4 116 (2024-11-06) safe-12.3 77 (2024-11-06) safe-13.3 69 (2024-11-06) 2024-10-24 В конфигурацию сборки добавлен флаг
--enable-checking=release, отключающий внутренние проверки компилятора, предназначенные для разработчиков.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 125 (2024-10-29) safec9 322 (2024-10-29) safec10 105 (2024-10-29) safe-11.4 114 (2024-10-29) safe-12.3 75 (2024-10-29) safe-13.3 67 (2024-10-24) 2024-09-27 Обновлены binutils до 2.41 и glibc до 2.40.
Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 124 (2024-09-27) safec9 321 (2024-09-27) safec10 104 (2024-09-27) safe-11.4 113 (2024-09-27) safe-12.3 74 (2024-09-27) safe-13.3 66 (2024-09-27) 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
Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 120 (2024-08-16) safec9 318 (2024-09-20) safec10 100 (2024-09-20) safe-11.4 109 (2024-09-20) safe-12.3 70 (2024-08-16) safe-13.3 63 (2024-08-02) -
2024-06-04 Исправлена ошибка в работе опции
--dump-sbomв C++. В этом сценарии в выходном JSON содержимое поляdependenciesбыло пустым вне зависимости от наличия подключаемых заголовочных файлов.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 115 (2024-06-04) safec9 313 (2024-06-04) safec10 96 (2024-06-04) safe-11.4 105 (2024-06-04) safe-12.3 66 (2024-06-05) safe-13.3 58 (2024-07-11) 2024-05-27 Исправлено ложное срабатывание
-fsanitize=function(входит в-Safe1), встретившееся на QEMU.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 114 (2024-05-30) safec9 312 (2024-05-30) safec10 95 (2024-05-31) safe-11.4 104 (2024-05-31) safe-12.3 65 (2024-05-27) safe-13.3 60 (2024-07-11) 2024-04-16 Исправлена работа опции
--dump-sbomпри использовании режима препроцессирования без компиляции. В этом сценарии выходной JSON не содержал поляdependencies.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 113 (2024-04-17) safec9 311 (2024-04-17) safec10 94 (2024-04-16) safe-11.4 103 (2024-04-16) safe-12.3 63 (2024-05-02) safe-13.3 58 (2024-07-11) 2024-03-14 Предупреждения, контролируемые опцией
-Warray-boundsв прошлых версиях безопасного компилятора, разбиты на две группы. Часть предупреждений вынесена под опцию-Wextra-array-bounds.Первая группа теперь включает только срабатывания
-Warray-boundsкомпилятора GCC соответствующей версии. Поведение, контролируемое опцией-Warray-boundsбезопасного компилятора, приведено в соответствие с одноимённой опцией GCC.Во вторую группу вынесены дополнительные срабатывания, реализованные ранее в безопасном компиляторе. Для управления предупреждениями второй группы добавлена опция
-Wextra-array-bounds.Предупреждения, контролируемые новой опцией, по-прежнему включены в набор предупреждений
-Safe3и более высоких классов защищённости. Однако теперь они не приводят к остановке трансляции, если опция-Werror=extra-array-boundsне указана явно.UPD: данное изменение содержало ошибку, исправленную в #fix-safe2-warray-bounds.
Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 110 (2024-04-05) safec9 308 (2024-04-03) safec10 91 (2024-04-03) safe-11.4 102 (2024-03-14) safe-12.3 64 (2024-05-02) safe-13.3 59 (2024-07-11) 2024-03-07 В скрипт
comp_db_parserдобавлена опция--format {all, infiles}, благодаря которой можно настроить выходные данные: распечатать информацию обо всех исходных файлах, вошедших в программу (all), или только о файлах, непосредственно переданных как аргументы командной строки компилятора (infiles).Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 112 (2024-04-16) safec9 310 (2024-04-16) safec10 93 (2024-04-09) safe-11.4 101 (2024-03-07) safe-12.3 63 (2024-05-02) safe-13.3 58 (2024-07-11) 2023-12-13 Добавлена возможность генерации детального SBoM (Software Bill of Materials) с помощью опции
--dump-sbom. SBoM содержит информацию о компонентах компиляции, зависимостях, конфигурациях и результирующих выходных файлах.Поддерживаемые версии: safec8 — safe-13.3
Ветка Версия (дата) safec8 108 (2024-02-01) safec9 307 (2024-02-20) safec10 90 (2024-02-19) safe-11.4 98 (2023-12-13) safe-12.3 63 (2024-05-02) safe-13.3 58 (2024-07-11)