Man page - attributes(7)

Packages contains this manual

Available languages:

en fr pl ru ro de

Manual

attributes

NOM
DESCRIPTION
Fonctionnalités sûres sous condition
Autres remarques sur la sûreté
VOIR AUSSI
TRADUCTION

NOM

attributes – Concepts de sĂ©curitĂ© POSIX

DESCRIPTION

Note : le texte de cette page de manuel est basĂ©e sur des Ă©lĂ©ments pris dans la section « POSIX Safety Concepts » du manuel de la bibliothĂšque GNU C. Plus de dĂ©tails sur les sujets dĂ©crits ici peuvent ĂȘtre trouvĂ©s dans ce manuel.

Diverses pages de manuel de fonctions comportent une section ATTRIBUTES qui dĂ©crit la sĂ©curitĂ© de l’appel d’une fonction dans divers contextes. Cette section annote les fonctions avec les balises de sĂ©curitĂ© suivantes :
MT-Safe

Les fonctions MT-Safe ou Thread-Safe sont sĂ»res Ă  appeler en prĂ©sence d’autres threads. MT, dans MT-Safe, signifie « multithread ».

L’état MT-Safe n’implique pas qu’une fonction est atomique, ni qu’elle utilise un des mĂ©canismes de synchronisation de mĂ©moire que POSIX expose aux utilisateurs. Il est mĂȘme possible que l’appel de plusieurs fonctions MT-Safe Ă  la suite ne produise pas une combinaison MT-Safe. Par exemple, le fait qu’un thread appelle deux fonctions MT-Safe l’une immĂ©diatement aprĂšs l’autre ne garantit pas un comportement Ă©quivalent Ă  l’exĂ©cution atomique de la combinaison des deux fonctions, dans la mesure oĂč des appels concomitants dans d’autres threads peuvent interfĂ©rer de maniĂšre destructive.

Les optimisations Ă  l’échelle du programme qui peuvent intĂ©grer des fonctions Ă  travers les interfaces des bibliothĂšques peuvent exposer Ă  des rĂ©organisations non sĂ»res, aussi il n’est pas recommandĂ© de rĂ©aliser des intĂ©grations au moyen des interfaces de la bibliothĂšque GNU C. L’état documentĂ© MT-Safety n’est pas garanti. NĂ©anmoins, les fonctions dĂ©finies dans les en-tĂȘtes visibles par l’utilisateur sont conçues pour ĂȘtre sĂ»res pour l’intĂ©gration.

MT-Unsafe

Les fonctions MT-Unsafe ne sont pas sûres pour des appels dans des programmes multithreadés.

D’autres mots-clefs qui apparaissent dans des notes de sĂ»retĂ© sont dĂ©finis dans les sections suivantes.

Fonctionnalités sûres sous condition

Pour certaines fonctionnalitĂ©s qui rendent non sĂ»re l’appel de certaines fonctions dans certains contextes, il existe des moyens connus pour Ă©viter un problĂšme autres que de s’abstenir complĂštement d’appeler la fonction. Les mots-clĂ©s qui suivent font rĂ©fĂ©rence Ă  ces fonctionnalitĂ©s et chacune des dĂ©finitions indique comment le programme dans son ensemble doit ĂȘtre contraint de maniĂšre Ă  supprimer le problĂšme de sĂ»retĂ© indiquĂ© par le mot-clĂ©. C’est seulement lorsque toutes les raisons qui rendent une fonction non sĂ»re ont Ă©tĂ© observĂ©es et traitĂ©es, en appliquant les contraintes documentĂ©es, que l’appel d’une fonction devient sĂ»r dans un contexte.

init

Les fonctions marquées init en tant que fonctionnalité MT-Unsafe réalisent une initialisation MT-Unsafe quand elles sont appelées en premier.

