ukazkove zdrojaky
Premysl Hruby
lin-konf na post.cz
Pátek Březen 3 23:33:27 CET 2006
Martin `MJ' Mares wrote:
> Zdravim!
>
>
>>Btw v tom vasem switchi chybi jeste pred vsemi temi "case" default. V
>>pripade, ze by se cela funkce projela bez chyby by se totiz nic neuvolnilo.
>
>
> To neni pravda, pred switchem je return SUCCESS. Ale pred nim chybi if (!out) ;)
>
> Dobrou noc
Taky zdravim
Uznavam, prehledl jsem. Nicmene takhle je to jeste horsi chyba. Protoze
na zacatku takovych funkci se da predpokladat plneni struktur, alokace
zdroju (hlavne pameti). No a v pripade ze jiz neco zaalokuji tak to i v
pripade chyby musim uvolni co sem zatim stihl udelat. Coz ten return v
pripade uspechu neudela. A tak se stane, ze v pripade uspechu se funkce
ukonci a vsechen ten (s prominutim) bordel zustane :).
Beznejsi priklad: (ukazkovy)
-------------------------------------------------------
#define MSIZE 1024
#define OUT1 1
#define OUT2 2
#define OUT_OK 0
char *a, *b;
int out = OUT_OK;
/* Tento zapis je ciste ukazkovy pouze k danemu problemu */
if (!out && !(a = malloc(MSIZE)))
out = OUT1;
if (!out && !(b = malloc(MSIZE)))
out = OUT2;
/* BOD1 */
if (!out) {
....
/* BOD2 */
/* return SUCCESS; */
}
switch (out) {
default: free(b);
case OUT2: free(a);
}
------------------------------------------------------
V teto ukazce misto oznacene jako BOD1 udava hlavni if ktery obaluje
zbyvajici funkci cast programu. Jiz na prvni pohled je zrejme, ze to
zbytecne zvysuje odsazeni. A ted otazka za 60kkc. V pripade ze return za
lokaci BOD2 by byl odkomentovan, doslo by k uvolneni zdroju pred
ukoncenim funkce?
Ne bohuzel. Vy, stejne jako strujce predchozi ukazky by jste prisli o
60kkc a treba by jste se tak nedostali do finale :))
PS: at jsem se skutecne prehledl, toto misto bylo stejne spatne podle
jedne z mych pripominek (velky if kolem vseho), ale dekuji za upozorneni.
Ph.
Dobrou noc
Další informace o konferenci Linux