Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       bzero, explicit_bzero - zeruje łańcuch bajtów

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <strings.h>

       void bzero(void s[.n], size_t n);

       #include <string.h>

       void explicit_bzero(void s[.n], size_t n);

OPIS

       Funkcja  bzero()  usuwa dane w n bajtach pamięci, zaczynając od położenia wskazanego przez
       s, zapisując do tego obszaru zera (bajty zawierające '\0').

       Funkcja explicit_bzero() wykonuje to samo zadanie co bzero(). Różni się od bzero() tym, że
       występuje  tu  gwarancja,  iż  operacja  usuwania  nie  zostanie  pominięta  ze względu na
       wydedukowanie przez optymalizacje kompilatora, że jest „niepotrzebna”.

WARTOŚĆ ZWRACANA

       Brak.

ATRYBUTY

       Informacje  o  pojęciach  używanych  w  tym  rozdziale   można   znaleźć   w   podręczniku
       attributes(7).

       ┌────────────────────────────────────────────────┬────────────────────────┬───────────────┐
       │InterfejsAtrybutWartość       │
       ├────────────────────────────────────────────────┼────────────────────────┼───────────────┤
       │bzero(), explicit_bzero()                       │ Bezpieczeństwo wątkowe │ MT-bezpieczne │
       └────────────────────────────────────────────────┴────────────────────────┴───────────────┘

STANDARDY

       Brak.

HISTORIA

       explicit_bzero()
              glibc 2.25.

              Funkcja  explicit_bzero()  jest  rozszerzeniem  niestandardowym,  obecnym również w
              niektórych  BSD.  Niektóre  inne  implementacje  posiadają  podobną   funkcję   np.
              memset_explicit() lub memset_s().

       bzero()
              4.3BSD.

              Oznaczone jako LEGACY (przestarzałe) w POSIX.1-2001. Usunięta w POSIX.1-2008.

UWAGI

       Funkcja  explicit_bzero()  odpowiada  na  problem,  na  który  mogą  natknąć się aplikacje
       zwracające  uwagę  na  bezpieczeństwo,  przy  używaniu  bzero():  jeśli  kompilator   może
       wywnioskować, że położenie, które ma zostać wyzerowane, nie będzie nigdy więcej osiągnięte
       przez program correct, może zupełnie usunąć wywołanie  bzero().  Jest  to  problemem,  gdy
       wywołanie  bzero() miało usunąć wrażliwe dane (np. hasła), aby zapobiec możliwości wycieku
       danych przez niepoprawny lub przełamany program. Wywołania do explicit_bzero()  nigdy  nie
       są optymalizowane przez kompilator.

       Funkcja explicit_bzero() nie rozwiązuje jednak wszystkich problemów związanych z usuwaniem
       wrażliwych danych:

       •  Funkcja explicit_bzero() nie  gwarantuje  całkowitego  usunięcia  wrażliwych  danych  z
          pamięci  (jest  to prawdziwe również w przypadku bzero()). Kopie wrażliwych danych mogą
          być na przykład przechowywane w rejestrze i w przestrzeniach „scratch”  stosu.  Funkcja
          explicit_bzero() nie jest świadoma ich istnienia i nie może ich usunąć.

       •  W  niektórych  okolicznościach,  explicit_bzero()  może pogorszyć bezpieczeństwo. Jeśli
          kompilator dojdzie  do  wniosku,  że  zmienna  przechowująca  wrażliwe  dane  może  być
          zoptymalizowana przez przechowanie w rejestrze (ponieważ jest na tyle mała, że może się
          zmieścić w rejestrze, a do pobrania adresu zmiennej nie jest  konieczne  operacja  inna
          niż  wywołanie  explicit_bzero()),  to  wywołanie  explicit_bzero()  wymusi skopiowanie
          danych z rejestru do położenia w RAM-ie,  które  jest  następnie  niezwłocznie  usuwane
          (natomiast kopia w rejestrze pozostaje nienaruszona). Problemem jest tu fakt, że dane w
          RAM-ie mogą być łatwiej odsłonięte przez błąd, niż dane w  rejestrze,  zatem  wywołanie
          explicit_bzero()  tworzy  krótkie okno czasowe, gdy wrażliwe dane są bardziej narażone,
          niż byłyby gdyby nie próbowano usunąć danych.

       Proszę  zauważyć,  że  deklarowanie  wrażliwych  zmiennych  kwalifikatorem  volatile   nie
       eliminuje  powyższych  problemów.  W rzeczywistości pogarsza je, ponieważ może na przykład
       wymusić sytuację, gdy zmienna, która  zostałaby  zoptymalizowana  do  rejestru,  będzie  w
       zamian utrzymywana w (bardziej narażonej) pamięci RAM, przez cały swój okres istnienia.

       Jednak  pomimo  powyższych  detali,  aplikacje  zwracające uwagę na bezpieczeństwo powinny
       raczej korzystać z explicit_bzero(), niż  tego  nie  robić.  Deweloperzy  explicit_bzero()
       spodziewają się, że przyszłe kompilatory będą rozpoznawały wywołania do explicit_bzero() i
       podejmą kroki, aby upewnić się, że wszystkie kopie wrażliwych danych zostały  usunięte,  w
       tym także kopie w rejestrze i w obszarach „scratch” stosu.

ZOBACZ TAKŻE

       bstring(3), memset(3), swab(3)

TŁUMACZENIE

       Autorami   polskiego   tłumaczenia   niniejszej   strony   podręcznika   są:  Adam  Byrtek
       <alpha@irc.pl>,  Andrzej   Krzysztofowicz   <ankry@green.mf.pg.gda.pl>,   Robert   Luberda
       <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją. Bliższe informacje o warunkach licencji
       można   uzyskać   zapoznając   się   z   GNU   General   Public   License   w   wersji   3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   lub   nowszej.   Nie  przyjmuje  się  ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej
       ⟨manpages-pl-list@lists.sourceforge.net⟩.