Strncpy

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 .

Funktion

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

Returværdi

Funktionen returnerer en værdi dst.

Eksempel på brug

#include <string.h> #include <stdio.h> /* for printf() */ int main () { char * str = "strengmønster" ; charbuf [ 10 ] = { 0 } ; // buffer mindre end streng printf ( "streng: \" %s \"\n\n " , str ); printf ( "buffer før kopi: \" %s \"\n " , buf ); strncpy ( buf , str , sizeof ( buf ) -1 ) ; // len er 1 mindre end bufferstørrelsen printf ( "buffer efter kopi: \" %s \"\n " , buf ); returnere 0 ; }

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)

Sikkerhed

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).

Ydeevneproblem

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] ).

Eksterne links

  • strncpy(1)  -  Beskrivelse af funktionen strncpypå OpenBSD-webstedet

Noter

  1. præstationskonsekvenserne af strncpy | Nathans blog . Dato for adgang: 17. oktober 2014. Arkiveret fra originalen 18. oktober 2014.
  2. 5.4 Kopiering og sammenkædning Arkiveret fra originalen den 21. oktober 2014. // GNU Libc manual: "Brug af strncpy .. kan også gøre dit program meget langsommere i et almindeligt tilfælde: kopiering af en streng, som sandsynligvis er lille til en potentielt stor buffer. I dette tilfælde kan størrelsen være stor, og når den er, strncpy vil spilde en betydelig mængde tid på at kopiere null-tegn."