Article View: be.comp.programming
Article #1499Re: Printf: vaste lengte strings en ints?
From: Dr.Ruud
Date: Wed, 02 Mar 2005 17:27
Date: Wed, 02 Mar 2005 17:27
75 lines
2985 bytes
2985 bytes
Wat moi schreef, bleek het
begin van iets moois; kijk zelf maar:
> Dr.Ruud:
>> Aquila:
>>> [printf]
>>> Kan %i een maximum lengte opleggen zonder daarvoor extra nullen te
>>> printen? In beide gevallen mag er afgekapt worden, ik wil gewoon
>>> beveiligingsfouten vermijden.
>> Nee, maar je zou wel kunnen casten, bijvoorbeeld
>> (int32) id
>> want op die manier weet je dat %i maximaal 10 tekens kan opleveren,
>> zelfs als later 'id' een 64-bits integer zou worden.
> Is wel erg paranoide, IMO, om rekening te houden met andere sizes.
Het had ons allemaal heel wat exploits kunnen schelen.
> En onsmakelijk om daar een cast voor te gebruiken.
Niet als je je wilt verzekeren.
> Een int is een int. een "%d" of "%i" verwijst naar een int in de
> arglist, ongeacht zijn/haar sizeof.
>
> Het eenvoudigst, IMHO is om de buffer gewoon groot genoeg te maken:
> een geformatteerde 32 bits int vergt 10 char +1 voor het teken.
> <limits.h> vermeldt:
>
> # if __WORDSIZE == 64
> # define LONG_MAX 9223372036854775807L
> # else
> ...
> Dat is 19 pos + teken voor een 64bits int, als ik goed geteld hebt.
Voor een signed int van 8 bits heb je 4 posities nodig,
16 bits: 6 posities
32 bits: 11 posities
64 bits: 20 posities
96 bits: 30 posities
128 bits: 40 posities
en dan steeds per 32 bits er 9 of 10 posities bij.
bits = 8*sizeof(int)
Signed: 1 + INT(1+LOG(2^(bits-1),10))
Unsigned: INT(1+LOG(2^bits,10))
Vanwege 2^10 ~ 10^3 is dit ook zo te benaderen:
Signed: 2 + (39 * sizeof(int)) >> 4
Unsigned: 1 + (39 * sizeof(int)) >> 4
Iets grover kan ook:
Signed: (3 + 5 * sizeof(int)) >> 1
Unnsigned: (1 + 5 * sizeof(int)) >> 1
Dus misschien zoiets:
#define INT2POS(pType) ((int)(2+(39*sizeof(pType))>>4))
--
Affijn, Ruud ` - �
+ ` � *
� ` Jvr qvg yrrfg,
� = ` fgresg wbatre.
Technical Details
Message-ID:
<d050po.130.1@news.isolution.nl>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!news.glorb.com!newsfeeder.wxs.nl!transit.news.xs4all.nl!post.news.xs4all.nl!not-for-mailReferences:
<M5qdnYvpZutbs7nfRVnyjA@scarlet.biz> <d01i4u.14c.1@news.isolution.nl> <CqudnXnc_MjnCbjfRVnyhg@casema.nl>Show Full Headers
Complete Article Headers
X-Google-Thread: fcea4,f962124bbb04ff22
X-Google-Thread: 107324,f962124bbb04ff22
X-Google-Attributes: gidfcea4,gid107324,public
X-Google-Language: DUTCH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!news.glorb.com!newsfeeder.wxs.nl!transit.news.xs4all.nl!post.news.xs4all.nl!not-for-mail
Message-ID: <d050po.130.1@news.isolution.nl>
From: "Dr.Ruud" <rvtol+news@isolution.nl>
Newsgroups: be.comp.programming,nl.comp.programmeren
References: <M5qdnYvpZutbs7nfRVnyjA@scarlet.biz> <d01i4u.14c.1@news.isolution.nl> <CqudnXnc_MjnCbjfRVnyhg@casema.nl>
Subject: Re: Printf: vaste lengte strings en ints?
Date: Wed, 2 Mar 2005 18:27:49 +0100
Organization: Chaos rules.
X-Newsreader: WMDIYB
X-Archive-Me: please
Approved: yesterday
X-Face: &CQ$FIr!=+=w,8`0Q^Ug"1>F[(/op8->E;NQet`5fe$;=e*!Z5&REvp<~Tj|"Y[|8OcJ{w#z&mB7B:I)XO*%_|\]|YW$C>>$Q[9-#K~c$tQ^Mf0,wMo?h\C)TE>f
Lines: 77
NNTP-Posting-Host: 194.109.164.102
X-Trace: 1109785205 news.xs4all.nl 43037 [::ffff:194.109.164.102]:33923
X-Complaints-To: abuse@xs4all.nl