🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #1499

Re: Printf: vaste lengte strings en ints?

#1499
From: Dr.Ruud
Date: Wed, 02 Mar 2005 17:27
75 lines
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-mail
References: <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