OT programovanie v C: perla z nasho Labuanu

Jan Waclawek konfera na efton.sk
Pondělí Květen 10 14:11:37 CEST 2010


>Ze by bral e jako exponencialni zapis pouzivany u floatu?

Ano, toto je prvotny dovod, aj ked skutocna pricina je uz malilinko odlisna.

Prekladac podla normy funguje tak, ze sa snazi za sebou nasledujuce znaky poskladat do co najdlhsieho retazca (tzv. preprocessing token) podla urcitych pravidiel, z ktorych sa tu uplatni to, ze ak je prvy znak cislica (prip. bodka nasledovana cislicou), tak je to "preprocessing number" a do retazca su zahrnute vsetky nasledujuce cislice, pismena(!) a dvojice znakov e+, e-, E+, E-, p+, p-, P+, P- (C99 6.4.8). V nasledujucich krokoch sa potom prekladac pokusi takyto retazec  skonvertovat na cislo, no a v tom doleuvedenom pripade sa mu to nepodari, kedze prefix 0x znamena hexadecimalne cislo za ktorym uz nemoze nasledovat nic len cislice a pismena a az f (ktore su tak charakteristicky nesystematicky v tomto pripade case insensitive) (6.4.4.1).

Poucenie z tohoto je to, ze aj ked pravidlo "okolo operatora treba davat medzery" znie len ako ciste esteticke pravidlo, v skutocnosti ma aj takyto nepriamy a subtilny semanticky vyznam. V tomto pripade to konci pomerne bezpecnou chybou, ale podobne subtilne posuny vyznamu mozu v niektorych pripadoch byt aj skutocne nebezpecne. To vsetko je nasledok ad-hoc definicie jazyka, ktory nevznikol premyslenym procesom a jasnou definiciou, ale lepenim hovna k hovnu ((C) MK :-) ) - v tomto pripade je to konflikt medzi zjednodusenym parsovacim procesom preprocesora a zlozitejsim parsovacim procesom prekladaca, pricom to skonci tou "stastnou" chybou len vdaka pravdepodobne dodatocne kodifikovanej poziadavke, aby prekladac akceptoval preprocesorove tokeny aj s ich chybami.


Na toto som narazil na konci http://gcc.gnu.org/onlinedocs/gcc/Incompatibilities.html , pricom som zmenil tu konstantu v jednom znaku, inak sa to da az prilis lahko vyguglit ;-)

wek



----- Original Message ---------------

>Ze by bral e jako exponencialni zapis pouzivany u floatu?
>Lada
>
>On Mon, 10 May 2010, Jan Waclawek wrote:
>
>> Nasledujuci programcek:
>>
>> volatile unsigned long int a;
>>
>> int main(void) {
>>  a =3D 0x74ce-0x4000;
>>  while(1);
>> }
>>
>>
>> by nemal prelozit ziadny C99 prekladac.
>>
>> Preco?
>>
>> wek



More information about the Hw-list mailing list