strncpy er en C -programmeringssprog- standardbiblioteksfunktion til at kopiere indholdet af en null-termineret streng til en buffer af begrænset størrelse.
Funktionen strncpyligner bufferoverløbsbeskyttelsestrcpy , men den er ikke helt sikker.
Funktionen understøttes af alle C -kompilere .
Prototypen beskrevet i header-filen string.h:
char *strncpy (char *dst, const char *src, size_t len);
Funktionen kopierer ikke mere end tegn (inklusive null-tegnet) fra strengen srctil bufferen uden at garantere, at strengen slutter med et nul-tegn (hvis længden af strengen er større end eller lig med ). Hvis længden af strengen er mindre end , skubber bufferen op til null-tegn. dstlensrclensrclenlen
Funktionen returnerer en værdi dst.
Konklusion:
streng: "strengmønster" buffer før kopi: "" buffer efter kopi: "prøve med"(strengen blev afkortet til størrelsen af bufferen under kopiering - 9 tegn + nul)
Funktionen strncpyer designet til at beskytte programmer mod bufferoverløb , men den er i sig selv også usikker af design - standardfunktionen garanterer ikke, at der indstilles et nul-tegn til slutningen af bufferen, som, når du forsøger at udskrive en linje fra bufferen (eller arbejde med det), kan føre til læsning af data uden for bufferen, hvilket vil få programmet til at gå ned, hvilket kan bruges til at udføre et netværks DoS - angreb.
Når du arbejder med funktionen korrekt, skal du overføre en værdi, der er lenen mindre end bufferstørrelsen til funktionen, og også selv indstille den sidste byte til 0:
charbuf[BUFSIZE]; strncpy(buf, input, sizeof(buf) - 1); buf[sizeof(buf) - 1] = '\0';OpenBSD-udviklerne strncpyhar lavet en ikke-standard funktion for at erstatte den med en strlcpynull-termineret streng. På systemer, der også implementerer det, anbefales det at bruge det i stedet for strncpy. På andre systemer er det muligt at lave en hjemmelavet implementering af denne funktion, fra kildekode distribueret under BSD-licensen .
Derudover strlcpyløser også ydeevneproblemet strncpy(se nedenfor).
Standardadfærden strncpyer ikke optimal - funktionen fylder hele resten af [1] [2] bufferen med nuller hver gang , hvilket fører til overheadforbrug af processorressourcen, når bufferen er stor, og når der arbejdes med korte strenge (en fælles situation i netværksservere).
Brug i stedet for en strncpyikke-standard funktion eller en håndværksmæssig funktion (som f.eks. Apachestrlcpy blev omskrevet på et tidspunkt [1] ), kan give et betydeligt præstationsboost (en femdobling blev vist på en syntetisk test [2] ).