Strncpy

strncpy är en C - programmeringsspråksstandardbiblioteksfunktion för att kopiera innehållet i en  nollterminerad sträng till en buffert av begränsad storlek.

Funktionen strncpyliknar strcpybuffertspillskydd , men den är inte helt säker.

Funktionen stöds av alla C -kompilatorer .

Funktion

Prototypen som beskrivs i rubrikfilen string.h:

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

Funktionen kopierar inte mer än tecken (inklusive nolltecknet) från strängen srctill bufferten utan att garantera att strängen slutar med ett nolltecken (om strängens längd är större än eller lika med ). Om längden på strängen är mindre än , trycker bufferten upp till nolltecken. dstlensrclensrclenlen

Returvärde

Funktionen returnerar ett värde dst.

Användningsexempel

#include <string.h> #include <stdio.h> /* för printf() */ int main () { char * str = "strängmönster" ; charbuf [ 10 ] = { 0 } ; // buffert mindre än sträng printf ( "sträng: \" %s \"\n\n " , str ); printf ( "buffert före kopia: \" %s \"\n " , buf ); strncpy ( buf , str , sizeof ( buf ) -1 ) ; // len är 1 mindre än buffertstorleken printf ( "buffert efter kopia: \" %s \"\n " , buf ); returnera 0 ; }

Slutsats:

string: "strängmönster" buffert före kopia: "" buffert efter kopia: "prov med"

(strängen trunkerades till buffertens storlek under kopiering - 9 tecken + noll)

Säkerhet

Funktionen strncpyär utformad för att skydda program från buffertspill , men den är i sig också osäker till sin design - standardfunktionen garanterar inte att ett nolltecken ställs in i slutet av bufferten, vilket, när man försöker skriva ut en rad från bufferten (eller arbeta med det), kan leda till att data läses utanför bufferten , vilket kommer att få programmet att krascha, vilket kan användas för att utföra en nätverksattack .

När du arbetar med funktionen korrekt måste du skicka ett värde lenett mindre än buffertstorleken till funktionen, och även ställa in den sista byten till 0 själv:

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

OpenBSD-utvecklarna strncpyhar gjort en icke-standardfunktion för att ersätta den med en strlcpynoll-terminerad sträng. På system som också implementerar det, rekommenderas det att använda det istället för strncpy. På andra system är det möjligt att göra en hemmagjord implementering av denna funktion, från källkod distribuerad under BSD-licensen .

Löser strlcpydessutom prestandaproblemet strncpy(se nedan).

Prestandaproblem

Standardbeteendet strncpyär inte optimalt - funktionen fyller hela resten av [1] [2] bufferten med nollor varje gång , vilket leder till overheadförbrukning av processorresursen när bufferten är stor och när man arbetar med korta strängar (en vanlig situation i nätverksservrar).

Att använda istället för en strncpyicke-standardfunktion eller en hantverksfunktion (som till exempel Apachestrlcpy skrevs om vid ett tillfälle [1] ), kan ge en betydande prestandaökning (en femfaldig ökning visades på ett syntetiskt test [2] ).

Externa länkar

  • strncpy(1)  -  Beskrivning av funktionen strncpypå OpenBSD-webbplatsen

Anteckningar

  1. prestandakonsekvenserna av strncpy | Nathans blogg . Datum för åtkomst: 17 oktober 2014. Arkiverad från originalet 18 oktober 2014.
  2. 5.4 Kopiering och sammanfogning Arkiverad från originalet den 21 oktober 2014. // GNU Libc manual: "Att använda strncpy .. kan också göra ditt program mycket långsammare i ett vanligt fall: kopiera en sträng som förmodligen är liten till en potentiellt stor buffert. I det här fallet kan storleken vara stor, och när den är det, strncpy kommer att slösa mycket tid på att kopiera nolltecken."