attributes(7)

Från Wiki.linux.se
Version från den 25 november 2024 kl. 08.41 av Admin (diskussion | bidrag) (→‎Sidor som hänvisar till denna sida)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

attributes(7) – Diverse informationsmanual

NAMN

attributes – POSIX säkerhetskoncept

BESKRIVNING

Observera: Texten i denna man-sida är baserad på material hämtat från avsnittet "POSIX Safety Concepts" i GNU C Library-manualen. Ytterligare detaljer om de ämnen som beskrivs här kan hittas i den manualen.

Olika funktionsmanualsidor inkluderar en sektion ATTRIBUTES som beskriver säkerheten vid anrop av funktionen i olika sammanhang. Denna sektion annoterar funktioner med följande säkerhetsmarkeringar:

MT-Safe

MT-Safe eller trådsäkra funktioner är säkra att anropa i närvaro av andra trådar. MT i MT-Safe står för Multi Thread.

Att vara MT-Safe innebär dock inte att en funktion är atomär, eller att den använder någon av de minnessynkroniseringsmekanismer som POSIX exponerar för användare. Det är till och med möjligt att anrop av MT-Safe-funktioner i följd inte ger en MT-Safe kombination. Till exempel garanterar inte att en tråd anropar två MT-Safe-funktioner direkt efter varandra ett beteende som motsvarar atomär exekvering av kombinationen av båda funktionerna, eftersom samtidiga anrop i andra trådar kan störa på ett destruktivt sätt.

Helprogramoptimeringar som kan inlinera funktioner över biblioteksgränssnitt kan exponera osäker omordning, och därför rekommenderas inte inlining över GNU C Library-gränssnittet. Den dokumenterade MT-Safety-statusen garanteras inte under helprogramoptimering. Dock är funktioner definierade i användar-synliga headers designade att vara säkra för inlining.

MT-Unsafe

MT-Unsafe-funktioner är inte säkra att anropa i multitrådade program.

Andra nyckelord som förekommer i säkerhetsanmärkningar definieras i följande sektioner.

Villkorligt säkra funktioner

För vissa funktioner som gör funktioner osäkra att anropa i vissa sammanhang finns det kända sätt att undvika säkerhetsproblemet annat än att helt avstå från att anropa funktionen. De följande nyckelorden refererar till sådana funktioner, och var och en av deras definitioner indikerar hur hela programmet behöver begränsas för att eliminera säkerhetsproblemet som indikeras av nyckelordet. Endast när alla skäl som gör en funktion osäker är observerade och åtgärdade, genom att tillämpa de dokumenterade begränsningarna, blir funktionen säker att anropa i ett sammanhang.

init

Funktioner märkta med init som en MT-Unsafe-egenskap utför osäker initialisering när de anropas första gången.

Att anropa en sådan funktion minst en gång i enkeltrådigt läge tar bort denna specifika orsak för att funktionen ska betraktas som MT-Unsafe. Om ingen annan orsak kvarstår kan funktionen därefter säkert anropas efter att andra trådar har startats.

race

Funktioner annoterade med race som ett MT-Safety-problem opererar på objekt på sätt som kan orsaka data-kapplöpningar eller liknande former av destruktiv interferens vid samtidig exekvering. I vissa fall skickas objekten till funktionerna av användare; i andra används de av funktionerna för att returnera värden till användare; i ytterligare andra exponeras de inte ens för användare.

const

Funktioner märkta med const som ett MT-Safety-problem modifierar icke-atomärt interna objekt som bättre betraktas som konstanta, eftersom en stor del av GNU C Library får åtkomst till dem utan synkronisering. Till skillnad från race, som gör både läsare och skribenter av interna objekt osäkra, tillämpas denna markering endast på skribenter. Skribenter förblir MT-Unsafe att anropa, men objektens då obligatoriska konstanthet som de modifierar möjliggör att läsare betraktas som MT-Safe (så länge inga andra skäl för osäkerhet kvarstår), eftersom avsaknaden av synkronisering inte är ett problem när objekten är i praktiken konstanta.

Identifikatorn som följer efter const kommer att visas ensam som en säkerhetsanmärkning i läsare. Program som vill arbeta runt detta säkerhetsproblem, för att kunna anropa skribenter, kan använda ett icke-rekursivt läs-skriv-lås associerat med identifikatorn, och skydda alla anrop till funktioner märkta med const följt av identifikatorn med ett skrivlås, och alla anrop till funktioner märkta med identifikatorn ensam med ett läslås.

