Manuál: Nástroje

V tomto manuálu si ukážeme instalaci a použití následujících terminálových nástrojů:

git

cmake, make

gcc

valgrind

cppcheck, clang-tidy

clang-format

iné

Pokud hledáte terminálový textový editor, doporučujeme vim.

git

Manuál ke gitu jsme vyčlenili do samostatné kapitoly.

cmake, make (automatizácia prekladu)

Aby sme sa vyhli manuálnemu písaniu zložitých príkazov pri kompilácii, používajú sa build systémy, ktoré za nás budú riadiť celú kompiláciu. V predmete budeme na ich generovanie používať program CMake, ktorému povieme:

  • ako sa má program skompilovať

  • z ktorých súborov sa má skompilovať

  • aké súbory má vygenerovať

Tieto nastavenia ukladáme v CMakeLists.txt. Tento súbor zároveň predstavuje „projekt“, ktorý vedia načítať aj jednotlivé IDE.

Čo vlastne cmake robí? Vygeneruje pre náš projekt build systém. Dôležitý je najmä súbor Makefile, ktorý je vstupom pre ďalší nástroj, make. Generovanie spustíme v adresári projektu príkazom:

cmake -S . -Bbuild
-S .

znamená, že zdrojové súbory (source) sú v aktuálnom adresári (.)

-Bbuild

znamená, že generujeme do adresáru build

Na Aise je potrebné aktivovať novšiu verziu — Aisa/moduly.

Make je už nástroj, ktorý čítaním Makefile riadi build, teda zostavenie programu. Presunieme sa do adresáru, ktorý vygeneroval cmake, a spustíme ho bez parametrov:

cd build
make

Vo výstupe môžeme pozorovať, ako zadáva pokyny kompilátoru (typicky gcc). Výsledkom je už spustiteľný súbor, „binárka“. Ak program chceme spustiť, musíme pred jeho meno zadať ./ (objasňuje Linux/Užitočné znalosti).

terminal build
Celý proces prekladu pre program printer/drawer. Využívame automatické doplňovanie (Bash - skratky).

Veľkou výhodou je tiež to, že po zmene v jednom súbore sa nemusí znova kompilovať celý program, iba jeho časť, čo celý proces výrazne urýchli.

Súbory vygenerované pomocou make sa dajú typicky odstrániť vykonaním make clean.
Cmake volí kompilátor podľa premennej prostredia CC. export CC=gcc by vynútil kompilátor gcc.

gcc (kompilácia)

Na kompiláciu v tomto predmete využívame program gcc. Bežne ho ale neuvidíme, pretože príkazy za nás bude zadávať make. Alternatívnou voľbou môže byť kompilátor clang.

Ak by sme mali jednoduchý program, kompilácia bez make by vyzerala nasledovne:

gcc -std=c99 -o BINARY_NAME [sources]
-std=c99

upresní, že používame štandard/verziu jazyka c99

-o BINARY_NAME

názov výsledného programu (vynechaním vznikne a.out)

Kontr navyše kompiluje úlohy s prepínačmi:

-pedantic

prísnejšie vynúti štandard, upozorní, ak použijeme rozšírenie jazyka

-Wall -Wextra

zapne všetky upozornenia

-Werror

upozornenia zmení na kompilačné chyby

valgrind (ladenie)

Nástroj určený na hľadanie chýb pri práci s pamäťou. Upozorní napríklad na memory leaky, používanie neinicializovaných premenných, prístup do pamäte, ktorá nie je alokovaná, viacnásobné volanie free.

Kontrolu vykonáme príkazom:

valgrind --leak-check=full --show-reachable=yes --track-origins=yes ./<program_name>
--leak-check=full

zapne kontrolu neuvoľnenej pamäte s podrobným výpisom

--show-reachable=yes

zobrazí všetky typy neuvoľnenej pamäte

--track-origins=yes

zapne sledovanie pôvodov neuvoľnenej pamäte (spomalí beh Valgrindu asi o polovicu)

Príklad použitia
Máme program, ktorý obsahuje iba jednu alokáciu, na ktorú zabudneme použiť free:
.leak.c

#include <stdlib.h>
int main(void)
{
    int *leak = malloc(sizeof(int));
    return 0;
}

Program skompilujeme s ladiacimi informáciami pomocou prepínača -g alebo -ggdb, aby nám valgrind ukázal čísla riadkov. Potom program vo valgrinde spustíme:

gcc -g -o leak leak.c
valgrind --leak-check=full --show-reachable=yes --track-origins=yes ./leak
terminal valgrind

Vo výstupe si všimneme:

 HEAP SUMMARY:
     in use at exit: 42 bytes in 1 blocks (1)
   total heap usage: 1 allocs, 0 frees, 42 bytes allocated (2)

 42 bytes in 1 blocks are definitely lost in loss record 1 of 1 (3)
    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) (4)
    by 0x10865B: main (leak.c:4) (5)

 LEAK SUMMARY:
    definitely lost: 42 bytes in 1 blocks
    ...
 ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
1 pri ukončení programu sa používalo 42B pamäte
2 alokovali sme jedenkrát pamäť, nič sme neuvoľnili, alokovaných bolo spolu 42B
3 nastal memory leak veľkosti 42B
4 leak spôsobila funkcia malloc
5 malloc volala funkcia main, v súbore leak.c, na 4. riadku

Statické analýzatory

Hľadajú podozrivé časti kódu, ktoré by mohli naznačovať chybu. Označujú sa ako statické, pretože kontrola prebieha bez spustenia programu. Nie všetky chyby sa ale dajú odhaliť automaticky.

cppcheck

Spustí kontrolu na súbore hello.c (môžeme zadať viac súborov naraz, prípadne *.c):
cppcheck hello.c
Nástroj na Aise nebol dostupný v čase písania manuálu (30. jan 2019). Ani v čase jeho aktualizace (12/02/2023).

clang-tidy

Do svojho repozitára vložíme konfiguráciu pre pb071 (.clang-tidy). clang-tidy automaticky hľadá konfiguráciu v aktuálnom adresári alebo v niektorom z jeho rodičov.

Spustí kontrolu na súbore hello.c:
clang-tidy hello.c -- -std=c99
Spustí kontrolu na všetkých .c súboroch:
clang-tidy *.c -- -std=c99
Na Aise je dostupný po aktivovaní modulu llvm-17.0.1.

clang-format (formátovanie kódu)

Automaticky naformátuje kód podľa štýlu, definovaného v súbore.

Do svojho repozitára vložíme štýl pre pb071 (.clang-format) a codestyle.txt.

  • Súbor codestyle.txt je pre Kontr a bude sa aplikovať pri odovzdávaní.

  • Súbor .clang-format je pre vás a clang-fomat, spustený príkazom nižšie, v ňom bude hľadať konfiguráciu.

Je nutné presne dodržať názvy týchto súborov!

Naformátuje hello.c
clang-format -style=file -i hello.c
-style=file

má sa hľadať súbor so štýlom

-i

súbor sa hneď prepíše; bez prepínača sa opravený kód vypíše na štandardný výstup

Iné štýly sú k dispozícii na gitlab.fi.muni.cz/pb071/codestyles.

Iné užitočné nástroje

nano

veľmi jednoduchý textový editor, skratky na ovládanie sú v spodnej časti obrazovky

mc

midnight commander, súborový manažér

scp

zabezpečený prenos súborov cez ssh

  • scp xlogin@aisa.fi.muni.cz:~/hello.c .
    prenesie hello.c z Aisy na náš počítač, do aktuálneho adresára

  • syntax je scp čo kam, pomocou : predelíme adresu serveru a cestu k súborom

  • -r (recursive) povolí prenášať celé adresáre

sftp

podobný scp, viac interaktívny

rsync

nezabezpečený prenos väčšieho množstva/väčších súborov, oproti scp oveľa rýchlejší

wget

stiahnutie súboru z webu
wget http://muni.cz/file.zip uloží súbor do aktuálneho adresára

Terminal multiplexing

Umožňuje pracovať s viacerými programami v jednom terminálovom okne alebo si rozpracované veci uložiť ako sedenie a otvoriť na inom počítači. Slúžia na to terminálové multiplexery, konkrétne program tmux (Ham Vocke, A Quick and Easy Guide to tmux).

Po jeho spustení vytvorí sedenie (session), v ktorom môžeme deliť obrazovku na viac virtuálnych terminálov, prípadne otvárať nové okná. Ak sa odhlásime, sedenie nemusíme ukončiť — presunie sa iba do pozadia. Po opätovnom prihlásení si sedenie môžeme otvoriť a pokračovať s rovnakým rozdelením okna a aj otvorenými programami.

Pomerne novou možnosťou je program byobu, ktorý ale nie je naozaj terminálový multiplexer, ale moderná nadstavba nad tmux. Vyznačuje sa jednoduchým užívateľským rozhraním so zabudovanou nápovedou a oproti tmuxu sa ovláda najmä za pomoci funkčných kláves F1-F12, inak je funkcionalita oboch programov v podstate totožná.

terminal byobu
ukážka byobu