Man page - feature_test_macros(7)

Packages contains this manual

Available languages:

en fr ja ru de

Manual

FEATURE_TEST_MACROS

名 前
説 明
マ ニ ュ ア ル ペ ー ジ で の 機 能 検 査 マ ク ロ の 要 件 の 規 定
glibc が 解 釈 す る 機 能 検 査 マ ク ロ
デ フ ォ ル ト の 定 義 、 暗 黙 の 定 義 、 組 み 合 わ せ 定 義
準 拠
注 意

プ ロ グ ラ ム の ソ ー ス
関 連 項 目
こ の 文 書 に つ い て

名 前

feature_test_macros - 機 能 検 査 マ ク ロ

説 明

機 能 検 査 マ ク ロ (feature test macro) に よ り 、 プ ロ グ ラ マ は プ ロ グ ラ ム が コ ン パ イ ル さ れ る 際 に シ ス テ ム の ヘ ッ ダ ー フ ァ イ ル に よ り 公 開 さ れ る 定 義 を 制 御 す る こ と が で き る 。

注 意 : 機 能 検 査 マ ク ロ を 機 能 さ せ る に は 、 機 能 検 査 マ ク ロ の 定 義 を 「 ど の ヘ ッ ダ ー フ ァ イ ル の イ ン ク ル ー ド よ り も 前 で 」 行 わ な け れ ば な ら な い 。 こ れ を 実 現 す る に は 、 コ ン パ イ ル コ マ ン ド で 指 定 す る 方 法 ( cc -DMACRO=value ) と 、 ソ ー ス コ ー ド 内 で 必 要 な マ ク ロ の 定 義 を ど の ヘ ッ ダ ー の イ ン ク ル ー ド よ り も 前 で 行 う 方 法 が あ る 。 ど の ヘ ッ ダ ー フ ァ イ ル を イ ン ク ル ー ド す る よ り も 前 に こ れ ら の マ ク ロ を 定 義 し な け れ ば な ら な い と い う 要 件 が 存 在 す る の は 、 ヘ ッ ダ ー フ ァ イ ル は お 互 い に 自 由 に イ ン ク ル ー ド で き る か ら で あ る 。 そ の た め 、 例 え ば 、 以 下 の 例 で は 、 ヘ ッ ダ ー <abc.h> 自 身 が <xyz.h> を イ ン ク ル ー ド し て い る と 、 _GNU_SOURCE マ ク ロ の 定 義 は 全 く 効 果 が な い か も し れ な い (こ の よ う な イ ン ク ル ー ド は POSIX で は 明 示 的 に 認 め ら れ て い る )。

#include <abc.h>
#define _GNU_SOURCE
#include <xyz.h>

機 能 検 査 マ ク ロ を 使 う と 、 非 標 準 の 定 義 が 公 開 さ れ な い よ う に で き 、 移 植 性 の あ る ア プ リ ケ ー シ ョ ン を 作 成 す る の に 役 立 つ 。 他 の マ ク ロ を 使 う と 、 デ フ ォ ル ト で は 公 開 さ れ な い 非 標 準 の 定 義 を 公 開 す る こ と が で き る 。

以 下 で 説 明 す る 機 能 検 査 マ ク ロ の そ れ ぞ れ の 正 確 な 影 響 を 確 認 す る に は 、 ヘ ッ ダ ー フ ァ イ ル <features.h> を 調 べ れ ば よ い 。 注 意 : ア プ リ ケ ー シ ョ ン が <features.h> を 直 接 イ ン ク ル ー ド す る 必 要 は 「 な い 」 。 実 際 の と こ ろ 、 イ ン ク ル ー ド す る の は 全 く 勧 め ら れ な い 。 「 注 意 」 の 節 を 参 照 。

マ ニ ュ ア ル ペ ー ジ で の 機 能 検 査 マ ク ロ の 要 件 の 規 定

関 数 が 機 能 検 査 マ ク ロ の 定 義 を 必 要 と す る 場 合 、 マ ニ ュ ア ル ペ ー ジ の 書 式 (SYNOPSIS) の 節 に 以 下 の 形 式 の 注 釈 を 入 れ る (以 下 の 例 は acct (2) の マ ニ ュ ア ル ペ ー ジ か ら の 引 用 で あ る )。

#include <unistd.h>

int acct(const char * filename );

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件
( feature_test_macros (7)
参 照 ):

acct (): _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)

|| は 、 acct (2) の 定 義 を <unistd.h> か ら 得 る に は 、 以 下 の マ ク ロ の 定 義 の い ず れ か を 、 ど の ヘ ッ ダ ー フ ァ イ ル の イ ン ク ル ー ド よ り も 前 で 行 わ な け れ ば な ら な い こ と を 意 味 す る 。

