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.
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
Funcția returnează o valoare dst.
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)
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).
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] ).