L’appel d’une fonction de ce type au moins une fois en mode monothread supprime cette raison spĂ©cifique qui fait considĂ©rer la fonction comme MT-Unsafe . S’il ne reste pas d’autre raison, la fonction peut alors ĂȘtre appelĂ©e de façon sĂ»re aprĂšs le dĂ©marrage d’autres threads.

race

Les fonctions marquĂ©es race en tant que problĂšme d’état MT-Safe opĂšrent sur des objets d’une façon qui peut provoquer des situations de concurrences de donnĂ©es ou des formes similaires d’interfĂ©rences destructives provoquĂ©es par une exĂ©cution concurrente. Dans certains cas, les objets sont passĂ©s aux fonctions par les utilisateurs ; dans d’autres, ils sont utilisĂ©s par les fonctions pour renvoyer des valeurs aux utilisateurs ; dans d’autres encore, ils ne sont mĂȘme pas exposĂ©s aux utilisateurs.

const

Les fonctions marquĂ©es const en tant que problĂšme d’état MT-Safe modifient de façon non-atomique les objets internes qui sont plutĂŽt Ă  considĂ©rer comme constants, parce qu’une partie importante de la bibliothĂšque GNU C y accĂšde sans synchronisation. À la diffĂ©rence de race qui fait qu’à la fois lecteurs et Ă©crivains d’objets internes sont considĂ©rĂ©s comme MT-Unsafe , cette marque ne s’applique qu’aux Ă©crivains. Leur appel demeure MT-Unsafe , mais le caractĂšre constant alors obligatoire des objets qu’ils modifient permet de considĂ©rer les lecteurs comme MT-safe (aussi longtemps qu’il n’y a pas d’autre raison pour qu’ils soient non sĂ»rs), dans la mesure oĂč l’absence de synchronisation n’est pas un problĂšme quand les objets sont effectivement constants.

L’identifiant qui suit la marque const apparaĂźtra lui-mĂȘme conne une note de sĂ»retĂ© dans les lecteurs. Les programmes qui souhaitent contourner ce problĂšme de sĂ»retĂ©, afin d’appeler les Ă©crivains, peuvent utiliser un verrou en lecture et Ă©criture non rĂ©cursif associĂ© Ă  l’identifiant et garder la totalitĂ© des appels Ă  des fonctions marquĂ©es const suivies de l’identifiant avec un verrou en Ă©criture et la totalitĂ© des appels Ă  des fonctions marquĂ©es par l’identifiant lui-mĂȘme avec un verrou en lecture.

sig

Les fonctions marquĂ©es sig en tant que problĂšme d’état MT-Safe peuvent installer de façon temporaire un gestionnaire de signal Ă  des fins internes qui peut interfĂ©rer avec d’autres usages du signal, identifiĂ© aprĂšs deux-points.

Le problĂšme de sĂ»retĂ© peut ĂȘtre contournĂ© en s’assurant qu’aucun autre usage du signal n’interviendra pendant la durĂ©e de l’appel. Il est recommandĂ© de maintenir un mutex non rĂ©cursif pendant l’appel de toutes les fonctions qui utilisent le mĂȘme signal temporaire, de bloquer ce signal avant l’appel et de rĂ©initialiser son gestionnaire aprĂšs.

term

Les fonctions marquĂ©es term en tant que problĂšme d’état MT-Safe peuvent modifier la configuration du terminal de la façon recommandĂ©e, c’est-Ă -dire : appel de tcgetattr (3), modification de certains attributs puis appel de tcsetattr (3), cela crĂ©e une fenĂȘtre dans laquelle les modifications effectuĂ©es par d’autres threads sont perdues. Donc, les fonctions marquĂ©es term sont MT-Unsafe .