#define _BSD_SOURCE
#define _XOPEN_SOURCE /* 500 未 満 の 任 意 の 値 */

別 の 方 法 と し て は 、 等 価 な 定 義 を コ ン パ イ ル 用 の コ マ ン ド で 指 定 す る こ と も で き る 。

cc -D_BSD_SOURCE
cc -D_XOPEN_SOURCE # 500 未 満 の 任 意 の 値

後 で 述 べ る が 、 「 い く つ か の 機 能 検 査 マ ク ロ は デ フ ォ ル ト で 定 義 さ れ る 」 点 に 注 意 す る こ と 。 こ の た め 、 「 書 式 」 に 記 載 さ れ た 機 能 検 査 マ ク ロ を 常 に 明 示 的 に 指 定 す る 必 要 が あ る わ け で は な い 。

あ ま り 多 く な い が 、 マ ニ ュ ア ル ペ ー ジ に よ っ て は 、 機 能 検 査 マ ク ロ の 要 件 を 以 下 の よ う に 簡 単 な 表 現 で 記 載 す る 場 合 が あ る 。 (以 下 の 例 は readahead (2) の マ ニ ュ ア ル ペ ー ジ か ら の 引 用 で あ る )。

#define _GNU_SOURCE
#include <fcntl.h>

ssize_t readahead(int fd , off64_t * offset , size_t count );

関 数 定 義 の 公 開 に 使 え る 機 能 検 査 マ ク ロ が 一 つ だ け で 、 デ フ ォ ル ト で は そ の マ ク ロ が 定 義 さ れ な い 場 合 に 、 こ の 形 式 の 表 現 を 利 用 す る 。

glibc が 解 釈 す る 機 能 検 査 マ ク ロ

以 下 で は 、 Linux glibc 2. x ( x > 0) に お い て 、 機 能 検 査 マ ク ロ が ど の よ う に 扱 わ れ る か を 説 明 す る 。

First, though a summary of a few details for the impatient:

*

The macros that you most likely need to use in modern source code are _POSIX_C_SOURCE (for definitions from various versions of POSIX.1), _XOPEN_SOURCE (for definitions from various versions of SUS), _GNU_SOURCE (for GNU and/or Linux specific stuff), and _DEFAULT_SOURCE (to get definitions that would normally be provided by default).

*

Certain macros are defined with default values. Thus, although one or more macros may be indicated as being required in the SYNOPSIS of a man page, it may not be necessary to define them explicitly. Full details of the defaults are given later in this man page.

*

Defining _XOPEN_SOURCE with a value of 600 or greater produces the same effects as defining _POSIX_C_SOURCE with a value of 200112L or greater. Where one sees

_POSIX_C_SOURCE >= 200112L

in the feature test macro requirements in the SYNOPSIS of a man page, it is implicit that the following has the same effect:

_XOPEN_SOURCE >= 600

*

Defining _XOPEN_SOURCE with a value of 700 or greater produces the same effects as defining _POSIX_C_SOURCE with a value of 200809L or greater. Where one sees

_POSIX_C_SOURCE >= 200809L

in the feature test macro requirements in the SYNOPSIS of a man page, it is implicit that the following has the same effect:

_XOPEN_SOURCE >= 700

Linux/glibc は 以 下 の 機 能 検 査 マ ク ロ を 解 釈 す る :
__STRICT_ANSI__

ISO 標 準 の C。 gcc (1) を -std=c99 -ansi な ど の フ ラ グ を 付 け て 起 動 し た 場 合 、 こ の マ ク ロ は 暗 黙 の う ち に 定 義 さ れ る 。

_POSIX_C_SOURCE

こ の マ ク ロ を 定 義 す る と 、 ヘ ッ ダ ー フ ァ イ ル で 以 下 の 定 義 が 公 開 さ れ る 。

値 が 1 の 場 合 、 POSIX.1-1990 と ISO C (1990) に 準 拠 す る 定 義 が 公 開 さ れ る 。

値 が 2 以 上 の 場 合 、 POSIX.2-1992 関 連 の 定 義 も 追 加 で 公 開 さ れ る 。

値 が 199309 以 上 の 場 合 、 POSIX.1b (リ ア ル タ イ ム 拡 張 ) 関 連 の 定 義 が 追 加 で 公 開 さ れ る 。

値 が 199506 以 上 の 場 合 、 POSIX.1c (ス レ ッ ド ) 関 連 の 定 義 が 追 加 で 公 開 さ れ る 。

