Ответ 1
На странице руководства для макросов проверки функций (man 7 feature_test_macros
)
_FORTIFY_SOURCE
(так как glibc 2.3.4)Определение этого макроса вызывает некоторые легкие проверки для обнаружения некоторых ошибок переполнения буфера при использовании различных функций манипуляции строкой и памятью (например,
memcpy
,memset
,stpcpy
,strcpy
,strncpy
,strcat
,strncat
,sprintf
,snprintf
,vsprintf
,vsnprintf
,gets
и их широкие характерные варианты). Для некоторых функций проверяется согласованность аргументов; например, делается проверка, чтоopen
был снабжен аргументом mode, когда указанные флаги включаютO_CREAT
. Не все проблемы обнаружены, просто некоторые распространенные случаи.Если
_FORTIFY_SOURCE
установлено значение 1, с уровнем оптимизации компилятора 1 (gcc -O1
) и выше, выполняются проверки, которые не должны изменять поведение соответствующих программ.Если параметр
_FORTIFY_SOURCE
установлен на 2, добавлена дополнительная проверка, но некоторые соответствующие программы могут выйти из строя.Некоторые проверки могут выполняться во время компиляции (через логику макросов, реализованных в файлах заголовков), и приводят к предупреждениям компилятора; другие проверки выполняются во время выполнения и приводят к ошибке выполнения во время выполнения проверки.
Использование этого макроса требует поддержки компилятора, доступного с помощью
gcc
с версии 4.0.
Кроме того, статья Повысить безопасность приложений с помощью FORTIFY_SOURCE (март 2014 года):
-
gcc -D_FORTIFY_SOURCE=1
добавляет проверки только во время компиляции (некоторые заголовки необходимы как#include <string.h>
) -
gcc -D_FORTIFY_SOURCE=2
также добавляет проверки во время выполнения (обнаруженное переполнение буфера завершает программу)
По существу, уровень _FORTIFY_SOURCE
уровня 2 более безопасен, но представляет собой немного более рискованную стратегию компиляции; если вы используете его, убедитесь, что у вас очень сильные регрессионные тесты для вашего скомпилированного кода, чтобы доказать, что компилятор не представил никаких неожиданных действий.