## Kostry úloh

Pracujete-li na studentském serveru ‹aisa›, můžete pro překlad
jednotlivých příkladů použít přiložený soubor ‹makefile›, a to
zadáním příkazu

    $ make příklad

kde ‹příklad› je název souboru bez přípony (např. tedy ‹make
e1_factorial›). Tento příkaz postupně:

 1. přeloží Vaše řešení překladačem ‹gcc›,
 2. spustí přiložené testy,
 3. spustí kontrolu nástrojem ‹valgrind›.

Selže-li některý krok, další už se provádět nebude. Povede-li se
překlad v prvním kroku, v pracovním adresáři naleznete spustitelný
soubor s názvem ‹příklad›, se kterým můžete dále pracovat (např. ho
ladit/krokovat nástrojem ‹gdb›).

Existující přeložené soubory můžete smazat příkazem ‹make clean›
(vynutíte tak jejich opětovný překlad a spuštění všech kontrol).

### Textový editor

Na stroji ‹aisa› je k dispozici jednoduchý editor ‹micro›, který má
podobné ovládání jako klasické textové editory, které pracují
v grafickém režimu, a který má slušnou podporu pro práci se
zdrojovým kódem. Doporučujeme zejména méně pokročilým. Další
možností jsou samozřejmě pokročilé editory ‹vim› a ‹emacs›.

Mimo lokálně dostupné editory si můžete ve svém oblíbeném editoru,
který máte nainstalovaný u sebe, nastavit režim vzdálené editace
(použitím protokolu ‹ssh›). Minimálně ve VS Code je takový režim
k dispozici a je uspokojivě funkční.

### Vlastní prostředí

Každý příklad je zcela obsažen v jednom standardním zdrojovém
souboru, proto je jejich překlad velmi jednoduchý. Pravděpodobně
každé IDE zvládne s příklady bez problémů pracovat (spouštět, ladit,
atp.), musí ale běžet na systému typu POSIX (splňují všechny OS krom
Windows – zde ale můžete využít WSL a případně jeho
«integraci do VS Code¹»).

Krom IDE můžete také použít dodaný soubor ‹makefile›, pouze si
v nadřazené složce (tzn. «vedle» složek ‹01›, ‹02›, atd.) vytvořte
soubor ‹local.mk›, ve kterém nastavíte, jak se na Vašem systému
spouští potřebné příkazy. Implicitní nastavení je toto, a funguje-li
Vám, není potřeba soubor ‹local.mk› vůbec vytvářet:

    CC = cc
    VALGRIND = valgrind

Můžete samozřejmě příklady překládat a kontrolovat i ručně.

¹ ‹https://code.visualstudio.com/docs/remote/wsl›

### Použití ‹gcov›

Některé z příkladů ve sbírce obsahují pouze minimání testy. Pro
ověření správnosti řešení je pak potřeba napsat si testy vlastní.
Testy by měly pokrývat co největší část testovaného kódu (ideálně
všechen). K určení, které cesty v programu jsou testy pokryté, může
posloužit nástroj ‹gcov›. Ten za běhu programu zaznamenává, které
části programu se vykonaly a umožňuje tak zpětnou analýzu.

Pokrytí všech příkazů v programu testy sice neimplikuje správnost
programu, ani dostatečný rozsah testů, jde však o užitečný indikátor,
který dokáže poukázat na nedostatčné pokrytí.

 1. Na aise potřebujete modul ‹llvm›, nejlépe verze ‹16.0.6›.
 2. Přeložíme program s přepínači ‹-g› (ladící informace) a
    ‹--coverage› (způsobí vygenerování souborů ‹*.gcno› a
    instrumentaci programu).
 3. Spustíme program. Tím se vygenerují soubory ‹*.gcda› se záznamem
    o běhu. Opakované spuštění přidává informace do existujících
    souborů.
 4. Nasbíraná data zpracujeme nástrojem ‹llvm-cov gcov›. Výsledkem
    jsou textové soubory ‹*.cpp.gcov›, které obsahují zdroják s
    informací o četnosti průchodů.
 5. Pro přehlednou statistiku můžeme použít nástroj ‹gcovr› s
    přepínačem ‹--gcov-executable='llvm-cov gcov'›. (Na aise je v
    modulu ‹gcovr-3.3› a je třeba přidat přepínač ‹-r .›.) Přidáním
    přepínačů ‹--html-details --output soubor.html› můžeme vytvořit
    HTML verzi výstupu. (Na aise je třeba ještě přidat přepínač
    ‹--html›.)

Celý postup v příkazové řádce:

    $ clang++ -std=c++20 -g soubor.cpp --coverage -o program
    $ ./program
    $ llvm-cov gcov *.gcda
    $ gcovr --gcov-executable='llvm-cov gcov'  # na aise přidat -r .
    $ gcovr --gcov-executable='llvm-cov gcov' --html-details \
      --output results.html  # na aise přidat --html -r .