(glibc 2.3.3 以 降 ) 値 が 200112L 以 上 の 場 合 、 (XSI 拡 張 を 除 く ) POSIX.1-2001 基 本 仕 様 に 対 応 す る 定 義 も 追 加 で 公 開 さ れ る 。 ま た C95 (glibc 2.12 以 降 ) と C99 (glibc 2.10 以 降 ) の 機 能 も 公 開 さ れ る (言 い 換 え る と 、 _ISOC99_SOURCE を 定 義 す る の と 等 価 で あ る )。

(glibc 2.10 以 降 ) 値 が 200809L 以 上 の 場 合 、 (XSI 拡 張 を 除 く ) POSIX.1-2008 基 本 仕 様 に 対 応 す る 定 義 が 追 加 で 公 開 さ れ る 。

_POSIX_SOURCE

こ の マ ク ロ は 廃 止 予 定 で あ る 。 こ の マ ク ロ が 定 義 さ れ る と 、 値 に 関 わ ら ず 、 _POSIX_C_SOURCE を 値 1 で 定 義 す る の と 等 価 と な る 。

Since this macro is obsolete, its usage is generally not documented when discussing feature test macro requirements in the man pages.

_XOPEN_SOURCE

こ の マ ク ロ を 定 義 す る と 、 ヘ ッ ダ ー フ ァ イ ル で 以 下 の 定 義 が 公 開 さ れ る 。

ど ん な 値 で も 、 ヘ ッ ダ ー フ ァ イ ル で POSIX.1, POSIX.2, XPG4 に 準 拠 す る 定 義 が 公 開 さ れ る 。

値 が 500 以 上 の 場 合 、 SUSv2 (UNIX 98) 関 連 の 定 義 が 追 加 で 公 開 さ れ る 。

(glibc 2.2 以 降 ) 値 が 600 以 上 の 場 合 、 SUSv3 (UNIX 03; POSIX.1-2001 基 本 仕 様 + XSI 拡 張 と 同 じ ) 関 連 の 定 義 と C99 で の 定 義 が 追 加 で 公 開 さ れ る 。

(glibc 2.10 以 降 ) 値 が 700 以 上 の 場 合 、 SUSv4 (POSIX.1-2008 基 本 仕 様 + XSI 拡 張 と 同 じ ) 関 連 の 定 義 が 追 加 で 公 開 さ れ る 。

__STRICT_ANSI__ が 定 義 さ れ て い な い 場 合 、 ま た は _XOPEN_SOURCE が 500 以 上 の 値 で 定 義 さ れ て い て 、 _POSIX_SOURCE _POSIX_C_SOURCE も 明 示 的 に 定 義 さ れ て い な い 場 合 、 以 下 の マ ク ロ が 暗 黙 の う ち に 定 義 さ れ る 。

_POSIX_SOURCE が 値 1 で 定 義 さ れ る 。

_POSIX_C_SOURCE は 、 _XOPEN_SOURCE の 値 に 基 づ い て 定 義 さ れ る 。

_XOPEN_SOURCE < 500

_POSIX_C_SOURCE が 値 2 で 定 義 さ れ る 。

500 <= _XOPEN_SOURCE < 600

_POSIX_C_SOURCE が 値 199506L で 定 義 さ れ る 。

600 <= _XOPEN_SOURCE < 700

_POSIX_C_SOURCE が 値 200112L で 定 義 さ れ る 。

700 <= _XOPEN_SOURCE (glibc 2.10 以 降 )

_POSIX_C_SOURCE が 値 200809L で 定 義 さ れ る 。

In addition, defining _XOPEN_SOURCE with a value of 500 or greater produces the same effects as defining _XOPEN_SOURCE_EXTENDED .

_XOPEN_SOURCE_EXTENDED

こ の マ ク ロ が 定 義 さ れ 、 さ ら に _XOPEN_SOURCE が 定 義 さ れ て い る と 、 XPG4v2 (SUSv1) UNIX 拡 張 (UNIX 95) に 対 応 す る 定 義 が 公 開 さ れ る 。 _XOPEN_SOURCE が 500 以 上 の 値 で 定 義 す る の は _XOPEN_SOURCE_EXTENDED を 定 義 す る の と 同 じ 効 果 と な る 。 新 し い ソ ー ス コ ー ド で _XOPEN_SOURCE_EXTENDED を 使 用 す る の は 避 け る べ き で あ る 。

Since defining _XOPEN_SOURCE with a value of 500 or more has the same effect as defining _XOPEN_SOURCE_EXTENDED , the latter (obsolete) feature test macro is generally not described in the SYNOPSIS in man pages.

_ISOC99_SOURCE (glibc 2.1.3 以 降 )

