C (programovací jazyk): Rozdiel medzi revíziami

Smazaný obsah Přidaný obsah
Riadok 197:
Jedným z problémov je, že automaticky a dynamicky alokované objekty nie sú inicializované; pred prvým použitím majú ľubovoľnú hodnotu, ktorá sa práve nachádzala v im priradenom pamäťovom priestore. Táto hodnota je do veľkej miery nepredvídateľná a môže byť rôzna na dvoch strojoch, medzi dvomi spusteniami programu alebo medzi dvomi volaniami rovnakej funkcie. Ak sa program pokúsi použiť takúto neinicializovanú hodnotu, výsledok je zvyčajne nepredvídateľný. Väčšina moderných kompilátorov detekuje a varuje pred týmto problémom v určitej obmedzenej množine prípadov.
 
Pointery sú jedným z hlavných zdrojov nebezpečenstva; a pretože sú nekontrolované, je možné, aby pointer ukazoval na objekt ľubovoľného typu vrátane kódu a potom naň mohol zapisovať, čo máva nepredvídateľné následky. Hoci väčšina pointerov ukazuje na bezpečné miesta, to sa môže zmeniť použitím pointerovej aritmetiky, pamäť na ktorú ukazujú môže byť dealokovaná alebo už použitá inde ([[dangling pointer]]s), môžu byť neinicializované ([[wild pointer]]s) alebo im môže byť priamo priradená ľubovoľná hodnota použitím pretypovania alebo iného poškodeného pointera. Iný problém s pointermi je, že C umožňuje ľubovoľnú konverziu medzi akýmikoľvek dvomi typmi pointerov. Iné jazyky sa pokúšajú tieto problémy riešiť použitím obmedzujúcejších [[referenčný typ|referenčných typov]].
 
Hoci má C natívnu podporu statických polí, neoveruje, či sú indexy polí platné ([[bounds checking]]). Napríklad je možné zapísať do šiesteho prvku poľa s piatimi prvkami, čo má vo všeobecnosti nežiadúce následky. Nazývame to ''[[buffer overflow]]'' (pretečenie buffera) a je to nechvalne známy zdroj množstva bezpečnostných problémov C programov.