- p°edchozφ Φlßnek - nßsledujφcφ Φlßnek - obsah - ·vodnφ strßnka -

LinuxovΘ noviny ╪φjen 1997

NejdΘle existujφcφ chyba v Linuxu

Lars Wirzenius, 7.kv∞tna 1997

Na ja°e a v lΘt∞ roku 1991 se m∙j p°φtel Linus pohrßval s operaΦnφmu systΘmu se podobajφcφm programem, ze kterΘho se pozd∞ji stal Linux. Cht∞l do svΘho jßdra funkci podobnou printf, ale nev∞d∞l, jak ji implementovat (je╣t∞ neznal dokonale jazyk C). Proto jsem mu napsal funkci sprintf, kterou po n∞kolika zm∞nßch pou╛il.

V zß°φ 1994 pou╛il Friedemann Baitinger ze spoleΦnosti IBM, kter² vyvφjel ovladaΦ za°φzenφ pro jin² operaΦnφ systΘm, moji funkci sprintf p°i lad∞nφ (ale ne v koneΦnΘm produktu). Chyba p°e╛φvala t°i nebo t°i a p∙l roku bez pov╣imnutφ. Bohu╛el, byla objevena ihned potΘ, co se n∞kdo pokusil ji pou╛φt obvykl²m zp∙sobem. Nikdo to p°edtφm neud∞lal, ani jß, kdy╛ jsem ji psal. Nikdy po mn∞ necht∞jte, abych psal k≤d, kter² mß fungovat.

Chyba byla v obsluze ╣φ°ky tisknutΘho argumentu zadanΘ jako parametr. Funkce sprintf m∙╛e b²t nap°. pou╛ita takto:

sprintf(buf, "%s", str);

Tento p°φkaz umφstφ °et∞zec str do buf. sprintf umo╛≥uje i formßtovßnφ v²stupu:

sprintf(buf, "%10s", str);

Tento p°φkaz ud∞lß °et∞zec buf nejmΘn∞ 10 znak∙ dlouh² (del╣φ, pokud je str del╣φ). ⌐φ°ka °et∞zce m∙╛e b²t zadßna konstantou nebo jako odd∞len² parametr:

sprintf(buf, "%*s", 10, str);

Tento p°φkaz mß stejn² efekt jako p°edchozφ, ale odhalφ moji chybu.

Moje funkce sprintf byla implementovßna jako smyΦka, kterΘ prochßzela formßtovacφ °et∞zec a zvy╣ovala index po zpracovßnφ jeho dal╣φ Φßsti. Krom∞ situace, kdy zpracovßvala "*". A je to tady.

(ProΦ to vysv∞tluji tak d∙kladn∞? M∙j divn² smysl pro humor mne donutil umφstit text "Author of the longest-living linux bug" do souboru CREDITS ve zdrojov²ch textech jßdra a mnoho lidφ se mne na to n∞kdy ptß.) *


- p°edchozφ Φlßnek - nßsledujφcφ Φlßnek - obsah - ·vodnφ strßnka -