機能テスト マクロのマニュアル ページから ( man 7 feature_test_macros
)
_FORTIFY_SOURCE
(glibc 2.3.4 以降)
このマクロを定義すると、さまざまな文字列およびメモリ操作関数 (たとえば、、 、 、 、 、 、 、 memcpy
、memset
、stpcpy
およびstrcpy
それらstrncpy
のstrcat
ワイドstrncat
文字sprintf
バリアントsnprintf
)を使用するときに、いくつかの軽量チェックが実行され、いくつかのバッファ オーバーフロー エラーが検出されます。一部の関数では、引数の一貫性がチェックされます。たとえば、指定されたフラグに が含まれている場合、モード引数で指定されたチェックが行われます。すべての問題が検出されるわけではなく、いくつかの一般的なケースのみが検出されます。vsprintf
vsnprintf
gets
open
O_CREAT
が 1 に設定されている場合_FORTIFY_SOURCE
、コンパイラ最適化レベル 1 ( gcc -O1
) 以上で、適合プログラムの動作を変更してはならないチェックが実行されます。
2に_FORTIFY_SOURCE
設定すると、さらにチェックが追加されますが、一部の準拠プログラムは失敗する可能性があります。
一部のチェックはコンパイル時に (ヘッダー ファイルに実装されたマクロ ロジックを介して) 実行でき、コンパイラの警告が発生します。他のチェックは実行時に行われ、チェックが失敗すると実行時エラーが発生します。
このマクロを使用するにはgcc
、バージョン 4.0 以降で利用可能なコンパイラ サポートが必要です。
さらに、FORTIFY_SOURCE を使用してアプリケーションのセキュリティを強化するという記事(2014 年 3 月) には、次のように記載されています。
gcc -D_FORTIFY_SOURCE=1
コンパイル時にのみチェックを追加します (一部のヘッダーは必要です#include <string.h>
)
gcc -D_FORTIFY_SOURCE=2
実行時のチェックも追加します (検出されたバッファ オーバーフローによりプログラムが終了します)。
基本的に、_FORTIFY_SOURCE
レベル 2 の方が安全ですが、コンパイル方法が少し危険です。それを使用する場合は、コンパイルされたコードに対して非常に強力な回帰テストを行って、コンパイラが予期しない動作を導入していないことを確認してください。