Philip Withnall
philip.withnall@collabora.co.uk 2015

This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.

Jako zvláštní výjimka se vám držitelem autorských práv uděluje svolení kopírovat, upravovat a šířit ukázkový kód obsažený v tomto dokumentu za podmínek, které si zvolíte, bez dalších omezení.

Kontraktové programování s kontrolami na vstupu a výstupu funkcí

# Úvodní a závěrečné podmínky

# Úvodní a závěrečné podmínky

Důležitou zásadou bezpečného kódu je, že se nesprávná data nebudou programem dále šířit – čím dále se vadný vstup může dostat, tím větší částí kódu projde a potenciálně se zvyšuje možnost využít je k útoku.

Standardním způsobem předcházení šíření neplatných dat je kontrolovat všechny vstupy do a výstupy ze všech veřejně viditelných funkcí v knihovně nebo modulu. Existují dvě úrovně kontroly:

## Aserce

Kontrolují programové chyby a při selhání program přeruší.

## Validace

Kontrolují neplatný vstup a při selhání vhodně vracejí chybu.

Validace je náročná záležitost, která se řeší pomocí GErrors. Zbývající část tohoto oddílu rozebírá úvodní a koncové podmínky asercí, které jsou určené čistě pro odhalování chyb programátora. Programátorskou chybou je, když je funkce zavolána způsobem, který je v dokumentaci uvedený jako zakázaný. Například když je předána hodnota `NULL` v parametru, pro který je uvedeno, že vyžaduje hodnotu, která není `NULL`, nebo když je předána záporná hodnota v parametru, který vyžaduje kladnou hodnotu. Programátorské chyby mohou nastat i na výstupu, například návratová hodnota `NULL`, když není uvedená v dokumentaci, nebo když není nastaven výstup GError při selhání.

Přidání úvodních a koncových podmínek asercí do kódu je hlavně o zajištění správného chování a jeho podrobného uvedení v dokumentaci, než o vlastním přidání asercí. Všechny aserce by měly být zdokumentované, nejlépe pomocí příslušné anotace k introspekci, jako je `(nullable)`.

Úvodní a závěrečné podmínky asercí jsou implementovány pomocí `g_return_if_fail()` a `g_return_val_if_fail()`.

Úvodní podmínky by měly kontrolovat jednotlivé parametry hned na začátku funkce, dříve než je proveden jakýkoliv další kód (i třeba načtení privátní datové struktury z GObject, protože by například mohl mít ukazatel na GObject hodnotu `NULL`). Koncové podmínky by měly kontrolovat návratovou hodnotu a případné výstupní parametry na konci funkce, což vyžaduje jediný výraz `return` a použití příkazu `goto` pro sloučení ostatních průchodových cest do něj. Příklad viz .