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