Strncpy

strncpy este o  funcție de bibliotecă standard în limbajul de programare C pentru a copia conținutul unui șir terminat cu nul într-un buffer de dimensiune limitată.

Funcția strncpyeste similară strcpycu protecția la depășire a tamponului , dar nu este complet sigură.

Funcția este acceptată de toate compilatoarele C.

Funcția

Prototipul descris în fișierul antet string.h:

char *strncpy (char *dst, const char *src, size_t len);

Funcția nu copiază mai mult de caractere (inclusiv caracterul nul) din șir srcîn buffer , fără a garanta că șirul se termină cu un caracter nul (dacă lungimea șirului este mai mare sau egală cu ). Dacă lungimea șirului este mai mică decât , atunci tamponul împinge până la caractere nule. dstlensrclensrclenlen

Valoarea returnată

Funcția returnează o valoare dst.

Exemplu de utilizare

#include <șir.h> #include <stdio.h> /* pentru printf() */ int main () { char * str = "model de șir" ; charbuf [ 10 ] = { 0 } ; // buffer mai mic decât șirul printf ( "șir: \" %s \"\n\n " , str ); printf ( "buffer înainte de copiere: \" %s \"\n " , buf ); strncpy ( buf , str , sizeof ( buf ) - 1 ); // len este cu 1 mai mică decât dimensiunea tamponului printf ( "buffer după copiere: \" %s \"\n " , buf ); returnează 0 ; }

Concluzie:

șir: „model șir” tampon înainte de copiere: "" tampon după copiere: „probă cu”

(șirul a fost trunchiat la dimensiunea bufferului în timpul copierii - 9 caractere + zero)

Securitate

Funcția strncpyeste concepută pentru a proteja programele de depășirea bufferului , dar ea însăși este, de asemenea, nesigură prin proiectare - funcția standard nu garantează setarea unui caracter nul la sfârșitul bufferului, care, atunci când încearcă să tipăriți o linie din buffer (sau lucrează cu el), poate duce la citirea datelor în afara bufferului, ceea ce va duce la prăbușirea programului, care poate fi folosit pentru a efectua un atac DoS în rețea .

Când lucrați corect cu funcția, trebuie să transmiteți funcției o valoare cu leno mai mică decât dimensiunea bufferului și, de asemenea, să setați singur ultimul octet la 0:

charbuf[BUFSIZE]; strncpy(buf, input, sizeof(buf) - 1); buf[dimensiunea(buf) - 1] = '\0';

Dezvoltatorii OpenBSD strncpyau creat o caracteristică non-standard pentru a o înlocui cu un strlcpyșir terminat nul. Pe sistemele care îl implementează, se recomandă să îl utilizați mai degrabă decât strncpy. Pe alte sisteme, este posibil să se realizeze o implementare casă a acestei funcții, din codul sursă distribuit sub licența BSD .

În plus strlcpy, rezolvă și problema performanței strncpy(vezi mai jos).

Problemă de performanță

Comportamentul standard strncpynu este optim - funcția umple întregul rest al [1] [2] buffer-ului cu zerouri de fiecare dată , ceea ce duce la un consum general al resursei procesorului atunci când tamponul este mare și când se lucrează cu șiruri scurte (un lucru comun situația în serverele de rețea).

Utilizarea în locul unei strncpyfuncții non-standard sau a unei funcții artizanale (cum, de exemplu, Apachestrlcpy a fost rescris la un moment dat [1] ), poate oferi o creștere semnificativă a performanței (o creștere de cinci ori a fost demonstrată la un test sintetic [2] ).

Link- uri externe

  • strncpy(1)  -  Descrierea funcției strncpype site-ul OpenBSD

Note

  1. implicațiile de performanță ale strncpy | Blogul lui Nathan . Data accesului: 17 octombrie 2014. Arhivat din original la 18 octombrie 2014.
  2. 5.4 Copiere și concatenare Arhivat din original pe 21 octombrie 2014. // Manual GNU Libc: „Folosirea strncpy .. poate face programul mult mai lent într-un caz comun: copierea unui șir care este probabil mic într-un buffer potențial mare. În acest caz, dimensiunea poate fi mare și, atunci când este, strncpy va pierde o cantitate considerabilă de timp copiend caractere nule."