====== Správa dynamické paměti ====== ===== Lokálně - Linux ===== Pro ověření správnosti alokace/dealokace dynamické paměti je vhodné použít nástroj, který dokáže odhalit tyto problémy. Tím nástrojem je program ''Valgrind'', který odhalí tyto nedostatky. Abyste ho mohli použít, je potřeba ho mít nainstalovaný, viz. sekce [[courses:b0b99prpa:tutorials:ubuntu_packages|Instalace potřebných balíčků]]. Použití je poté jednoduché (včetně kompilace): gcc -o program -g main.c valgrind --leak-check=full ./program ===== Lokálně - Windows ===== Pro správu paměti na OS Windows existuje program [[https://drmemory.org/ | Dr. Memory]], který umožňuje zobrazení úniků paměti nebo přístupu mimo alokovanou oblast pro systém Windows. Aktuální verze [[https://drmemory.org/page_download.html|ke stažení zde]]. Překlad programu doporučujeme s příznakem ''-g'', aby bylo zřejmé k jakému řádku se chyba váže. gcc -g -o main main.c Spuštění kontroly chyb se spouští následovně: drmemory -batch -- ./main.exe Program ''drmemory'' standardně vytváří txt soubor, který na konci otevírá. Přepínač ''-batch'' zakáže otevření souboru. ===== Lokálně - macOS ===== Pro procesory s architekturou x86 (pouze do verze macOS 10.15) nebo amd64 použijte program valgrind, viz. návod na [[https://github.com/LouisBrunner/valgrind-macos | GitHub]]. Návod nebyl testován Pro procesory řady arm64 (M1 a novější) není možné použít programu Valgrind a je třeba využít nativního programu Leaks nebo obdobného programu. Pokud budete hledat problém se zápisem nebo čtením do/z paměti, do překladače přidejte parametr ''-fsanitize=address'', jak je napsáno dole. Pokud budete hledat problém se správou paměti, tento parametr ''-fsanitize=address'' odeberte (bohužel nelze kontrolovat obojí zároveň). clang -g -fsanitize=address -o program -g main.c leaks --list -q --atExit -- ./program Pro detailnější popis zadejte do terminálu příkaz ''export MallocStackLogging=1'', který rozšíří možnosti zobrazení informací. Pro zrušení detailnějšího výstupu zadejte příkaz ''unset MallocStackLogging'' ===== Přes BRUTE ===== Pokud nechcete využít programu valgrind na Vašem počítači, je možné vyzkoušet program přes BRUTE a zjistit tak problémy s dynamickou alokací přímo. Je potřeba dodržet následující adresářovou strukturu: soubor.zip |- main.c |- data |- vstup1.in |- vstup2.in ... Zdrojový kód může být pouze v ''main.c'' a ve složce ''data'' poté libovolné množství datových souborů pro testování (např. ''vstup1.in'', ''vstup2.in'' apod.), které zadáváte na standardní vstup (u úkolů např. ''pub01.in''). Název a přípona je libovolná, pro každý soubor se vypíše extra výstup ve standarním formátu v BRUTE, ale bez porovnání s referenčním řešním, které zde neexistuje. Testovací skript poté najdete v BRUTE pod záložkou ''Valgrind''. Zde nemáte žádnou penalizaci za odevzdání ani nedostanete body, je to pouze testovací nástroj pro Valgrind. Max. doba běhu skriptu je 60s.