.\" -*- coding: UTF-8 -*- .\" This manpage is Copyright (C) 2006, Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH feature_test_macros 7 "5. Februar 2023" "Linux man\-pages 6.03" .SH BEZEICHNUNG feature_test_macros \- Feature\-Test\-Makros .SH BESCHREIBUNG Mit Feature\-Test\-Makros kann der Programmierer steuern, welche Definitionen aus System\-Header\-Dateien bei der Kompilierung eines Programms verwendet werden. .PP \fBHINWEIS:\fP Um wirksam zu sein, \fImuss die Definition eines Feature\-Test\-Makros im Quelltext vor den #include\-Anweisungen für die Header\-Dateien stehen\fP. Dies kann entweder im Kompilierbefehl (\fIcc \-DMACRO=value\fP) oder durch die Definition des Makros innerhalb des Quellcodes vor dem Einlesen aller Header erreicht werden. Die Anforderung, dass das Makro definiert sein muss, bevor es in irgendwelche Header\-Dateien eingebunden wird, existiert, da sich Header\-Dateien ohne Einschränkungen gegenseitig einbinden dürfen. Daher kann beispielsweise in den nachfolgenden Zeilen die Definition des Makros \fB_GNU_SOURCE\fP keine Wirkung haben, da der Header \fI\fP selbst \fI\fP einbindet (POSIX erlaubt dies explizit): .PP .in +4n .EX #include #define _GNU_SOURCE #include .EE .in .PP Einige Feature\-Test\-Makros helfen bei der Erstellung von portablen Anwendungen, indem sie die Verwendung nicht standardgemäßer Definitionen verhindern. Andere Makros können verwendet werden, um gezielt nicht standardisierte Definitionen, die sonst per Voreinstellung nicht verwendet werden, zu verwenden. .PP Die genauen Auswirkungen jedes der im Folgenden beschriebenen Feature\-Test\-Makros können Sie durch Auswertung der Header\-Datei \fI\fP ermitteln. \fBAnmerkung\fP: Applikationen müssen \fI\fP \fInicht\fP direkt einbinden; es ist im Gegenteil sogar unerwünscht. Siehe ANMERKUNGEN. .SS "Spezifikation der Funktion\-Test\-Makro\-Anforderungen in Handbuchseiten" Wenn eine Funktion die Definition eines Feature\-Test\-Makros erfordert, enthält die ÜBERSICHT einer Handbuchseit in der Regel einen Vermerk der folgenden Form (dieses Beispiel finden Sie in der Handbuchseite von \fBacct\fP(2)): .PP .RS \fB#include \fP .PP \fBint acct(const char *\fP\fIfilename\fP\fB);\fP .PP .RS -4 .EX Mit Glibc erforderliche Makros (siehe feature_test_macros(7)): .EE .RE .PP \fBacct\fP(): _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500) .RE .PP Das \fB||\fP bedeutet, dass zwecks Ermittlung der Deklaration von \fBacct\fP(2) aus \fI\fP \fIeine der beiden\fP folgenden Makro\-Definitionen vor dem Einfügen jeglicher Header\-Dateien erfolgen muss: .PP .in +4n .EX #define _BSD_SOURCE #define _XOPEN_SOURCE /* oder jeder Wert < 500 */ .EE .in .PP Alternativ können gleichwertige Definitionen in den Kompilierbefehl eingebettet werden: .PP .in +4n .EX cc \-D_BSD_SOURCE cc \-D_XOPEN_SOURCE # Oder jeder Wert < 500 .EE .in .PP Beachten Sie, dass \fBeinige Feature\-Test\-Makros standardmäßig definiert sind\fP. Daher ist es nicht immer erforderlich, die in der ÜBERSICHT angegebenen Feature\-Test\-Makro(s) explizit anzugeben. .PP In wenigen Fällen verwenden Handbuchseiten eine Abkürzung für die Anforderungen der Feature\-Test\-Makros (dieses Beispiel stammt aus \fBreadahead\fP(2)): .PP .RS +4 .EX \fB#define _GNU_SOURCE\fP \fB#include \fP .PP \fBssize_t readahead(int \fP\fIfd\fP\fB, off64_t *\fP\fIoffset\fP\fB, size_t \fP\fIcount\fP\fB);\fP .EE .RE .PP Dieses Format wird immer dann angewendet, wenn nur ein einziges Feature\-Test\-Makro die Verwendung der Funktions\-Deklaration ermöglicht und das Makro nicht standardmäßig definiert wird. .SS "Von Glibc »verstandene« Feature\-Test\-Makros" In den Absätzen weiter unten wird erläutert, wie Feature\-Test\-Makros in Glibc 2.\fIx\fP, \fIx\fP > 0, behandelt werden. .PP Zuerst eine Zusammenfassung einiger Details für den Ungeduldigen: .IP \[bu] 3 In modernem Quellcode müssen Sie höchstwahrscheinlich \fB_POSIX_C_SOURCE\fP (für Definitionen aus verschiedenen Versionen von POSIX.1), \fB_XOPEN_SOURCE\fP (für Definitionen aus verschiedenen Versionen von SUS), \fB_GNU_SOURCE\fP (für GNU\- und/oder Linux\-spezifischem Zeug) und \fB_DEFAULT_SOURCE\fP (für normalerweise standardmäßig bereitgestellte Definitionen) verwenden. .IP \[bu] Bestimmte Makros sind mit Vorgabewerten definiert. Daher mag es nicht notwendig sein, sie explizit zu definieren, obwohl eine oder mehrere Makros in der ÜBERSICHT einer Handbuchseite als benötigt markiert sind. Die vollständigen Details der Vorgaben sind später in dieser Handbuchseite dargestellt. .IP \[bu] Die Definition von \fB_XOPEN_SOURCE\fP mit einem Wert von 600 oder mehr bewirkt den gleichen Effekt wie die Definition von \fB_POSIX_C_SOURCE\fP mit einem Wert von 200112L oder größer. Hierbei kann .IP .in +4n .EX _POSIX_C_SOURCE >= 200112L .EE .in .IP in den Feature\-Test\-Makro\-Anforderungen in der ÜBERSICHT einer Handbuchseite ist implizit angenommen, dass das Folgende den gleichen Effekt hat: .IP .in +4n .EX _XOPEN_SOURCE >= 600 .EE .in .IP \[bu] Die Definition von \fB_XOPEN_SOURCE\fP mit einem Wert von 700 oder mehr bewirkt den gleichen Effekt wie die Definition von \fB_POSIX_C_SOURCE\fP mit einem Wert von 200809L oder größer. Hierbei kann .IP .in +4n .EX _POSIX_C_SOURCE >= 200809L .EE .in .IP in den Feature\-Test\-Makro\-Anforderungen in der ÜBERSICHT einer Handbuchseite ist implizit angenommen, dass das Folgende den gleichen Effekt hat: .IP .in +4n .EX _XOPEN_SOURCE >= 700 .EE .in .\" The details in glibc 2.0 are simpler, but combining a .\" a description of them with the details in later glibc versions .\" would make for a complicated description. .PP Die Glibc »versteht« die folgenden Feature\-Test\-Makros: .TP \fB__STRICT_ANSI__\fP ISO Standard C. Dieses Makro wird impliziert definiert, wenn \fBgcc\fP(1) beispielsweise mit den Schaltern \fI\-std=c99\fP oder \fI\-ansi\fP aufgerufen wird. .TP \fB_POSIX_C_SOURCE\fP Mit der Definition dieses Makros stellen Header\-Dateien Definitionen wie folgt bereit: .RS .IP \[bu] 3 Der Wert 1 aktiviert Definitionen gemäß POSIX.1\-1990 und ISO C (1990). .IP \[bu] Ein Wert gleich oder größer als 2 aktiviert zusätzlich Definitionen gemäß POSIX.2\-1992. .IP \[bu] .\" 199506L functionality is available only since glibc 2.1 Der Wert 199309L oder größer aktiviert Definitionen gemäß POSIX.1b (Echtzeiterweiterungen). .IP \[bu] Der Wert 199506L oder größer aktiviert Definitionen gemäß POSIX.1c (Threads). .IP \[bu] (Seit Glibc 2.3.3) Der Wert 200112L oder größer aktiviert zusätzlich Definitionen gemäß der POSIX.1\-2001 Base Specification (ohne die XSI\-Erweiterung). Dieser Wert führt auch zur Aktivierung von C95\- (seit Glibc 2.12) und C99 (seit Glibc 2.10) Funktionalitäten (mit anderen Worten, dies ist äquivalent zur Definition von \fB_ISOC99_SOURCE\fP). .IP \[bu] (Seit Glibc 2.10) Der Wert 200809L oder größer aktiviert zusätzlich Definitionen gemäß der POSIX.1\-2008 Base Specification (ohne die XSI\-Erweiterung). .RE .TP \fB_POSIX_SOURCE\fP Die Definition dieses überholten Makros mit einem beliebigen Wert hat die gleiche Wirkung wie die Definition von \fB_POSIX_C_SOURCE\fP mit dem Wert 1. .IP Da dieses Makro veraltet ist, ist es im Allgemeinen nicht dokumentiert, wenn Feature\-Test\-Makro\-Anforderungen in Handbuchseiten beschrieben werden. .TP \fB_XOPEN_SOURCE\fP Mit der Definition dieses Makros stellen Header\-Dateien Definitionen wie folgt bereit: .RS .IP \[bu] 3 Die Zuweisung eines beliebigen Wertes aktiviert Definitionen nach POSIX.1, POSIX.2 und XPG4. .IP \[bu] Der Wert 500 oder größer aktiviert zusätzlich die Definitionen für SUSv2 (UNIX 98). .IP \[bu] (Seit Glibc 2.2) Der Wert 600 oder größer aktiviert zusätzlich Definitionen für SUSv3 (UNIX 03, also die POSIX.1\-2001 Base Specification und die XSI\-Erweiterung) sowie C99\-Definitionen. .IP \[bu] (Seit Glibc 2.10) Der Wert 700 oder größer aktiviert zusätzlich Definitionen für SUSv4 (d.h. die POSIX.1\-2001 Base Specification und die XSI\-Erweiterung). .RE .IP Falls \fB__STRICT_ANSI__\fP nicht definiert ist oder \fB_XOPEN_SOURCE\fP mit einem Wert identisch zu oder größer als 500 \fIund\fP weder \fB_POSIX_SOURCE\fP noch \fB_POSIX_C_SOURCE\fP explizit definiert sind dann werden die folgenden Makros implizit definiert: .RS .IP \[bu] 3 \fB_POSIX_SOURCE\fP wird auf den Wert 1 gesetzt. .IP \[bu] \fB_POSIX_C_SOURCE\fP wird definiert, entsprechend des Wertes von \fB_XOPEN_SOURCE\fP: .RS .TP \fB_XOPEN_SOURCE\fP < 500 \fB_POSIX_SOURCE\fP wird auf den Wert 2 gesetzt. .TP 500 <= \fB_XOPEN_SOURCE\fP < 600 \fB_POSIX_SOURCE\fP wird auf den Wert 199506L gesetzt. .TP 600 <= \fB_XOPEN_SOURCE\fP < 700 \fB_POSIX_SOURCE\fP wird auf den Wert 200112L gesetzt. .TP 700 <= \fB_XOPEN_SOURCE\fP (seit Glibc 2.10) \fB_POSIX_SOURCE\fP wird auf den Wert 200809L gesetzt. .RE .RE .IP Zusätzlich bewirkt die Definition von \fB_XOPEN_SOURCE\fP mit einem Wert von 500 oder mehr den gleichen Effekt wie die Definition von \fB_XOPEN_SOURCE_EXTENDED\fP. .TP \fB_XOPEN_SOURCE_EXTENDED\fP Wenn dieses Makro \fIund\fP \fB_XOPEN_SOURCE\fP definiert sind, dann werden Definitionen entsprechend den XPG4v2\- (SUSv1\-)UNIX\-Erweiterungen (UNIX 95) aktiviert. Wird \fB_XOPEN_SOURCE\fP mit einem Wert von 500 oder mehr definiert, ist der Effekt identisch zur Definition von \fB_XOPEN_SOURCE_EXTENDED\fP. Der Einsatz von \fB_XOPEN_SOURCE_EXTENDED\fP in neuem Quellcode sollte vermieden werden. .IP Da die Definition von \fB_XOPEN_SOURCE\fP mit einem Wert von 500 oder mehr den gleichen Effekt wie die Definition von \fB_XOPEN_SOURCE_EXTENDED\fP hat, wird das letztere (veraltete) Makro im Allgemeinen in der ÜBERSICHT in Handbuchseiten nicht beschrieben. .TP \fB_ISOC99_SOURCE\fP (seit Glibc 2.1.3) Aktiviert Deklarationen, die mit dem ISO\-C99\-Standard konsistent sind. .IP Frühere Glibc 2.1.x\-Versionen verarbeiteten ein gleichwertiges Makro \fB_ISOC9X_SOURCE\fP (weil der C99\-Standard noch nicht fertig war). Obwohl die Verwendung dieses Makros obsolet ist, wird es von der Glibc weiter zwecks Abwärtskompatibilität unterstützt. .IP Die Definition von \fB_ISOC99_SOURCE\fP aktiviert auch ISO C (1990) Anhang 1\-Definitionen (»C95«). (Die hauptsächliche Änderung in C95 war die Unterstützung für internationale Zeichensätze.) .IP Der Aufruf des C\-Compilers mit der Option \fI\-std=c99\fP bewirkt den gleichen Effekt wir die Definition dieses Makros. .TP \fB_ISOC11_SOURCE\fP (seit Glibc 2.16) Aktiviert Deklarationen, die mit dem ISO\-C11\-Standard konsistent sind. Die Definition dieses Makros aktiviert auch C99\- und C95\-Funktionalitäten (wie \fB_ISOC99_SOURCE\fP). .IP Der Aufruf des C\-Compilers mit der Option \fI\-std=c11\fP bewirkt den gleichen Effekt wie die Definition dieses Makros. .TP \fB_LARGEFILE64_SOURCE\fP Aktiviert Definitionen für das durch LFS (Large File Summit) definierte alternative API als »Übergangserweiterungen« zu der »Single UNIX Specification«. (Siehe .UR http:\:/\:/opengroup.org\:/platform\:/lfs.html .UE .) Das alternative API besteht aus einer Reihe von neuen Objekten (d.h. Funktionen und Typen), deren Namen mit »64« endet (z. B. \fIoff64_t \fP versus \fIoff_t\fP, \fBlseek64\fP() versus \fBlseek\fP(), usw.). Neue Programme sollten dieses Makro nicht verwenden, sondern \fI_FILE_OFFSET_BITS=64\fP einsetzen. .TP \fB_LARGEFILE_SOURCE\fP Dieses Makro wurde traditionell verwandt, um bestimmte Funktionen (insbesondere \fBfseeko\fP(3) und \fBftello\fP(3)) bereitzustellen, die sich um Beschränkungen älterer APIs (\fBfseek\fP(3) und \fBftell\fP(3)) kümmerten, die \fIlong\fP für Datei\-Offsets verwandten. Dieses Makro ist implizit definiert, falls \fB_XOPEN_SOURCE\fP mit einem Wert gleich oder größer als 500 definiert ist. Neue Programme sollten dieses Makro nicht einsetzen; um das gleiche Ergebnis zu erhalten, ist der empfohlene Mechanismus, \fB_XOPEN_SOURCE\fP wie gerade beschrieben oder \fB_FILE_OFFSET_BITS\fP mit einem Wert von 64 zu definieren. .TP \fB_FILE_OFFSET_BITS\fP Wird diesem Makro der Wert 64 zugewiesen, werden automatisch Verweise auf 32\-Bit\-Funktionen und \-Datentypen für Datei\-Ein/Ausgabe und Dateisystem\-Operationen in Verweise auf ihre 64\-Bit\-Pendants konvertiert. Dies ist für die Ein\-/Ausgabe in und aus großen Dateien (> 2 Gigabyte) auf 32\-Bit\-Systemen nützlich. (Mit der Definition dieses Makros können korrekt geschriebene Programme nach einer einfachen Neukompilierung große Dateien bearbeiten.) .IP 64\-Bit\-Systeme erlauben natürlich Dateigrößen größer als 2 Gigabyte. Auf diesen Systemen dieses Makro hat keine Wirkung. .TP \fB_TIME_BITS\fP Wird diesem Makro der Wert 64 zugewiesen, dann wird die Breite von \fBtime_t\fP(3type) auf 64 bit geändert, was den Umgang mit Zeitstempeln jenseits von 2038 erlaubt. Dies ist eng mit \fB_FILE_OFFSET_BITS\fP verwandt und könnte, abhängig von der Implementierung, benötigen, dass dies gesetzt ist. Dieses Makro ist mit Glibc 2.34 verfügbar. .TP \fB_BSD_SOURCE\fP (misbilligt seit Glibc 2.20) Mit der Definition dieses Makros mit irgend einem Wert stellen Header\-Dateien BSD\-abgeleitete Definitionen bereit. .IP In Glibc bis einschließlich 2.18 bewirkte die Definition dieses Makros auch, dass BSD\-Definitionen in manchen Situationen vorgezogen werden, wenn sich Standards widersprechen. Sind aber eines oder mehrere Makros aus der Gruppe \fB_SVID_SOURCE\fP, \fB_POSIX_SOURCE\fP, \fB_POSIX_C_SOURCE\fP, \fB_XOPEN_SOURCE\fP, \fB_XOPEN_SOURCE_EXTENDED\fP oder \fB_GNU_SOURCE\fP definiert, werden BSD\-Definitionen missachtet. Seit Glibc 2.19 führt \fB_BSD_SOURCE\fP nicht mehr dazu, dass BSD\-Definitionen im Konfliktfall bevorzugt werden. .IP .\" commit c941736c92fa3a319221f65f6755659b2a5e0a20 .\" commit 498afc54dfee41d33ba519f496e96480badace8e .\" commit acd7f096d79c181866d56d4aaf3b043e741f1e2c .\" commit ade40b10ff5fa59a318cf55b9d8414b758e8df78 Seit Glibc 2.20 wird dieses Makro misbilligt. Es hat jetzt den gleichen Effekt wie die Definition von \fB_DEFAULT_SOURCE\fP, erzeugt aber eine Compiler\-Warnung (außer \fB_DEFAULT_SOURCE\fP ist auch definiert). Verwenden Sie stattdessen \fB_DEFAULT_SOURCE\fP. Um Code zu erlauben, der bis Glibc 2.19 \fB_BSD_SOURCE\fP und \fB_DEFAULT_SOURCE\fP ab Glibc 2.20 benötigt, um ohne Warnung übersetzt zu werden, definieren Sie \fIsowohl\fP \fB_BSD_SOURCE\fP als auch \fB_DEFAULT_SOURCE\fP. .TP \fB_SVID_SOURCE\fP (misbilligt seit Glibc 2.20) Die Definition dieses Makros mit einem beliebigen Wert veranlasst Header\-Dateien zur Aktivierung von von System V abgeleiteten Definitionen. (SVID steht für System V Interface Definition; siehe \fBstandards\fP(7).) .IP Dieses Makro wird in der gleichen Art wie \fB_BSD_SOURCE\fP seit Glibc 2.20 misbilligt. .TP \fB_DEFAULT_SOURCE\fP (seit Glibc 2.19) Dieses Makro kann definiert werden, um sicherzustellen, dass die »Standarddefinitionen« bereitgestellt werden, selbst wenn die Vorgaben ansonsten deaktiviert würden. Dies passiert beispielsweise, wenn individuelle Makros explizit definiert sind oder der Compiler in einem seiner »Standardmodi« aufgerufen wird (z.B. \fIcc\~\-std=c99\fP). .IP Die »Standard«\-Definition umfasst die von POSIX.1\-2008 und C99 umfassten sowie verschiedene ursprünglich aus BDS und System V abgeleitete Definitionen. Bis Glibc 2.19 waren diese Standardwerte ungefähr zu der folgenden, expliziten Definition identisch: .IP .in +4n .EX cc \-D_BSD_SOURCE \-D_SVID_SOURCE \-D_POSIX_C_SOURCE=200809 .EE .in .TP \fB_ATFILE_SOURCE\fP (seit Glibc 2.4) Die Definition dieses Makros mit einem beliebigen Wert veranlasst Header\-Dateien zur Aktivierung einer Auswahl von Funktion mit der Endung »at«, siehe \fBopenat\fP(2). Seit Glibc 2.10 wird dieses Makro auch implizit definiert, wenn \fB_POSIX_C_SOURCE\fP mit einem Wert größer oder gleich 200809L definiert ist. .TP \fB_GNU_SOURCE\fP Die Definition dieses Makros (mit einem beliebigen Wert) definiert implizit \fB_ATFILE_SOURCE\fP, \fB_LARGEFILE64_SOURCE\fP, \fB_ISOC99_SOURCE\fP, \fB_XOPEN_SOURCE_EXTENDED\fP, \fB_POSIX_SOURCE\fP, \fB_POSIX_C_SOURCE\fP mit dem Wert 200809L (200112L vor Glibc 2.10; 199506L vor Glibc 2.5; 199309L vor Glibc 2.1) und \fB_XOPEN_SOURCE\fP mit dem Wert 700 (600 vor Glibc 2.10; 500 vor Glibc 2.2). Darüber hinaus werden verschiedene GNU\-spezifische Erweiterungen aktiviert. .IP Seit Glibc 2.19 hat die Definition von \fB_GNU_SOURCE\fP auch den Effekt, \fB_DEFAULT_SOURCE\fP implizit zu definieren. Vor Glibc 2.20 hatte die Definition von \fB_GNU_SOURCE\fP auch den Effekt, \fB_BSD_SOURCE\fP und \fB_SVID_SOURCE\fP implizit zu definieren. .TP \fB_REENTRANT\fP .\" Zack Weinberg .\" There did once exist C libraries where it was necessary. The ones .\" I remember were proprietary Unix vendor libcs from the mid-1990s .\" You would get completely unlocked stdio without _REENTRANT. Historisch war es bei verschiedenen C\-Bibliotheken notwendig, dieses Makro in allem Code, der multithreaded ist, zu definieren. (Einige C\-Bibliotheken könnten dies noch immer benötigen). Unter Glibc legte dieses Makro auch Definitionen von bestimmten, wiedereintrittsfähigen Funktionen offen. .IP Allerdings ist Glibc standardmäßig seit vielen Jahren Thread\-sicher (seit Glibc 2.3). Der einzige Effekt der Definition von \fB_REENTRANT\fP war, dass sie auch eine oder zwei der gleichen Deklarationen aktivierte, die auch durch die Definition von \fB_POSIX_C_SOURCE\fP mit einem Wert von 199606L oder höher aktiviert werden. .IP \fB_REENTRANT\fP ist jetzt veraltet. Seit Glibc 2.25 ist die Definition von \fB_REENTRANT\fP äquivalent zur Definition von \fB_POSIX_C_SOURCE\fP mit dem Wert 199606L. Falls durch eine andere Methode eine höhere Konformitätsstufe (wie \fB_POSIX_C_SOURCE\fP selbst, \fB_XOPEN_SOURCE\fP, \fB_DEFAULT_SOURCE\fP oder \fB_GNU_SOURCE\fP) ausgewählt wird, hat die Definition von \fB_REENTRANT\fP keinen Effekt. .IP Dieses Makro wird automatisch definiert, falls mit \fIcc\~\-pthread\fP kompiliert wird. .TP \fB_THREAD_SAFE\fP Synonym für das (veraltete) \fB_REENTRANT\fP; wird für die Kompatibilität mit einigen anderen Implementierungen bereitgestellt. .TP \fB_FORTIFY_SOURCE\fP (seit Glibc 2.3.4) .\" For more detail, see: .\" http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html .\" [PATCH] Object size checking to prevent (some) buffer overflows .\" * From: Jakub Jelinek .\" * To: gcc-patches at gcc dot gnu dot org .\" * Date: Tue, 21 Sep 2004 04:16:40 -0400 .\" Look for __USE_FORTIFY_LEVEL in the header files Die Definition dieses Makros führt dazu, dass ein paar leichtgewichtige Prüfungen durchgeführt werden, um einige Pufferüberlauffehler beim Einsatz verschiedener Zeichenketten\- und Speicherveränderungsfunktionen (beispielsweise bei \fBmemcpy\fP(3), \fBmemset\fP(3), \fBstpcpy\fP(3), \fBstrcpy\fP(3), \fBstrncpy\fP(3), \fBstrcat\fP(3), \fBstrncat\fP(3), \fBsprintf\fP(3), \fBsnprintf\fP(3), \fBvsprintf\fP(3), \fBvsnprintf\fP(3), \fBgets\fP(3) und deren Weitzeichenvarianten) zu erkennen. Bei einigen Funktionen wird die Konsistenz der Argumente geprüft, beispielsweise dass bei \fBopen\fP(2) ein Argument \fImode\fP übergeben wurde, wenn die angegebenen Schalter \fBO_CREAT\fP enthalten. Es werden nicht alle Probleme sondern lediglich einige häufige Fälle erkannt. .IP .\" For example, given the following code .\" int d; .\" char buf[1000], buf[1000]; .\" strcpy(fmt, "Hello world\n%n"); .\" snprintf(buf, sizeof(buf), fmt, &d); .\" .\" Compiling with "gcc -D_FORTIFY_SOURCE=2 -O1" and then running will .\" cause the following diagnostic at run time at the snprintf() call .\" .\" *** %n in writable segment detected *** .\" Aborted (core dumped) .\" Ist der Wert von \fB_FORTIFY_SOURCE\fP gleich 1 und die Compiler\-Optimierungsstufe 1 (\fIgcc\ \-O1\fP) oder höher, erfolgt eine Beschränkung auf Kontrollen, die das Verhalten standardkonformer Programme nicht ändern sollten. Wird \fB_FORTIFY_SOURCE\fP auf 2 gesetzt, werden ein paar Kontrollen hinzugefügt, die aber Fehler in einigen standardkonformen Programmen bewirken könnten. .IP Einige der Prüfungen können bei der Kompilierung ausgeführt werden (mittels in Header\-Dateien implementierter Makrologik) und führen zu Compiler\-Warnungen, andere Kontrollen finden zur Laufzeit statt und führen zu einem Laufzeitfehler, wenn die Überprüfung fehlschlägt. .IP Ist \fB_FORTIFY_SOURCE\fP auf 3 gesetzt, dann werden zusätzliche Überprüfungen hinzugefügt, um einige Funktionsaufrufe abzufangen, die mit einem Argument variabler Größe verwandt werden, bei denen der Compiler eine obere Grenze für ihren Wert ableiten kann. Beispielsweise kann ein Programm, bei denen das Größe\-Argument von \fBmalloc\fP(3) eine Variable ist, jetzt mit Fortify gesichert werden. .IP Die Verwendung dieses Makros benötigt die Unterstützung durch den Compiler. Diese ist in \fBgcc\fP(1) seit Glibc 4.0 verfügbar. .IP Die Verwendung von \fB_FORTIFY_SOURCE\fP auf 3 gesetzt benötigt \fBgcc\fP(1) Version 12.0 oder neuer. .SS "Standarddefinitionen, implizite Definitionen und Kombinationsdefinitionen" Ohne explizit definierte Feature\-Test\-Makros werden standardmäßig die folgenden Feature\-Test\-Makros definiert: \fB_BSD_SOURCE\fP (bis Glibc 2.19), \fB_SVID_SOURCE\fP (bis Glibc 2.19), \fB_DEFAULT_SOURCE\fP (seit Glibc 2.19), \fB_POSIX_SOURCE\fP und \fB_POSIX_C_SOURCE\fP=200809L (200112L vor Glibc 2.10; 199506L vor Glibc 2.4; 199309L vor Glibc 2.1). .PP Wenn eines von \fB__STRICT_ANSI__\fP, \fB_ISOC99_SOURCE\fP, \fB_ISOC11_SOURCE\fP (seit Glibc 2.18), \fB_POSIX_SOURCE\fP, \fB_POSIX_C_SOURCE\fP, \fB_XOPEN_SOURCE\fP, \fB_XOPEN_SOURCE_EXTENDED\fP (bis Glibc 2.11), \fB_BSD_SOURCE\fP (bis Glibc 2.19) oder \fB_SVID_SOURCE\fP (bis Glibc 2.19) explizit definiert ist, dann werden standardmäßig \fB_BSD_SOURCE\fP, \fB_SVID_SOURCE\fP und \fB_DEFAULT_SOURCE\fP nicht definiert. .PP Sind \fB_POSIX_SOURCE\fP und \fB_POSIX_C_SOURCE\fP nicht explizit definiert und entweder \fB__STRICT_ANSI__\fP ist nicht definiert oder \fB_XOPEN_SOURCE\fP hat einen Wert von 500 oder mehr, dann .IP \[bu] 3 wird \fB_POSIX_SOURCE\fP auf den Wert 1 gesetzt und .IP \[bu] \fB_POSIX_C_SOURCE\fP erhält einen der folgenden Werte: .RS 3 .IP \[bu] 3 2, falls \fB_XOPEN_SOURCE\fP mit einem Wert kleiner als 500 definiert ist; .IP \[bu] 199506L, falls \fB_XOPEN_SOURCE\fP mit einem Wert größer oder gleich 500 und kleiner als 600 definiert ist; oder .IP \[bu] (Seit Glibc 2.4) 200112L, falls \fB_XOPEN_SOURCE\fP mit einem Wert größer oder gleich 600 und kleiner als 700 definiert ist. .IP \[bu] (Seit Glibc 2.4) 200809L, falls \fB_XOPEN_SOURCE\fP mit einem Wert größer oder gleich 700 definiert ist. .IP \[bu] Ältere Versionen von Glibc kennen die Werte 200112L und 200809L für \fB_POSIX_C_SOURCE\fP nicht, der Wert für das Makro hängt also von der Glibc\-Version ab. .IP \[bu] Wenn \fB_XOPEN_SOURCE\fP nicht definiert ist, hängt der zulässige Wert von \fB_POSIX_C_SOURCE\fP von der Glibc\-Version ab: 199506L vor Glibc 2.4; 200112L seit Glibc 2.4 bis 2.9 und 200809L seit Glibc 2.10. .RE .PP Es können mehrere Makros definiert werden, die Effekte akkumulieren sich. .SH STANDARDS POSIX.1 legt \fB_POSIX_C_SOURCE\fP, \fB_POSIX_SOURCE\fP und \fB_XOPEN_SOURCE\fP fest. .PP \fB_XOPEN_SOURCE_EXTENDED\fP wurde von XPG4v2 (auch bekannt als SUSv1) spezifiziert, ist aber seit SUSv2 vorhanden. \fB_FILE_OFFSET_BITS\fP kommt in keinem Standard vor, wird aber auf verschiedenen anderen Implementierungen verwendet. .PP \fB_BSD_SOURCE\fP, \fB_SVID_SOURCE\fP, \fB_DEFAULT_SOURCE\fP, \fB_ATFILE_SOURCE\fP, \fB_GNU_SOURCE\fP, \fB_FORTIFY_SOURCE\fP, \fB_REENTRANT\fP und \fB_THREAD_SAFE\fP sind Linux\-spezifisch (Glibc). .SH ANMERKUNGEN \fI\fP ist eine Linux/Glibc\-spezifische Header\-Datei. Andere Systeme verfügen über eine analoge Datei, die in der Regel einen anderen Namen trägt. Diese Header\-Datei wird bei Bedarf automatisch durch andere Header\-Dateien einbezogen: sie muss nicht explizit einbezogen werden, um Feature\-Test\-Makros zu verwenden. .PP Je nachdem, welche der oben genannten Feature\-Test\-Makros definiert sind, definiert \fI\fP intern verschiedene weitere Makros, die von anderen Glibc\-Header\-Dateien überprüft werden. Die Namen dieser Makros beginnen mit zwei vorangestellten Unterstrichen (z. B. \fB__USE_MISC\fP). Programme sollten diese Makros \fInie\fP direkt definieren: stattdessen sollten die passenden Feature\-Test\-Makro(s) aus der obigen Liste eingesetzt werden. .SH BEISPIELE Mit dem folgenden Programm können Sie erkunden, wie die verschiedenen Feature\-Test\-Makros abhängig von der Glibc\-Version und welche explizit gesetzt werden. Die folgende Shell\-Sitzung auf einem System mit Glibc 2.10 zeigt einige Beispiele für mögliche Ausgaben: .PP .in +4n .EX $ \fBcc ftm.c\fP $ \fB./a.out\fP _POSIX_SOURCE definiert _POSIX_C_SOURCE definiert: 200809L _BSD_SOURCE definiert _SVID_SOURCE definiert _ATFILE_SOURCE definiert $ \fBcc \-D_XOPEN_SOURCE=500 ftm.c\fP $ \fB./a.out\fP _POSIX_SOURCE definiert _POSIX_C_SOURCE definiert: 199506L _XOPEN_SOURCE definiert: 500 $ \fBcc \-D_GNU_SOURCE ftm.c\fP $ \fB./a.out\fP _POSIX_SOURCE definiert _POSIX_C_SOURCE definiert: 200809L _ISOC99_SOURCE definiert _XOPEN_SOURCE definiert: 700 _XOPEN_SOURCE_EXTENDED definiert _LARGEFILE64_SOURCE definiert _BSD_SOURCE definiert _SVID_SOURCE definiert _ATFILE_SOURCE definiert _GNU_SOURCE definiert .EE .in .SS Programmquelltext \& .EX /* ftm.c */ #include #include #include #include int main(int argc, char *argv[]) { #ifdef _POSIX_SOURCE printf("_POSIX_SOURCE definiert\en"); #endif #ifdef _POSIX_C_SOURCE printf("_POSIX_C_SOURCE definiert: %jdL\en", (intmax_t) _POSIX_C_SOURCE); #endif #ifdef _ISOC99_SOURCE printf("_ISOC99_SOURCE definiert\en"); #endif #ifdef _ISOC11_SOURCE printf("_ISOC11_SOURCE definiert\en"); #endif #ifdef _XOPEN_SOURCE printf("_XOPEN_SOURCE definiert: %d\en", _XOPEN_SOURCE); #endif #ifdef _XOPEN_SOURCE_EXTENDED printf("_XOPEN_SOURCE_EXTENDED definiert\en"); #endif #ifdef _LARGEFILE64_SOURCE printf("_LARGEFILE64_SOURCE definiert\en"); #endif #ifdef _FILE_OFFSET_BITS printf("_FILE_OFFSET_BITS definiert: %d\en", _FILE_OFFSET_BITS); #endif #ifdef _TIME_BITS printf("_TIME_BITS definiert: %d\en", _TIME_BITS); #endif #ifdef _BSD_SOURCE printf("_BSD_SOURCE definiert\en"); #endif #ifdef _SVID_SOURCE printf("_SVID_SOURCE definiert\en"); #endif #ifdef _DEFAULT_SOURCE printf("_DEFAULT_SOURCE definiert\en"); #endif #ifdef _ATFILE_SOURCE printf("_ATFILE_SOURCE definiert\en"); #endif #ifdef _GNU_SOURCE printf("_GNU_SOURCE definiert\en"); #endif #ifdef _REENTRANT printf("_REENTRANT definiert\en"); #endif #ifdef _THREAD_SAFE printf("_THREAD_SAFE definiert\en"); #endif #ifdef _FORTIFY_SOURCE printf("_FORTIFY_SOURCE definiert\en"); #endif exit(EXIT_SUCCESS); } .EE .SH "SIEHE AUCH" \fBlibc\fP(7), \fBstandards\fP(7), \fBsystem_data_types\fP(7) .PP .\" But beware: the info libc document is out of date (Jul 07, mtk) Der Abschnitt »Feature Test Macros« unter \fIinfo libc\fP. .PP \fI/usr/include/features.h\fP .PP .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer und Helge Kreutzmann erstellt. .PP Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. .PP Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die .MT debian-l10n-german@lists.debian.org Mailingliste der Übersetzer .ME .