Il est donc recommandĂ© d’éviter, pour les applications utilisant le terminal, des interactions simultanĂ©es et rĂ©entrantes avec lui en nel’utilisant pas dans les gestionnaires de signal ou les signaux bloquants qui pourraient l’utiliser Ă©galement, et de maintenir un verrou pendant l’utilisation de ces fonctions et l’interaction avec le terminal. Ce verrou devrait Ă©galement ĂȘtre utilisĂ© pour l’exclusion mutuelle avec les fonctions marquĂ©es race:tcattr(fd) oĂč fd est un descripteur de fichier pour le terminal de contrĂŽle. L’appelant peut utiliser un mutex unique pour simplifier ou utiliser un mutex par terminal mĂȘme s’ils sont rĂ©fĂ©rencĂ©s par des descripteurs de fichier diffĂ©rents.

Autres remarques sur la sûreté

Des mots clefs supplĂ©mentaires peuvent ĂȘtre ajoutĂ©s aux fonctions, indiquant des fonctionnalitĂ©s qui ne rendent pas la fonction non sĂ»re Ă  appeler, mais il peut ĂȘtre nĂ©cessaire d’en tenir compte dans certaines classes de programmes.

locale

Les fonctions marquĂ©es locale en tant que problĂšme d’état MT-Safe lisent Ă  partir de l’objet locale sans aucune forme de synchronisation. Ces fonctions appelĂ©es en mĂȘme temps que des modifications de locale peuvent se comporter d’une maniĂšre qui ne correspond Ă  aucune des locales actives pendant leur exĂ©cution mais Ă  un mĂ©lange imprĂ©visible de celles-ci.

Nous ne marquons pas ces fonctions comme MT-Unsafe nĂ©anmoins, car les fonctions qui modifient l’objet locale sont marquĂ©es const:locale et considĂ©rĂ©es comme non sĂ»res. Étant non sĂ»res, ces derniĂšres ne doivent pas ĂȘtre appelĂ©es quand plusieurs threads sont en exĂ©cution ou lorsque les signaux asynchrones sont activĂ©s, et ainsi la locale peut ĂȘtre considĂ©rĂ©e comme effectivement constante dans ces contextes, ce qui rend les premiĂšres fonctions sĂ»res.

env

Les fonctions marquĂ©es env en tant que problĂšme d’état MT-Safe accĂšdent Ă  l’environnement avec getenv (3) ou une commande similaire sans aucune protection pour garantir la sĂ»retĂ© en prĂ©sence de modifications simultanĂ©es.

Nous ne marquons pas ces fonctions comme MT-Unsafe nĂ©anmoins, car les fonctions qui modifient l’environnement sont toutes marquĂ©es const:env et considĂ©rĂ©es comme non sĂ»res. Étant non sĂ»res, ces derniĂšres ne doivent pas ĂȘtre appelĂ©es quand plusieurs threads sont en exĂ©cution ou lorsque les signaux asynchrones sont activĂ©s, et ainsi l’environnement peut ĂȘtre considĂ©rĂ© comme effectivement constant dans ces contextes, ce qui rend les premiĂšres fonctions sĂ»res.

hostid

Les fonctions marquĂ©es hostid en tant que problĂšme d’état MT-Safe lisent Ă  partir des structures de donnĂ©es communes Ă  tout le systĂšme qui contiennent « l’ID d’hĂŽte » de la machine. Ces structures de donnĂ©es ne peuvent pas en gĂ©nĂ©ral ĂȘtre modifiĂ©es automatiquement. Dans la mesure oĂč il est attendu que normalement « l’ID d’hĂŽte » ne change pas, la fonction qui lit Ă  partir d’elle ( gethostid (3)) est considĂ©rĂ©e comme sĂ»re, tandis que la fonction qui la modifie ( sethostid (3)) est marquĂ©e const:hostid , indiquant qu’elle requiert une attention particuliĂšre si elle doit ĂȘtre appelĂ©e. Dans ce cas particulier, cette attention particuliĂšre Ă©quivaut Ă  une coordination Ă  l’échelle de l’ensemble du systĂšme (pas seulement Ă  l’intĂ©rieur du processus).

sigintr