ISO C99 標 準 に 準 拠 し た 宣 言 を 公 開 す る 。

初 期 の バ ー ジ ョ ン 2.1.x の glibc で は 、 こ れ と 等 価 な _ISOC9X_SOURCE と い う 名 前 の マ ク ロ が 使 わ れ て い た (な ぜ な ら 、 C99 標 準 は ま だ 確 定 し て い な か っ た か ら で あ る )。 _ISOC9X_SOURCE マ ク ロ の 使 用 は 廃 止 さ れ て い る が 、 glibc は 過 去 と の 互 換 性 の た め 今 で も こ の マ ク ロ を 認 識 す る 。

_ISOC99_SOURCE を 定 義 す る と 、 ISO C (1990) Amendment 1 ("C95") の 定 義 も 公 開 さ れ る (C95 で の 主 要 な 変 更 点 は 国 際 化 文 字 集 合 の サ ポ ー ト で あ っ た )。

Invoking the C compiler with the option -std=c99 produces the same effects as defining this macro.

_ISOC11_SOURCE (glibc 2.16 以 降 )

ISO C11 標 準 に 準 拠 し た 宣 言 を 公 開 す る 。 こ の マ ク ロ を 定 義 す る と ( _ISOC99_SOURCE 同 様 ) C99 と C95 の 機 能 も 有 効 に な る 。

Invoking the C compiler with the option -std=c11 produces the same effects as defining this macro.

_LARGEFILE64_SOURCE

