Re: [so] [uşor offtopic] Reserved identifiers în C

Lucian Adrian Grijincu lucian.grijincu at gmail.com
Wed Feb 13 01:55:57 EET 2008


hint: in log de __bleah, use bleah__ care nu violează nici o regulă,
daca nu gasesti un identificator mai bun (I highly doubt it)

uită-te in codul pentru libc sau măcar prin headere (poți să faci asta
in windows debugând programe cu Step-in pe funcții din libc).
vei vedea foarte mulți identificatori care incep cu _ sau __

de ce e rău să ai și tu niște identificatori din ăștia?
stii ca poti sa definesti o functie
    int printf(const char *, ...)?
tot codul tău o va folosi pe cea implementată de tine (cel putin pe
linux, pe windows n-am incercat).

Să presupunem urmatoarele:
ai sursele urmatoare: biblioteca.c si program_principal.c
biblioteca are o singura functie:
  void log(const char * );
iar programul tau foloseste functia asta de logare.

biblioteca.c o compilezi/linkezi ca un DSO => libbiblioteca.so
program_principal.c linkezi cu -lbiblioteca => a.out

daca in biblioteca folosesti functii din C, sa zicem printf pentru
logare, si in program_principal.c reimplementezi printf, log() va
chema implementarea ta, nu cea a libc-ului.
why?
din câte am inteles e ceva de genul asta:
printf e un simbol dinamic. La prima folosire, inainte de a chema
implementarea lui printf se cauta simbolul asta.
Daca nu il redefineste nimeni e gasit (hopefully) in tabela de
simboluri exportata de libc (asta daca ai linkat la libc -- nu te
obliga nimeni sa faci asta).
Daca il redefinesti il gaseste in tabela de simboluri ale programului
tau si nici nu se mai chinuie sa o caute altundeva.
Eu m-am intalnit in real life cu o asemenea problema:
http://ixlabs.cs.pub.ro/who-says-bugs-arent-fun-no-2/

Acum imagineaza-ti ca redefinesti o variabila nonstatica care e
folosita de una sau mai multe librarii.
sa zicem ca _ubervar era definita ca vector de 1000 de intregi, dar tu
o definesti ca char.
libraria va interpreta zona asta de memorie ca un sir de 4000 de bytes
(YMMV), dar storage alocat este doar 1 byte. See a problem?


Acum cel mai banal caz e urmatorul:
iti faci tema acum si ai o functie _blabla(), compileaza, ruleaza, etc.

Dar cei de la libc definesc in o versiune urmatoare _blabla si pun
declaratia ei in stdio.h, pe care il foloseste si tema ta.
Când dai sa recompilezi programul cu noua versiune de libc, *gasp*
eroare de compilare, function redefinition, etc.



Cred ca daca nu spuneau nicăieri că nu e bine să ai variabile cu _ sau
__ in fata nu erau atat de faimoase pe cat sunt.
(Daca ni s-ar spune: maine de la 10 la 11 sa nu fie nimeni in holul de
la EC. ABSOLUT ABSOLUT nimeni. Evident mâine ar fi neobișnuit de mulți
oameni in holul de la EC să vadă ce se petrece. Și **BUM** =>
studentul terorist-sinucigaș cu restante la DCE/CIL/SCD/MESM.)


2008/2/13 Mihai Balan <mihai.balan at gmail.com>:
> Salut!
> Plecând de la articolul legat de Name mangling de pe wikipedia dat ca
> „referinţă" la un moment dat pe aici pe listă, am ajuns şi la
> http://en.wikipedia.org/wiki/Reserved_identifier (la o cautare sumară
> http://web.archive.org/web/20040209031039/http://oakroadsystems.com/tech/c-predef.htm
> conţine ceva mai multe detalii). Poate sunt un pic leneş că nu caut mai
> adânc, dar întrebarea mea este: cât de rezervaţi sunt astfel de
> identificatori (mă refer mai ales la cei care încep cu _ şi __ )? Eu am
> folosit în codul de la tema5 astfel de identificatori din plin şi nici unul
> din compilatoare (cl sau gcc) n-au avut nimic de comentat? Is there anything
> I'm missing? :)
>

You're just lucky. Nu ai folosit identificatori folositi de libc.
Redenumeste-ti variabilele/functiile tale cu nume folosite intern de
libc. Tell us how it goes :D

-- 
Lucian


More information about the so mailing list