erlug
[Top] [All Lists]

RE: R: [Erlug] C++

To: erlug@xxxxxxxxxxxxxx
Subject: RE: R: [Erlug] C++
From: "Ivan Sergio Borgonovo" <mail@xxxxxxxxxxxxxxx>
Date: Thu, 14 Mar 2002 12:32:02 +0100
On 14 Mar 2002 at 9:32, Alessandro Forghieri wrote:

> Saluti.

> > Ivan Sergio Borgonovo mail@xxxxxxxxxxxxxxx [mlerlug/erlug list] wrote:

> > > On 11 Mar 2002 at 21:34, Davide Bolcioni wrote:

> > > Andiamo giù duro... e a me hanno dato dello zelante [sic] perchè
> > > snobbavo sprintf per usare sstream ;)

> > C'è un buffer overflow di differenza. Con sprintf, prima o poi,
> > farai lo sbaglio di sparare un numero (in particolare double)
> > in un char[] troppo corto.

> Infatti si usa snprintf, non sprintf.

> E, per chiarire il punto sullo zelo, vorrei ricordare che la domanda
> originale era
> "come converto un numero in stringa?" (e mi scordai di citare ecvt, gcvt,
> fcvt oltre
> snprintf). Applicando il rasoio di occam a me sembrava (e sembra tuttora)
> che avere
> un sstream per numero da convertire (e N sstream se devo convertire N
> numeri), ma contenti vobis...

a parte che l'attribuzione al commento è poco chiara...

Non è necessario avere 18 sstream per convertire 18 type diversi.

Comunque si parlava di "convertire un numero in una stringa in C++".

Sulla questione del "rasoio di occam" è come chiedersi con quale
shell/linguaggio/vattelapesca riesco a fare la determinata cosa nel
minor numero di caratteri battuti [*]... sfida senz'altro con un suo
fascino ma non da prendere come riferimento per ogni cosa.

La soluzione in C e C++ sono per giunta poco paragonabili...
Di snprintf non si sa da dove arriva l'input. Il buffer overflow poteva
essere prima... a quel punto in C++ andava anche bene:

float f=5.7;
cout<< f;

Il punto è... che per sapere dove deve tagliare il rasoio di occam hai
bisogno di un po' più di contesto, devi sapere qual'è il livello
attuale di sviluppo dei compilatori C/C++, le implementazioni che
consideri, devi sapere il C e devi sapere il C++.

Il fatto che tirare dentro <sstream> sia MOLTO di più che tirare dentro
un X di funzioni mi sembra una percezione più che un dato di fatto...
Come se snprintf per convertire float piuttosto che int non usasse
codice diverso... tant'è che il sorgente di snprintf sono 40Kb.

Ovvio che includere <sstream> non vuol mica dire che stai includendo
nel codice tutte le classi e i metodi dichiarati.


Questo non toglie che io abbia le mie sante pregiudiziali nei confronti
dei compilatori C++ tra cui quella non indifferente di sapere quanto
standard sono le STL visto che ogni compilatore ha le sue con le
rispettive turbe o stato di adesione allo _standard_(?)... vedasi anche
ultimi commenti di Davide su gcc 2.95/3.0.


Ma come anticipato... sapevo che la cosa sarebbe terminata in una
guerra di religioni ;)


[*] i #define NON valgono... il codice automodificante si ;)


--
Salve
Ivan Sergio Borgonovo
http://www.webthatworks.it/
find /home -iname "*spam*" | \
while read s; do rm -fr "$s";done && \
talk world




<Prev in Thread] Current Thread [Next in Thread>