LFS (Large File Summit) に よ り "暫 定 拡 張 (transitional extension)" Single UNIX Specification と し て 規 定 さ れ た 代 替 API (alternative API) に 関 す る 定 義 を 公 開 す る ( http://opengroup.org/platform/lfs.html 参 照 )。 代 替 API は 新 規 オ ブ ジ ェ ク ト (関 数 と 型 ) の 集 合 で 構 成 さ れ 、 そ の 名 前 は "64" で 終 わ る (例 え ば 、 off_t に 対 応 す る の は off64_t lseek () に 対 応 す る の は lseek64 () で あ る )。 新 し い プ ロ グ ラ ム で は こ の マ ク ロ を 利 用 し な い こ と 。 代 わ り に _FILE_OFFSET_BITS=64 を 利 用 す る こ と 。

_LARGEFILE_SOURCE

こ の マ ク ロ は 、 歴 史 的 に は 、 フ ァ イ ル オ フ セ ッ ト で long を 使 う 以 前 の API ( fseek (3) や ftell (3)) の 制 限 を 解 決 す る 関 数 (特 に fseeko (3) と ftello (3)) を 公 開 す る の に 使 わ れ て い た 。 こ の マ ク ロ は _XOPEN_SOURCE が 500 以 上 の 値 で 定 義 さ れ て い る 場 合 に 暗 黙 の う ち に 定 義 さ れ る 。 新 し い プ ロ グ ラ ム で は こ の マ ク ロ は 使 用 す べ き で は な い 。 _XOPEN_SOURCE を た だ 定 義 す る か 、 _FILE_OFFSET_BITS を 値 64 で 定 義 す る の が 、 同 じ 結 果 を 得 る た め の 推 奨 さ れ る 方 法 で あ る 。

_FILE_OFFSET_BITS

こ の マ ク ロ を 値 64 で 定 義 す る と 、 フ ァ イ ル I/O と フ ァ イ ル シ ス テ ム 操 作 に 関 連 す る 32 ビ ッ ト 版 の 関 数 と デ ー タ タ イ プ は 自 動 的 に 64 ビ ッ ト 版 に 変 換 さ れ る 。 こ れ は 、 32 ビ ッ ト シ ス テ ム で 大 き な フ ァ イ ル (> 2 ギ ガ バ イ ト ) の I/O を 実 行 す る 際 に 役 立 つ (こ の マ ク ロ を 定 義 す る と 、 コ ン パ イ ル し 直 す だ け で 大 き な フ ァ イ ル を 扱 え る プ ロ グ ラ ム を 書 く こ と が で き る )。

64 ビ ッ ト シ ス テ ム は 、 も と も と 2 ギ ガ バ イ ト よ り 大 き な フ ァ イ ル を 扱 え る の で 、 64 ビ ッ ト シ ス テ ム で は こ の マ ク ロ は 効 果 を 持 た な い 。

_BSD_SOURCE (glibc 2.20 以 降 で は 非 推 奨 )

こ の マ ク ロ を 定 義 す る と 、 値 に 関 わ ら ず 、 ヘ ッ ダ ー フ ァ イ ル で BSD 由 来 の 定 義 が 公 開 さ れ る 。

バ ー ジ ョ ン 2.18 以 前 の glibc で は 、 こ の マ ク ロ を 定 義 す る と 、 相 容 れ な い 標 準 が 存 在 す る 状 況 に お い て BSD 由 来 の 定 義 を 優 先 す る よ う に な る 。 た だ し 、 _SVID_SOURCE , _POSIX_SOURCE , _POSIX_C_SOURCE , _XOPEN_SOURCE , _XOPEN_SOURCE_EXTENDED , _GNU_SOURCE が 一 つ で も 定 義 さ れ た 場 合 に は 、 BSD 由 来 の 定 義 は 優 先 さ れ な く な る 。 glibc 2.19 以 降 で は 、 _BSD_SOURCE を 定 義 し て も 相 容 れ な い 標 準 が あ っ て も BSD 由 来 の 定 義 が 優 先 さ れ る こ と は も は や な く な っ た 。

glibc 2.20 以 降 で は 、 こ の マ ク ロ は 非 推 奨 で あ る 。 こ の マ ク ロ は 現 在 は _DEFAULT_SOURCE を 定 義 す る の と 同 じ 効 果 を 持 つ が 、 ( _DEFAULT_SOURCE が 合 わ せ て 定 義 さ れ て い な い 場 合 に は ) コ ン パ イ ル 時 の 警 告 が 出 る 。 代 わ り に _DEFAULT_SOURCE を 使 用 す る こ と 。 glibc 2.19 以 前 で _BSD_SOURCE が 必 要 で glibc 2.20 以 降 で _DEFAULT_SOURCE を 必 要 と す る プ ロ グ ラ ム を 警 告 を 出 さ ず に コ ン パ イ ル す る に は 、 _BSD_SOURCE _DEFAULT_SOURCE 両 方 を 定 義 す る こ と 。

_SVID_SOURCE (glibc 2.20 以 降 で は 非 推 奨 )

こ の マ ク ロ を 定 義 す る と (値 に 関 わ ら ず ) ヘ ッ ダ ー フ ァ イ ル で System V 由 来 の 定 義 が 公 開 さ れ る (SVID == System V Interface Definition; standards (7) 参 照 )。

glibc 2.20 以 降 、 _BSD_SOURCE と 同 様 に こ の マ ク ロ は 非 推 奨 と な っ て い る 。

_DEFAULT_SOURCE (glibc 2.19 以 降 )

こ の マ ク ロ を 使 う と 、 「 デ フ ォ ル ト 」 が 無 効 に な る よ う な 場 合 で も 「 デ フ ォ ル ト 」 の 定 義 が 提 供 さ れ る よ う に す る こ と が で き る 。 「 デ フ ォ ル ト 」 が 無 効 に な る よ う な 状 況 は 、 個 別 の マ ク ロ が 明 示 的 に 定 義 さ れ た 場 合 や 、 コ ン パ イ ラ が 「 標 準 」 モ ー ド の い ず れ か (例 え ば cc -std=c99 ) で 起 動 さ れ た 場 合 な ど で あ る 。 他 の 個 々 の マ ク ロ が 定 義 さ れ ず 、 コ ン パ イ ラ も 「 標 準 」 モ ー ド の い ず れ か を 指 定 し て 起 動 さ れ て い な い 場 合 は 、 _DEFAULT_SOURCE を 定 義 し て も 何 の 効 果 も な い 。

「 デ フ ォ ル ト 」 定 義 は 、 POSIX.1-2008 と ISO C99 で 必 須 と な っ て い る 定 義 と 、 も と も と は BSD と System V 由 来 の 種 々 の 定 義 を 公 開 す る 。 glibc 2.19 以 前 で は 、 こ れ ら の デ フ ォ ル ト は 以 下 を 明 示 的 に 定 義 す る の と ほ ぼ 等 価 で あ る 。

cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809

_ATFILE_SOURCE (glibc 2.4 以 降 )

こ の マ ク ロ を 定 義 す る と (値 に 関 わ ら ず ) ヘ ッ ダ ー フ ァ イ ル で 名 前 の 末 尾 が "at" の 各 種 の 関 数 の 定 義 が 公 開 さ れ る 。 openat (2) 参 照 。 glibc 2.10 以 降 で は 、 _POSIX_C_SOURCE が 200809L 以 上 の 値 で 定 義 さ れ た 場 合 に は 、 こ の マ ク ロ も 暗 黙 の う ち に 定 義 さ れ る 。

_GNU_SOURCE

こ の マ ク ロ を 定 義 す る と (値 に 関 わ ら ず ) 以 下 の マ ク ロ が 暗 黙 の う ち に 定 義 さ れ る : _ATFILE_SOURCE , _LARGEFILE64_SOURCE , _ISOC99_SOURCE , _XOPEN_SOURCE_EXTENDED , _POSIX_SOURCE , 値 200809L の _POSIX_C_SOURCE (バ ー ジ ョ ン 2.10 よ り 前 の glibc で は 値 は 200112L、 バ ー ジ ョ ン 2.5 よ り 前 の glibc で は 値 は 199506L、 バ ー ジ ョ ン 2.1 よ り 前 の glibc で は 値 は 199309L), 値 700 の _XOPEN_SOURCE (バ ー ジ ョ ン 2.10 よ り 前 の glibc で は 値 は 600、 バ ー ジ ョ ン 2.2 よ り 前 の glibc で は 値 は 500)。

glibc 2.19 以 降 で は 、 _GNU_SOURCE を 定 義 す る と 、 _DEFAULT_SOURCE も 暗 黙 の う ち に 定 義 さ れ る 。 バ ー ジ ョ ン 2.20 よ り 前 の glibc で は 、 _GNU_SOURCE を 定 義 す る と 、 _BSD_SOURCE _SVID_SOURCE も 暗 黙 の う ち に 定 義 さ れ て い た 。

_REENTRANT

Historically, on various C libraries it was necessary to define this macro in all multithreaded code. (Some C libraries may still require this.) In glibc, this macro also exposed definitions of certain reentrant functions.

However, glibc has been thread-safe by default for many years; since glibc 2.3, the only effect of defining _REENTRANT has been to enable one or two of the same declarations that are also enabled by defining _POSIX_C_SOURCE with a value of 199606L or greater.

_REENTRANT is now obsolete. In glibc 2.25 and later, defining _REENTRANT is equivalent to defining _POSIX_C_SOURCE with the value 199606L. If a higher POSIX conformance level is selected by any other means (such as _POSIX_C_SOURCE itself, _XOPEN_SOURCE , _DEFAULT_SOURCE , or _GNU_SOURCE ), then defining _REENTRANT has no effect.

This macro is automatically defined if one compiles with cc -pthread .

_THREAD_SAFE

(非 推 奨 の ) _REENTRANT の 同 義 語 。 他 の い く つ か の 実 装 と の 互 換 性 を 提 供 す る た め の も の 。

_FORTIFY_SOURCE (glibc 2.3.4 以 降 )

Defining this macro causes some lightweight checks to be performed to detect some buffer overflow errors when employing various string and memory manipulation functions (for example, memcpy (3), memset (3), stpcpy (3), strcpy (3), strncpy (3), strcat (3), strncat (3), sprintf (3), snprintf (3), vsprintf (3), vsnprintf (3), gets (3), and wide character variants thereof). For some functions, argument consistency is checked; for example, a check is made that open (2) has been supplied with a mode argument when the specified flags include O_CREAT . Not all problems are detected, just some common cases.

_FORTIFY_SOURCE が 1 に 設 定 さ れ た 場 合 、 コ ン パ イ ラ の 最 適 化 レ ベ ル が 1 ( gcc -O1 ) か そ れ 以 上 で あ れ ば 、 規 格 に 準 拠 す る プ ロ グ ラ ム の 振 る 舞 い を 変 化 さ せ な い よ う な チ ェ ッ ク が 実 行 さ れ る 。 _FORTIFY_SOURCE が 2 に 設 定 さ れ た 場 合 、 さ ら な る チ ェ ッ ク が 追 加 さ れ る が 、 規 格 に 準 拠 す る プ ロ グ ラ ム の い く つ か が 失 敗 す る 可 能 性 が あ る 。

い く つ か の チ ェ ッ ク は (ヘ ッ ダ ー フ ァ イ ル に 実 装 さ れ た マ ク ロ の ロ ジ ッ ク に よ り ) コ ン パ イ ル 時 に 実 行 で き 、 コ ン パ イ ラ の 警 告 と し て 表 示 さ れ る 。 他 の チ ェ ッ ク は 実 行 時 に 行 わ れ 、 チ ェ ッ ク に 失 敗 し た 場 合 に は 実 行 時 エ ラ ー と な る 。

こ の マ ク ロ を 使 用 す る に は コ ン パ イ ラ の 対 応 が 必 要 で あ り 、 バ ー ジ ョ ン 4.0 以 降 の gcc (1) で 利 用 で き る 。

デ フ ォ ル ト の 定 義 、 暗 黙 の 定 義 、 組 み 合 わ せ 定 義

機 能 検 査 マ ク ロ が 一 つ も 明 示 的 に 定 義 さ れ な か っ た 場 合 、 デ フ ォ ル ト で 機 能 検 査 マ ク ロ _BSD_SOURCE (glibc 2.19 以 前 ), _SVID_SOURCE (glibc 2.19 以 前 ), _DEFAULT_SOURCE (glibc 2.19 以 降 ), _POSIX_SOURCE , _POSIX_C_SOURCE =200809L が 定 義 さ れ る (バ ー ジ ョ ン 2.10 よ り 前 の glibc で は 値 は 200112L、 バ ー ジ ョ ン 2.4 よ り 前 の glibc で は 値 は 199506L、 バ ー ジ ョ ン 2.1 よ り 前 の glibc で は 値 は 199309L)。

__STRICT_ANSI__ , _ISOC99_SOURCE , _ISOC11_SOURCE (glibc 2.18 以 降 ), _POSIX_SOURCE , _POSIX_C_SOURCE , _XOPEN_SOURCE , _XOPEN_SOURCE_EXTENDED (glibc 2.11 以 前 ), _BSD_SOURCE (glibc 2.19 以 前 ), _SVID_SOURCE (glibc 2.19 以 前 ) の い ず れ か が 明 示 的 に 定 義 さ れ た 場 合 、 _BSD_SOURCE , _SVID_SOURCE , _SVID_SOURCE は デ フ ォ ル ト で は 定 義 さ れ な い 。

_POSIX_SOURCE _POSIX_C_SOURCE が 明 示 的 に 定 義 さ れ な い 場 合 で 、 __STRICT_ANSI__ が 定 義 さ れ な い 、 も し く は _XOPEN_SOURCE が 500 以 上 の 値 で 定 義 さ れ た と き に は 、

*

_POSIX_SOURCE が 値 1 で 定 義 さ れ 、 か つ

*

_POSIX_C_SOURCE は 以 下 の 値 の い ず れ か 一 つ で 定 義 さ れ る 。

2 ( _XOPEN_SOURCE が 500 未 満 の 値 で 定 義 さ れ た 場 合 )

199506L ( _XOPEN_SOURCE が 500 以 上 600 未 満 の 値 で 定 義 さ れ た 場 合 )

(glibc 2.4 以 降 ) 200112L ( _XOPEN_SOURCE が 600 以 上 700 未 満 の 値 で 定 義 さ れ た 場 合 )

(glibc 2.10 以 降 ) 200809L ( _XOPEN_SOURCE が 700 以 上 の 値 で 定 義 さ れ た 場 合 )

古 い バ ー ジ ョ ン の glibc で は _POSIX_C_SOURCE の 値 と し て 200112L や 200809L は 存 在 せ ず 、 _POSIX_C_SOURCE の 値 が ど う な る か は glibc の バ ー ジ ョ ン に よ り 異 な る 。

_XOPEN_SOURCE が 未 定 義 の 場 合 、 _POSIX_C_SOURCE の 値 は glibc の バ ー ジ ョ ン に よ り 異 な る 。 バ ー ジ ョ ン 2.4 よ り 前 の glibc で は 199506L、 バ ー ジ ョ ン 2.4 以 降 2.9 未 満 で は 200112L、 glibc 2.10 以 降 で は 200809L と な る 。

ま た 、 複 数 の マ ク ロ を 定 義 す る こ と も で き る 。 こ の 場 合 、 定 義 し た マ ク ロ は す べ て 有 効 に な る 。

準 拠

POSIX.1 で は _POSIX_C_SOURCE , _POSIX_SOURCE , _XOPEN_SOURCE が 規 定 さ れ て い る 。

_XOPEN_SOURCE_EXTENDED は XPG4v2 (別 名 SUSv1) で 規 定 さ れ て い た が 、 SUSv2 以 降 に は 存 在 し な い 。 _FILE_OFFSET_BITS は ど の 標 準 で も 規 定 さ れ て い な い が 、 他 の い く つ か の 実 装 で 採 用 さ れ て い る 。

_BSD_SOURCE , _SVID_SOURCE , _DEFAULT_SOURCE , _ATFILE_SOURCE , _GNU_SOURCE , _FORTIFY_SOURCE , _REENTRANT , _THREAD_SAFE は Linux (glibc) 固 有 で あ る 。

注 意

<features.h> は Linux/glibc 固 有 の ヘ ッ ダ ー フ ァ イ ル で あ る 。 他 の シ ス テ ム に も 同 様 の 目 的 の フ ァ イ ル が あ る が 、 普 通 は 違 う 名 前 で あ る 。 こ の ヘ ッ ダ ー フ ァ イ ル は 、 他 の ヘ ッ ダ ー フ ァ イ ル に よ り 必 要 に 応 じ て 自 動 的 に イ ン ク ル ー ド さ れ る 。 機 能 検 査 マ ク ロ を 利 用 す る た め に 明 示 的 に イ ン ク ル ー ド す る 必 要 は な い 。

上 記 の 機 能 検 査 マ ク ロ の う ち ど れ が 定 義 さ れ た か に し た が っ て 、 <features.h> は 、 他 の glibc ヘ ッ ダ ー フ ァ イ ル で チ ェ ッ ク さ れ る 各 種 の 他 の マ ク ロ を 、 内 部 で 定 義 す る 。 こ れ ら の マ ク ロ の 名 前 は ア ン ダ ー ス コ ア 2つ で 始 ま る (例 え ば __USE_MISC )。 ユ ー ザ ー プ ロ グ ラ ム は こ れ ら の マ ク ロ を 決 し て 直 接 定 義 す べ き で は な い 。 代 わ り に 、 上 記 の リ ス ト に あ る 適 切 な 機 能 検 査 マ ク ロ を 利 用 す べ き で あ る 。

下 記 の プ ロ グ ラ ム を 使 う と 、 各 種 の 機 能 検 査 マ ク ロ が glibc の バ ー ジ ョ ン に 応 じ て ど の よ う に 設 定 さ れ る か や 、 ど の 機 能 検 査 マ ク ロ が 明 示 的 に 設 定 さ れ る か 、 を 調 べ る こ と が で き る 。 以 下 に 示 す シ ェ ル セ ッ シ ョ ン は 、 glibc 2.10 の シ ス テ ム で の 実 行 結 果 の 例 で あ る 。

$ cc ftm.c
$ ./a.out
_POSIX_SOURCE defined
_POSIX_C_SOURCE defined: 200809L
_BSD_SOURCE defined
_SVID_SOURCE defined
_ATFILE_SOURCE defined
$ cc -D_XOPEN_SOURCE=500 ftm.c
$ ./a.out
_POSIX_SOURCE defined
_POSIX_C_SOURCE defined: 199506L
_XOPEN_SOURCE defined: 500
$ cc -D_GNU_SOURCE ftm.c
$ ./a.out
_POSIX_SOURCE defined
_POSIX_C_SOURCE defined: 200809L
_ISOC99_SOURCE defined
_XOPEN_SOURCE defined: 700
_XOPEN_SOURCE_EXTENDED defined
_LARGEFILE64_SOURCE defined
_BSD_SOURCE defined
_SVID_SOURCE defined
_ATFILE_SOURCE defined
_GNU_SOURCE defined

プ ロ グ ラ ム の ソ ー ス

/* ftm.c */

#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
#ifdef _POSIX_SOURCE
printf("_POSIX_SOURCE defined\n");
#endif

#ifdef _POSIX_C_SOURCE
printf("_POSIX_C_SOURCE defined: %jdL\n",
(intmax_t) _POSIX_C_SOURCE);
#endif

#ifdef _ISOC99_SOURCE
printf("_ISOC99_SOURCE defined\n");
#endif

#ifdef _ISOC11_SOURCE
printf("_ISOC11_SOURCE defined\n");
#endif

#ifdef _XOPEN_SOURCE
printf("_XOPEN_SOURCE defined: %d\n", _XOPEN_SOURCE);
#endif

#ifdef _XOPEN_SOURCE_EXTENDED
printf("_XOPEN_SOURCE_EXTENDED defined\n");
#endif

#ifdef _LARGEFILE64_SOURCE
printf("_LARGEFILE64_SOURCE defined\n");
#endif

#ifdef _FILE_OFFSET_BITS
printf("_FILE_OFFSET_BITS defined: %d\n", _FILE_OFFSET_BITS);
#endif

#ifdef _BSD_SOURCE
printf("_BSD_SOURCE defined\n");
#endif

#ifdef _SVID_SOURCE
printf("_SVID_SOURCE defined\n");
#endif

#ifdef _DEFAULT_SOURCE
printf("_DEFAULT_SOURCE defined\n");
#endif

#ifdef _ATFILE_SOURCE
printf("_ATFILE_SOURCE defined\n");
#endif

#ifdef _GNU_SOURCE
printf("_GNU_SOURCE defined\n");
#endif

#ifdef _REENTRANT
printf("_REENTRANT defined\n");
#endif

#ifdef _THREAD_SAFE
printf("_THREAD_SAFE defined\n");
#endif

#ifdef _FORTIFY_SOURCE
printf("_FORTIFY_SOURCE defined\n");
#endif

exit(EXIT_SUCCESS);
}

関 連 項 目

libc (7), standards (7), system_data_types (7)

info libc の "Feature Test Macros" の 節 。

/usr/include/features.h

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。