sig

Funktioner märkta med sig som ett MT-Safety-problem kan temporärt installera en signalhanterare för interna ändamål, vilket kan störa andra användningar av signalen, identifierad efter ett kolon.

Detta säkerhetsproblem kan undvikas genom att säkerställa att inga andra användningar av signalen kommer att äga rum under samtalet. Att hålla ett icke-rekursivt mutexlås medan man anropar alla funktioner som använder samma temporära signal; att blockera den signalen före anropet och återställa dess hanterare efteråt rekommenderas.

term

Funktioner märkta med term som ett MT-Safety-problem kan ändra terminalinställningarna på det rekommenderade sättet, nämligen: anropa tcgetattr(3), modifiera vissa flaggor, och sedan anropa tcsetattr(3). Detta skapar ett fönster där ändringar gjorda av andra trådar går förlorade. Således är funktioner märkta med term MT-Unsafe.

Det är därför tillrådligt för applikationer som använder terminalen att undvika samtidiga och reentranta interaktioner med den, genom att inte använda den i signalhanterare eller blockera signaler som kan använda den, och hålla ett lås medan man anropar dessa funktioner och interagerar med terminalen. Detta lås bör också användas för ömsesidig uteslutning med funktioner märkta med race:tcattr(fd), där fd är en filbeskrivare för den styrande terminalen. Anroparen kan använda en enda mutex för enkelhetens skull, eller använda en mutex per terminal, även om de refereras till av olika filbeskrivare.

Andra säkerhetsanmärkningar

Ytterligare nyckelord kan bifogas funktioner, vilket indikerar funktioner som inte gör en funktion osäker att anropa, men som kan behöva beaktas i vissa programklasser:

locale

Funktioner annoterade med locale som ett MT-Safety-problem läser från lokalobjektet utan någon form av synkronisering. Funktioner annoterade med locale som anropas samtidigt med lokala ändringar kan bete sig på sätt som inte motsvarar någon av de lokaler som är aktiva under deras exekvering, utan en oförutsägbar blandning av dem.

Vi markerar inte dessa funktioner som MT-Unsafe, eftersom funktioner som modifierar lokalobjektet är märkta med const:locale och betraktas som osäkra. Eftersom de är osäkra ska de senare inte anropas när flera trådar körs eller asynkrona signaler är aktiverade, och därför kan lokalen betraktas som i praktiken konstant i dessa sammanhang, vilket gör de tidigare säkra.

env

Funktioner märkta med env som ett MT-Safety-problem får åtkomst till miljön med getenv(3) eller liknande, utan några skydd för att säkerställa säkerhet i närvaro av samtidiga modifieringar.

Vi markerar inte dessa funktioner som MT-Unsafe, eftersom funktioner som modifierar miljön alla är märkta med const:env och betraktas som osäkra. Eftersom de är osäkra ska de senare inte anropas när flera trådar körs eller asynkrona signaler är aktiverade, och därför kan miljön betraktas som i praktiken konstant i dessa sammanhang, vilket gör de tidigare säkra.

hostid

Funktionen märkt med hostid som ett MT-Safety-problem läser från systemövergripande datastrukturer som håller maskinens "host ID". Dessa datastrukturer kan generellt inte modifieras atomärt. Eftersom det förväntas att "host ID" normalt inte kommer att ändras, betraktas funktionen som läser från den (gethostid(3)) som säker, medan funktionen som modifierar den (sethostid(3)) är märkt med const:hostid, vilket indikerar att den kan kräva särskild omsorg om den ska anropas. I detta specifika fall motsvarar den särskilda omsorgen systemövergripande (inte bara inom process) koordination.

sigintr

Funktioner märkta med sigintr som ett MT-Safety-problem får åtkomst till GNU C Librarys interna datastruktur _sigintr utan några skydd för att säkerställa säkerhet i närvaro av samtidiga modifieringar.

