• 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()

Object Storage Arubacloud
0 głosów
240 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 Ekspert (344,860 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 Ekspert (344,860 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 Ekspert (344,860 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 169 wizyt
0 głosów
2 odpowiedzi 790 wizyt
pytanie zadane 9 lutego 2017 w C i C++ przez robRoy Użytkownik (970 p.)
+1 głos
0 odpowiedzi 520 wizyt

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...