attributes(7) Miscellaneous Information Manual attributes(7) NAZWA attributes - pojecia bezpieczenstwa POSIX OPIS Uwaga: tekst niniejszej strony podrecznika systemowego powstal w oparciu o material z rozdzialu ,,POSIX Safety Concepts" podrecznika biblioteki GNU C. Wiecej szczegolow na temat ponizszych tematow mozna znalezc tamze. Rozne strony podrecznika systemowego zawieraja rozdzial ATRYBUTY opisujacy bezpieczenstwa wywolywania funkcji w roznych sytuacjach. Niniejszy rozdzial opisuje funkcje z nastepujacymi oznaczeniami bezpieczenstwa: MT-bezpieczne Funkcje MT-bezpieczne, MT-Safe lub watkowo-bezpieczne mozna bezpiecznie wywolac w obecnosci innych watkow. Czastka MT w nazwie oznacza wielowatkowosc (ang. Multi Thread). Bycie MT-bezpieczna nie oznacza, ze funkcja jest niepodzielna, ani ze uzywa jakichs mechanizmow synchronizacji pamieci, udostepnianych przez POSIX uzytkownikom. Mozliwe jest nawet, ze wywolania kolejnych funkcji MT-bezpiecznych nie da w efekcie kombinacji MT-bezpiecznej. Przykladowo, jesli istnieje watek wywolujacy dwie funkcje MT-bezpieczne jedna po drugiej, nie gwarantuje to zachowania rownowaznego niepodzielnemu wykonaniu kombinacji obu funkcji, poniewaz wspolbiezne wywolania w roznych watkach moga ze soba oddzialywac w destrukcyjny sposob. Optymalizacje calych programow, ktore moga doprowadzic do wyodrebnienia funkcji jako podprogramu (funkcji otwartej) na przestrzeni interfejsow biblioteki, moga doprowadzic do niebezpiecznej zmiany kolejnosci, dlatego nie zaleca sie dokonywania takiego wyodrebniania na przestrzeni interfejsu biblioteki GNU C. Udokumentowany status MT-bezpieczny nie jest gwarantowany przy optymalizacji calych programow. Jednak funkcje zdefiniowane w widocznych dla uzytkownika naglowkach, sa zaprojektowane jako bezpieczne do wyodrebniania. MT-niebezpieczne Funkcje MT-niebezpieczne lub MT-Unsafe nie sa bezpieczne do wywolania w programach wielowatkowych. Inne slowa kluczowe pojawiajace sie w uwagach nt. bezpieczenstwa zdefiniowano w kolejnych rozdzialach. Funkcjonalnosci warunkowo bezpieczne Dla niektorych funkcjonalnosci czyniacych funkcje niebezpiecznymi do wywolania w pewnych sytuacjach, znane sa sposoby ominiecia klopotow z bezpieczenstwem, nie wymagajace calkowitej rezygnacji z ich wywolywania. Ponizsze slowa kluczowe odnosza sie do takich funkcjonalnosci i kazda z definicji wskazuje, jak nalezy ograniczyc caly program, aby uniknac problemu z bezpieczenstwem wskazanych danym slowem kluczowym. Jedynie po zaobserwowaniu i odniesieniu sie do powodow, ktore czynia funkcje niebezpieczna, za pomoca nalozenia udokumentowanych ograniczen, funkcja staje sie bezpieczna do wywolania w danym kontekscie. init Funkcje oznaczone jako init w kontekscie problemow bezpieczenstwa watkowego, przeprowadzaja przy pierwszym wywolaniu inicjalizacje, ktora jest MT-niebezpieczna. Wywolanie takiej funkcji przynajmniej raz w trybie pojedynczego watku, usuwa ten konkretny powod do uznania tej funkcji jako MT-niebezpiecznej. Jesli nie wystepuja inne powody, to funkcje mozna bezpiecznie wywolywac po uruchomieniu innych watkow. race Funkcje oznaczone jak race w kontekscie problemow bezpieczenstwa watkowego dzialaja na obiektach w sposob, ktory moze powodowac wyscig do danych lub inne formy destrukcyjnej interferencji przy wspolbieznym wykonaniu. W niektorych przypadkach te obiekty sa przekazywane do funkcji przez uzytkownikow; w innych sa one uzywane przez funkcje do zwrocenia wartosci uzytkownikom; w jeszcze innych nie sa nawet ujawniane uzytkownikom. const Funkcje oznaczone jako const w kontekscie problemow bezpieczenstwa watkowego, modyfikuja w sposob nieatomowy obiekty wewnetrzne, ktore moga byc raczej rozwazane jako stale, poniewaz znaczna czesc biblioteki GNU C korzysta z nich bez synchronizacji. W przeciwienstwie do race, ktore powoduje uznanie za MT-niebezpieczna zarowno odczytujacych jak i zapisujacych obiekty wewnetrzne, to oznaczenie odnosi sie wylacznie do zapisujacych. Zapisujacy pozostaja MT-niebezpieczni przy wywolaniu, lecz obowiazkowa pozniej stalosc obiektow, ktore modyfikuja, umozliwia uznanie odczytujacych za MT-bezpiecznych (o ile nie pozostaja inne powody do uznania ich za niebezpiecznych), poniewaz brak synchronizacji nie jest problemem, gdy obiekty sa faktycznie stale. Identyfikator, ktory wystepuje po oznaczeniu const pojawi sie jako adnotacja bezpieczenstwa przy odczytujacych. Programy, ktore chca przeciwdzialac temu problemowi bezpieczenstwa, jednak tak aby moc wywolac zapisujacych, moga uzyc nierekurencyjnej blokady odczytu i zapisu powiazanej z identyfikatorem i chronic wszystkie wywolania do funkcji oznaczonej jako const, po ktorej nastepuje identyfikator blokady zapisu oraz wszystkie wywolania do funkcji oznaczonej samym identyfikatorem za pomoca blokady odczytu. sig Funkcje oznaczone jako sig w kontekscie problemow bezpieczenstwa watkowego moga tymczasowo instalowac procedure obslugi sygnalu do celow wewnetrznych, ktora moze interferowac z innymi uzyciami sygnalu, wymienionymi po dwukropku. Temu problemowi bezpieczenstwa mozna przeciwdzialac, upewniajac sie, ze w trakcie wywolania nie dojdzie do innego uzycia sygnalu. Zalecane jest: utrzymywanie nierekurencyjnej blokady mutex (wzajemnego wykluczania) podczas wywolywania wszystkich funkcji uzywajacych tego samego sygnalu tymczasowego; blokowanie tego sygnalu przed wywolaniem i pozniejsze resetowanie jego procedury obslugi. term Funkcje oznaczone jako term w kontekscie problemow bezpieczenstwa watkowego moga zmieniac ustawienia terminala w zalecany sposob, glownie: wywolywac tcgetattr(3), modyfikowac niektore znaczniki (flagi) i pozniej wywolywac tcsetattr(3), co otwiera okno, w ktorym zmiany wykonane przez inne watki sa tracone. Z tego wzgledu funkcje oznaczone jako term sa MT-niebezpieczne. Zaleca sie dlatego aplikacjom uzywajacym terminala unikac rownoczesnej i wielobieznej interakcji z terminalem, nie uzywajac mogacych sie tak zachowywac procedur obslugi sygnalu lub sygnalow blokujacych i utrzymywac blokade przy ponownym wywolywaniu tych funkcji i interakcji z terminalem. Blokady tej powinno sie uzywac rowniez do wzajemnego wykluczania w przypadku funkcji oznaczonych jako race:tcattr(fd), gdzie fd jest deskryptorem pliku kontrolujacego terminala. Wywolujacy moze uzyc nastepujacych blokad wzajemnego wykluczania (mutex): pojedynczej (dla ulatwienia) albo po jednej na terminal, nawet gdy sa one opisane roznymi deskryptorami pliku. Dodatkowe uwagi dotyczace bezpieczenstwa Do funkcji moga byc dolaczone dodatkowe slowa kluczowe wskazujace funkcjonalnosci, ktore co prawda nie czynia funkcji niebezpiecznej do wywolania, ale powinny byc wziete pod uwage w okreslonych klasach programow: locale Funkcje z adnotacja locale w kontekscie problemow bezpieczenstwa watkowego odczytuja z obiektu locale (tlumaczenia) bez jakiejkolwiek formy synchronizacji. Funkcje z adnotacja locale wywolywane rownolegle ze zmiana locale moga zachowywac sie w sposob nieodnoszacy sie do zadnych z aktywnych locale podczas ich wykonania, lecz z nieprzewidywalna ich mieszanka. Funkcje te nie sa jednak oznaczane jako MT-niebezpieczne. To funkcje modyfikujace obiekt locale sa oznaczane uwaga const:locale i sa uwazane za niebezpieczne. Z tego powodu, funkcje modyfikujace nie powinny byc wywolywane, gdy dziala kilka watkow lub wlaczone sa sygnaly asynchroniczne. W tych kontekstach locale moga byc rozwazane jako efektywnie stale, co czyni omawiane w powyzszym akapicie funkcje bezpiecznymi. env Funkcje oznaczone jako env w kontekscie problemow bezpieczenstwa watkowego uzyskuja dostep do srodowiska za pomoca getenv(3) lub podobnego, bez zadnej ochrony zapewniajacej bezpieczenstwo w obecnosci rownoleglych modyfikacji. Funkcje te nie sa jednak oznaczane jako MT-niebezpieczne. To funkcje modyfikujace srodowisko sa oznaczane uwaga const:env i sa uwazane za niebezpieczne. Z tego powodu, funkcje modyfikujace nie powinny byc wywolywane, gdy dziala kilka watkow lub wlaczone sa sygnaly asynchroniczne. W tych kontekstach srodowisko moze byc rozwazane jako efektywnie stale, co czyni omawiane w powyzszym akapicie funkcje bezpiecznymi. hostid Funkcje oznaczone jako hostid w kontekscie problemow bezpieczenstwa watkowego odczytuja z systemowych struktur danych identyfikator stacji (,,host id"). Te struktury danych zwykle nie moga byc modyfikowane w sposob niepodzielny. Ze wzgledu na zalozenie, ze identyfikator stacji nie powinien sie zmieniac, funkcje odczytujace go (gethostid(3)) sa uwazane za bezpieczne, natomiast funkcje go modyfikujace (sethostid(3)) sa oznaczane jako const:hostid wskazujac, ze ich wywolanie moze wymagac szczegolnej uwagi. W tym konkretnym przypadku, szczegolna uwage nalezy zwrocic na koordynacje na poziomie systemu (a nie jedynie wewnatrzprocesowa). sigintr Funkcje oznaczone jako sigintr w kontekscie problemow bezpieczenstwa watkowego uzyskuja dostep do wewnetrznej struktury danych _sigintr biblioteki GNU C, bez zadnej ochrony zapewniajacej bezpieczenstwo w momencie rownoleglej modyfikacji. Funkcje te nie sa jednak oznaczane jako MT-niebezpieczne. To funkcje modyfikujace struktury danych sa oznaczane uwaga const:sigintr i sa uwazane za niebezpieczne. Z tego powodu, funkcje modyfikujace nie powinny byc wywolywane, gdy dziala kilka watkow lub wlaczone sa sygnaly asynchroniczne. W tych kontekstach struktury danych moga byc rozwazane jako efektywnie stale, co czyni omawiane w powyzszym akapicie funkcje bezpiecznymi. cwd Funkcje oznaczone jako cwd w kontekscie problemow bezpieczenstwa watkowego moga tymczasowo zmieniac biezacy katalog roboczy podczas wykonania, co moze spowodowac ustalanie sciezek wzglednych w sposob nieoczekiwany dla innych watkow lub przy procedurach obslugi odwolywania lub asynchronicznych sygnalach. Nie jest to wystarczajacy powod do oznaczania funkcji z taka adnotacja jako MT-niebezpiecznej, lecz gdy zachowanie to jest opcjonalne (np. nftw(3) z FTW_CHDIR), unikanie takiej opcji moze byc dobra alternatywa do uzywania pelnych sciezek lub wywolan systemowych odnoszacych sie do deskryptorow pliku (np. openat(2)). :identyfikator Po adnotacjach moze czasem wystapic identyfikator, ktory ma pogrupowac funkcje, ktore np. uzyskuja dostep do struktur danych w niebezpieczny sposob, jak w przypadku race i const lub udostepniac szczegolowe informacje, takie jak nazwa sygnalu w funkcji oznaczonej jako sig. Przewiduje sie, ze moze to w przyszlosci dotyczyc rowniez lock i corrupt. W wiekszosci przypadku identyfikator wymieni zestaw funkcji, ale czasami moze nazwac obiekty globalne, argumenty funkcji lub powiazane z nimi identyfikowalne wlasciwosci lub fragmenty logiczne. Stosowania notacja to np. :buf(arg) aby wskazac bufor powiazany z argumentem arg lub :tcattr(fd) aby wskazac atrybuty terminala deskryptora pliku fd. Najczestszym zastosowanie identyfikatorow jest udostepnienie logicznych grup funkcji i argumentow, ktore musza byc chronione przez te same mechanizmy synchronizacji, aby zapewnic bezpieczne operowanie w danym kontekscie. /warunek Czesc uwag bezpieczenstwa moze byc warunkowa co oznacza, ze maja zastosowanie tylko gdy prawdziwe jest wyrazenie warunkowe dotyczace argumentow, zmiennych globalnych albo nawet wartosci jadra. Na przyklad /!ps i /one_per_line wskazuja, ze wczesniejsza uwaga ma zastosowanie tylko, gdy argumentem ps jest NULL, albo zmienna globalna one_per_line jest niezerowa. Jesli wszystkie uwagi czyniace funkcje niebezpieczna sa opatrzone takimi warunkami i zaden z wskazanych warunkow nie jest spelniony, to funkcja moze byc uwazana za bezpieczna. ZOBACZ TAKZE pthreads(7), signal-safety(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 1 listopada 2023 r. attributes(7)