Vi markerar inte dessa funktioner som MT-Unsafe, eftersom funktioner som modifierar denna datastruktur alla är märkta med const:sigintr och betraktas som osäkra. Eftersom de är osäkra ska de senare inte anropas när flera trådar körs eller asynkrona signaler är aktiverade, och därför kan datastrukturen betraktas som i praktiken konstant i dessa sammanhang, vilket gör de tidigare säkra.

cwd

Funktioner märkta med cwd som ett MT-Safety-problem kan temporärt ändra den aktuella arbetskatalogen under sin exekvering, vilket kan orsaka att relativa sökvägar löses på oväntade sätt i andra trådar eller inom asynkrona signal- eller avbrythanterare.

Detta är inte tillräckligt för att markera så märkta funktioner som MT-Unsafe, men när detta beteende är valfritt (t.ex. nftw(3) med FTW_CHDIR), kan det vara ett bra alternativ att undvika alternativet istället för att använda fullständiga sökvägar eller filbeskrivare-relativa (t.ex. openat(2)) systemanrop.

:identifier

Annoteringar kan ibland följas av identifikatorer, avsedda att gruppera flera funktioner som, till exempel, får åtkomst till datastrukturer på ett osäkert sätt, som i race och const, eller för att ge mer specifik information, såsom att namnge en signal i en funktion märkt med sig. Det förutses att det kan tillämpas på lock och corrupt också i framtiden.

I de flesta fall kommer identifikatorn att namnge en uppsättning funktioner, men den kan namnge globala objekt eller funktionsargument, eller identifierbara egenskaper eller logiska komponenter associerade med dem, med en notation som, till exempel, :buf(arg) för att beteckna en buffer associerad med argumentet arg, eller :tcattr(fd) för att beteckna terminalattributen för en filbeskrivare fd.

Den vanligaste användningen för identifikatorer är att tillhandahålla logiska grupper av funktioner och argument som behöver skyddas av samma synkroniseringsprimitive för att säkerställa säker drift i ett givet sammanhang.

/villkor

Vissa säkerhetsannoteringar kan vara villkorliga, i den meningen att de endast gäller om ett booleskt uttryck som involverar argument, globala variabler eller till och med den underliggande kärnan utvärderas till sant. Till exempel, /!ps och /one_per_line indikerar att den föregående markören endast gäller när argumentet ps är NULL, eller den globala variabeln one_per_line är nollskild.

När alla markeringar som gör en funktion osäker är prydda med sådana villkor, och inget av de nämnda villkoren gäller, kan funktionen betraktas som säker.

SE ÄVEN

COLOFON

Denna sida är en del av man-sidorna (dokumentation för Linux-kärnan och C-bibliotekets användargränssnitt) projekt. Information om projektet finns på man-pages-projektet. Om du har en felrapport för denna man-sida, se CONTRIBUTING. Denna sida erhölls från tarballen man-pages-6.9.1.tar.gz hämtad från [1] den 2024-06-26. Om du upptäcker några återgivningsproblem i denna HTML-version av sidan, eller du tror att det finns en bättre eller mer uppdaterad källa för sidan, eller du har korrigeringar eller förbättringar av informationen i denna COLOFON (som inte är en del av den ursprungliga man-sidan), skicka ett mail till man-pages@man7.org.

Linux man-sidor 6.9.1   2024-05-02   attributes(7)

Sidor som hänvisar till denna sida

adjtimex(2), clock_getres(2), eventfd(2), getrlimit(2), getrusage(2), mmap(2), sigaltstack(2), utimensat(2), a64l(3), abort(3), abs(3), acos(3), acosh(3), addseverity(3), adjtime(3), aio_cancel(3), aio_error(3), aio_fsync(3), aio_read(3), aio_return(3), aio_suspend(3), aio_write(3), alloca(3), arc4random(3), argz_add(3), asin(3), asinh(3), asprintf(3), assert(3), assert_perror(3), atan2(3), atan(3), atanh(3), atexit(3), atof(3), atoi(3), backtrace(3), basename(3), bcopy(3), bindresvport(3), bsd_signal(3), bsearch(3), btowc(3), byteorder(3), bzero(3), cabs(3), cacos(3), cacosh(3), canonicalize_file_name(3), carg(3), casin(3), casinh(3), catan(3), catanh(3), catgets(3), catopen(3), cbrt(3), ccos(3), ceil(3), cexp(3), cfree(3), cimag(3), clearenv(3), clock(3), clock_getcpuclockid(3), clog10(3), clog(3), closedir(3), confstr(3), conj(3), copysign(3), cos(3), cosh(3), cpow(3), cproj(3), creal(3), crypt(3), csin(3), csinh(3), csqrt(3), ctan(3), ctanh(3), ctermid(3), ctime(3), daemon(3), des_crypt(3), difftime(3), dirfd(3), div(3), dladdr(3), dlerror(3), dlinfo(3), dl_iterate_phdr(3), dlopen(3), dlsym(3), drand48(3), drand48_r(3), dysize(3), ecvt(3), ecvt_r(3), encrypt(3), envz_add(3), erf(3), erfc(3), err(3), error(3), ether_aton(3), euidaccess(3), exec(3), exit(3), exp10(3), exp2(3), exp(3), expm1(3), fabs(3), fclose(3), fcloseall(3), fdim(3), fenv(3), ferror(3), fexecve(3), fflush(3), ffs(3), fgetc(3), fgetgrent(3), fgetpwent(3), fgetwc(3), fgetws(3), fileno(3), finite(3), flockfile(3), floor(3), fma(3), fmax(3), fmemopen(3), fmin(3), fmod(3), fmtmsg(3), fnmatch(3), fopen(3), fopencookie(3), fpathconf(3), fpclassify(3), fpurge(3), fputwc(3), fputws(3), fread(3), frexp(3), fseek(3), fseeko(3), ftime(3), ftok(3), fts(3), ftw(3), futimes(3), gamma(3), gcvt(3), getaddrinfo(3), getaddrinfo_a(3), getauxval(3), getcontext(3), getcwd(3), getdate(3), getdirentries(3), getdtablesize(3), getenv(3), getfsent(3), getgrent(3), getgrent_r(3), getgrnam(3), getgrouplist(3), gethostbyname(3), gethostid(3), getifaddrs(3), getline(3), getloadavg(3), getlogin(3), getmntent(3), getnameinfo(3), getnetent(3), getnetent_r(3), get_nprocs(3), getopt(3), getpass(3), getprotoent(3), getprotoent_r(3), getpt(3), getpw(3), getpwent(3), getpwent_r(3), getpwnam(3), getrpcent(3), getrpcent_r(3), getrpcport(3), gets(3), getservent(3), getservent_r(3), getspnam(3), getsubopt(3), getttyent(3), getusershell(3), getutent(3), getutmp(3), getw(3), getwchar(3), glob(3), gnu_get_libc_version(3), grantpt(3), gsignal(3), hsearch(3), hypot(3), iconv(3), iconv_close(3), iconv_open(3), if_nameindex(3), if_nametoindex(3), ilogb(3), inet(3), inet_ntop(3), inet_pton(3), initgroups(3), insque(3), isalpha(3), isatty(3), isgreater(3), iswalnum(3), iswalpha(3), iswblank(3), iswcntrl(3), iswctype(3), iswdigit(3), iswgraph(3), iswlower(3), iswprint(3), iswpunct(3), iswspace(3), iswupper(3), iswxdigit(3), j0(3), key_setsecret(3), ldexp(3), lio_listio(3), localeconv(3), lockf(3), log10(3), log1p(3), log2(3), log(3), logb(3), login(3), lrint(3), lround(3), lsearch(3), lseek64(3), makecontext(3), makedev(3), mallinfo(3), malloc(3), malloc_get_state(3), malloc_info(3), malloc_stats(3), malloc_trim(3), malloc_usable_size(3), matherr(3), mblen(3), mbrlen(3), mbrtowc(3), mbsinit(3), mbsnrtowcs(3), mbsrtowcs(3), mbstowcs(3), mbtowc(3), mcheck(3), memccpy(3), memchr(3), memcmp(3), memcpy(3), memfrob(3), memmem(3), memmove(3), mempcpy(3), memset(3), mkdtemp(3), mkfifo(3), mkstemp(3), mktemp(3), modf(3), mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), mtrace(3), nan(3), nextafter(3), nextup(3), nl_langinfo(3), ntp_gettime(3), on_exit(3), opendir(3), open_memstream(3), openpty(3), perror(3), popen(3), posix_fallocate(3), posix_memalign(3), posix_openpt(3), pow10(3), pow(3), __ppc_set_ppr_med(3), __ppc_yield(3), printf(3), profil(3), psignal(3), pthread_attr_init(3), pthread_attr_setaffinity_np(3), pthread_attr_setdetachstate(3), pthread_attr_setguardsize(3), pthread_attr_setinheritsched(3), pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3), pthread_attr_setscope(3), pthread_attr_setsigmask_np(3), pthread_attr_setstack(3), pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3), pthread_cancel(3), pthread_cleanup_push(3), pthread_create(3), pthread_detach(3), pthread_equal(3), pthread_exit(3), pthread_getattr_default_np(3), pthread_getattr_np(3), pthread_getcpuclockid(3), pthread_join(3), pthread_kill(3), pthread_kill_other_threads_np(3), pthread_self(3), pthread_setaffinity_np(3), pthread_setcancelstate(3), pthread_setconcurrency(3), pthread_setname_np(3), pthread_setschedparam(3), pthread_setschedprio(3), pthread_sigmask(3), pthread_sigqueue(3), pthread_testcancel(3), pthread_tryjoin_np(3), pthread_yield(3), ptsname(3), putenv(3), putgrent(3), putpwent(3), puts(3), putwchar(3), qecvt(3), qsort(3), raise(3), rand(3), random(3), random_r(3), rcmd(3), readdir(3), readdir_r(3), realpath(3), re_comp(3), regex(3), remainder(3), remove(3), remquo(3), resolver(3), rewinddir(3), rexec(3), rint(3), round(3), rpc(3), rpmatch(3), rtime(3), scalb(3), scalbln(3), scandir(3), scanf(3), sched_getcpu(3), seekdir(3), sem_close(3), sem_destroy(3), sem_getvalue(3), sem_init(3), sem_open(3), sem_post(3), sem_unlink(3), sem_wait(3), setaliasent(3), setbuf(3), setenv(3), setjmp(3), setlocale(3), setlogmask(3), setnetgrent(3), shm_open(3), siginterrupt(3), signbit(3), significand(3), sigpause(3), sigqueue(3), sigset(3), sigsetops(3), sigvec(3), sigwait(3), sin(3), sincos(3), sinh(3), sleep(3), sockatmark(3), sqrt(3), sscanf(3), statvfs(3), stdarg(3), stdio_ext(3), stpncpy(3), strcasecmp(3), strchr(3), strcmp(3), strcoll(3), strcpy(3), strdup(3), strerror(3), strfmon(3), strfromd(3), strfry(3), strftime(3), strlen(3), strncat(3), strnlen(3), strpbrk(3), strptime(3), strsep(3), strsignal(3), strspn(3), strstr(3), strtod(3), strtoimax(3), strtok(3), strtol(3), strtoul(3), strverscmp(3), strxfrm(3), swab(3), sysconf(3), syslog(3), system(3), sysv_signal(3), tan(3), tanh(3), tcgetpgrp(3), tcgetsid(3), telldir(3), tempnam(3), termios(3), tgamma(3), timegm(3), tmpfile(3), tmpnam(3), toascii(3), toupper(3), towctrans(3), towlower(3), towupper(3), trunc(3), tsearch(3), ttyname(3), ttyslot(3), tzset(3), ualarm(3), ulimit(3), ungetwc(3), unlocked_stdio(3), unlockpt(3), updwtmp(3), usleep(3), wcpcpy(3), wcpncpy(3), wcrtomb(3), wcscasecmp(3), wcscat(3), wcschr(3), wcscmp(3), wcscpy(3), wcscspn(3), wcsdup(3), wcslen(3), wcsncasecmp(3), wcsncat(3), wcsncmp(3), wcsncpy(3), wcsnlen(3), wcsnrtombs(3), wcspbrk(3), wcsrchr(3), wcsrtombs(3), wcsspn(3), wcsstr(3), wcstoimax(3), wcstok(3), wcstombs(3), wcswidth(3), wctob(3), wctomb(3), wctrans(3), wctype(3), wcwidth(3), wmemchr(3), wmemcmp(3), wmemcpy(3), wmemmove(3), wmemset(3), wordexp(3), wprintf(3), xcrypt(3), xdr(3), y0(3), man-pages(7), pthreads(7), standards(7)

Sidslut

Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man7/attributes.7.html


Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp som har sponsrat Linux.se med webbhotell.