• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed problem z strncpy_s()

Aruba Cloud - Virtual Private Server VPS
0 głosów
314 wizyt
pytanie zadane 9 sierpnia 2019 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
zamknięte 9 sierpnia 2019 przez enigmatycznyclay

Witam. Nie do końca rozumiem jedną kwestię dotyczącą funkcji strncpy_s(). Dlaczego 4 argument musi być mniejszy od 2. Dla przykładu taki testowy kod:

char x[] = "aaa";
strncpy_s(x, strlen(x), "bbbbbbbbbbbbbbbbbb", strlen(x));
std::cout << x;

Na pierwszy rzut oka powiedziałbym, że skoro określiłem rozmiar bufora jako 3 i ilość skopiowanych znaków jako 3 to funkcja powinna zadziałać poprawnie. strncpy_s nie wykroczy poza zakres łańcucha ani nawet nie zastąpi ostatniego znaku jakim jest NULL. A jednak program crashuje z powodu "zbyt małego buffora". Zrozumiałbym, gdyby sama funkcja z jakiegoś powodu dla bezpieczeństwa nie pozwalałaby określać rozmiaru buffora na mniejszy niż ilość kopiowanych do niego znaków, ale kompilator nawet nie daje ostrzeżeń. Bardzo nie lubię wykorzystywać rzeczy których nie rozumiem w 100%. Z góry dziękuje za wytłumaczenie.

komentarz zamknięcia: wyjaśnione
komentarz 9 sierpnia 2019 przez adrian17 Mentor (352,580 p.)
nie chodzi aby o to, że strncpy dopisuje jeszcze null terminator, więc tak naprawdę potrzebny bufor jest o 1 większy niż kopiowany string?
komentarz 9 sierpnia 2019 przez DragonCoder Nałogowiec (36,500 p.)

Notes

As corrected by the post-C11 DR 468, strncpy_s, unlike strcpy_s, is only allowed to clobber the remainder of the destination array if an error occurs.

Unlike strncpy, strncpy_s does not pad the destination array with zeroes, This is a common source of errors when converting existing code to the bounds-checked version.

Although truncation to fit the destination buffer is a security risk and therefore a runtime constraints violation for strncpy_s, it is possible to get the truncating behavior by specifying count equal to the size of the destination array minus one: it will copy the first count bytes and append the null terminator as always:

 

 strncpy_s(dst, sizeof dst, src, (sizeof dst)-1);

komentarz 9 sierpnia 2019 przez adrian17 Mentor (352,580 p.)

strncpy_s does not pad the destination array with zeroes

nie to mam na myśli.

https://en.cppreference.com/w/c/string/byte/strncpy

it stops after writing the terminating null character (if there was no null in the source, it writes one at dest[count]

komentarz 9 sierpnia 2019 przez enigmatycznyclay Bywalec (2,450 p.)

it stops after writing the terminating null character (if there was no null in the source, it writes one at dest[count]

z tego wynikałoby, że strncpy_s użyje "bbb"do wypełnienia łańcucha i jeżeli nie było nulla umieści go w x[3] czyli zaraz po "bbb" uzyskując "bbb\0" czyli to co powinno być więc w tym cytacie nie widzę wytłumaczenia tego błędu chyba, że nie rozumiem czegoś.

komentarz 9 sierpnia 2019 przez enigmatycznyclay Bywalec (2,450 p.)
Jeśli chodzi o fragment "notes" z cpprefference to jeśli mam być szczery nie jest to najprostszy do przetłumaczenia fragment z jakim się spotkałem i nie każde słowo rozumiem(jak np clobber), a nie mam jeszcze zbyt dużego doświadczenia w takim specjalistycznym angielskim dlatego spytałem tutaj. Rozumiem jednak, że należy pamiętać dla bezpieczeństwa, aby count było mniejsze od rozmiaru buffora i po prostu się do tego zastosuję. Mimo wszystko gdyby ktoś miał jednak ochotę bardziej "idiotoprzychylnie" to wytłumaczyć to nie pogardzę :) .
komentarz 9 sierpnia 2019 przez adrian17 Mentor (352,580 p.)
(wydaje mi się, że ta notka z clobberem była bardziej dla mnie? :) )

W każdym razie, tak, wystarczy pamiętać żeby bufor mógł pomieścić docelowy string plus null terminator.

Podobne pytania

0 głosów
2 odpowiedzi 216 wizyt
0 głosów
2 odpowiedzi 1,066 wizyt
pytanie zadane 9 lutego 2017 w C i C++ przez robRoy Użytkownik (970 p.)
+1 głos
0 odpowiedzi 691 wizyt

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,653 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...