[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] gets strengen



Sune Fischer wrote:
> 
> > > char *linein;
> > > gets(linein);
> >
> > gets() er farlig - læs man-siden! Brug fgets i stedet.
> 
> tjoo, linein er på 300 bytes, så lange kommandoer kommer der ikke.
Ikke ifølge det du har vist - så har du slet ikke allokeret noget plads
til linein.

> Med fgets får jeg det omvendte problem, den skal have antallet af bytes der skal læses, det antal
> kender jeg jo ikke.
> Hvad sker der hvis jeg læser 300 bytes fra stdin, når der kun sendes 20?
Den læser max. det antal du specificerer eller indtil newline.
Hele ideen er at du undgår buffer-overflow (crackers-delight).
Du erstatter simpelthen 'gets(linein)' med:
'fgets(linein, 300, stdin)' og så har du lavet en sikrere
implementation.

Læs man-siden ;-)

> 
> > > Findes der forøvrigt lettere metoder til at analysere strenge?
> >
> > Ja, fx. kan du bruge en leksikal scanner som flex, den kan selv læse fra
> > input - læs man-siden.
> 
> Duer vist ikke, skal være portabel kode (som altid;).

Den forstår jeg ikke!
Såvidt jeg erindrer er det, der genereres af flex, portabelt C-kode!
(Jeg har læst det et sted, men kan ikke huske hvor.)
Selv flytter jeg kode mellem forskellige unix-platforme uden nogen
former for problemer. Og ved at kigge i den genererede fil, bemærkede
jeg at den også genkender 'turboc'.
For længe siden oversatte jeg det også på en Win95 uden problemer (så
vidt jeg erindrer), så jeg tror egentligt på, at koden er portabel.

Men selvfølgelig hvis du gerne vil spilde oceaner af mandtimer på at
håndkode, så skal du da være velkommen - husk også at lave intensiv test
på det du håndkoder.
I tilgift får du jo så også formodentligt en væsentlig langsommere
scanner end den du får 'gratis' fra flex.
(Undskyld min sarkasme, men jeg kunne ikke lade være ...)

PS Der er mange definitioner af portabilitet, men det er vist en helt
anden diskussion - for mig betyder portabilitet, at koden følger
internationale standarder som fx. ISO C, POSIX.
- Av, der røg lige portabilitet til et par Win-platforme i svinget :-)

/Egon


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:09 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] *