Les fonctions marquĂ©es sigintr en tant que problĂšme d’état MT-Safe accĂšdent Ă  la structure de donnĂ©es interne _sigintr de la bibliothĂšque GNU C sans aucune protection pour garantir la sĂ»retĂ© en prĂ©sence de modifications simultanĂ©es.

Nous ne marquons pas ces fonctions comme MT-Unsafe nĂ©anmoins, car les fonctions qui modifient cette structure de donnĂ©es sont toutes marquĂ©es const:sigintr et considĂ©rĂ©es comme non sĂ»res. Étant non sĂ»res, ces derniĂšres ne doivent pas ĂȘtre appelĂ©es quand plusieurs threads sont en exĂ©cution ou lorsque les signaux asynchrones sont activĂ©s, et ainsi l’environnement peut ĂȘtre considĂ©rĂ© comme effectivement constant dans ces contextes, ce qui rend les premiĂšres fonctions sĂ»res.

cwd

Les fonctions marquĂ©es cwd en tant que problĂšme d’état MT-Safe peuvent changer temporairement le rĂ©pertoire actif actuel durant leur exĂ©cution ce qui fait que les noms de chemin relatifs peuvent ĂȘtre rĂ©solus de façon inattendue dans les autres threads ou dans les gestionnaires de signal ou d’annulation asynchrones.

Ce n’est pas une raison suffisante pour marquer comme MT-Unsafe les fonctions ainsi marquĂ©es, mais quand ce comportement est optionnel (par exemple, nftw (3) avec FTW_CHDIR ), Ă©viter l’option peut ĂȘtre une bonne alternative Ă  l’utilisation des noms de chemin complets ou d’appels systĂšme relatifs au descripteur de fichier (par exemple, openat (2)).

:identifiant

Les annotations peuvent parfois ĂȘtre suivies par des identifiants destinĂ©s Ă  regrouper plusieurs fonctions qui, par exemple accĂšdent aux structures de donnĂ©es de façon non sĂ»re, comme dans race et const , ou pour fournir des informations plus spĂ©cifiques, comme le nom d’un signal dans une fonction marquĂ©e sig . Il est envisagĂ© que cela pourrait aussi ĂȘtre appliquĂ© Ă  l’avenir Ă  lock et corrupt .

Dans la plupart des cas, l’identifiant dĂ©signera un ensemble de fonctions, mais il peut dĂ©signer des objets globaux ou des paramĂštres de fonction, des propriĂ©tĂ©s identifiables ou des composants logiques qui leur sont associĂ©s, avec une notation du type, par exemple, :buf(param) pour dĂ©signer un tampon associĂ© au paramĂštre param , ou :tcattr(fd) pour dĂ©signer les attributs de terminal d’un descripteur de fichier fd .

L’utilisation la plus courante des identifiants est de fournir des groupes logiques de fonctions et de paramĂštres qui nĂ©cessitent d’ĂȘtre protĂ©gĂ©s par la mĂȘme primitive de synchronisation afin d’assurer une opĂ©ration sĂ»re dans un contexte donnĂ©.

/condition

Certaines annotations de sĂ»retĂ© peuvent ĂȘtre conditionnelles, dans le sens qu’elles ne s’appliquent que si une expression boolĂ©enne comprenant des paramĂštres, des variables globales ou mĂȘme le noyau sous-jacent est Ă©valuĂ©e vraie. Par exemple, /!ps et /one_per_line indiquent que le marqueur qui prĂ©cĂšde ne s’applique que si l’argument ps est NULL ou la variable globale one_per_line est diffĂ©rente de zĂ©ro.’

Quand toutes les marques qui rendent non sĂ»re une fonction sont agrĂ©mentĂ©es de conditions de ce type, et qu’aucune des conditions nommĂ©es ne tient, alors, la fonction peut ĂȘtre considĂ©rĂ©e comme sĂ»re.

VOIR AUSSI

pthreads (7), signal-safety (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .