[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] Hvad går der galt?



Anders Melchiorsen <sslug@sslug> writes:

> Peter Makholm <sslug@sslug> wrote on 06-Nov-03:
>
>> Omtrendt samme problem giver strcmp og strcpy. Her skal du istedet
>> bruge strncmp og strncpy der begge tager en størelse som tredje
>> argument.
>
> strncpy() har sit eget problem i og med at den kun 0-afslutter en
> streng hvis den kan være i de n tegn. I praksis skal man altså bruge
> n-1 tegn og selv huske at indsætte et nul på plads n.

Ydermere, hvis du fortæller strncpy at der er plads til N tegn og der
er færre givet som input, fylder strncpy den resterende plads med \0
-- ikke bare ét terminerende \0 men nok til at fylde resten af
bufferen op.

strncpy blev nemlig oprindelig lavet for at håndtere strukturer som
skulle gemmes direkte på diske, fx utmp/wtmp. Strenge i disse er
defineret som at værende NUL-terminerede hvis der er plads, ellers
ikke. Og omvendt, når man skriver til disse ønsker man ikke at gemme
diverse snavs der skulle ligge i hukommelsen udover NUL-terminatoren.

strlcpy løser alle disse problemer, men er ikke standard (den dukkede
vist op i BSD).

På den anden side er det heller ikke en meget bedre løsning at bare
lydløst trunkere input fra brugeren til N tegn (en advarsel i en
obskur log fil eller standard error er ikke meget bedre). Enten bør
man returnere en fejl så brugeren ikke kan undgå at se at der er noget
galt, eller allokere hukommelse dynamisk i stedet for at have nogle
vilkårlige MAX_FOO_SIZE konstanter spredt rundt i koden.

Den slags streng/bufferhåndtering er selvfølgelig lettere hvis man
ikke bruger et forældet sprog som C.

-- 
===============================================================
<sslug@sslug>                           Herlev, Denmark     
<URL:http://www.andreasen.org/>                             <*>   
===============================================================



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:10 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *