2017-08-14 42 views
8

Piszę zbiór przykładowych wycieków przestrzeni w Haskell i chciałbym napisać pakiet testowy, by złapać się na tym, żebym wstawił przykłady, które w rzeczywistości nie przeciekają.Sprawdź, czy funkcja Haskella ma wyciek przestrzeni.

Czy istnieje sposób przetestowania przykładów bez tworzenia osobnego pliku wykonywalnego dla każdego z nich?

+4

Neil Mitchell ma bardzo skuteczną i bardzo niski-tech techniki opisanej na swoim blogu: [Wykrywanie nieszczelności przestrzeni ] (http: // neilmitchell.blogspot.com/2015/09/detecting-space-leaks.html). – Cactus

+0

W przyszłości można to sprawdzić za pomocą analizatorów statycznych :) Jeśli można to sformalizować, wykrywanie wycieków przestrzeni jest tylko kwestią implementacji algorytmu. – Shersh

+0

@Cactus: To świetny artykuł. Niestety nie wiem, czy możliwe jest wychwycenie wyjątków wygenerowanych, gdy zabraknie pamięci (co ma sens). Próbowałem wygenerować wyjątek w innym procesie z 'System.Posix.process.forkProcess' i przechwyciłem go' ClassyPrelude.catchAny', ale nadal prześlizguje się przez i powoduje awarię zestawu testów. – seagreen

Odpowiedz

2

Można wykryć wyciek przestrzeni za pomocą testu, ale nie można udowodnić braku wycieków przestrzeni kosmicznej. Nawet jeśli profil pamięci jest stosunkowo niski, może wskazywać, że wyciek przestrzeni jest bardzo mały i nie wykonano wystarczającej liczby iteracji.

Do wykrywania nieszczelności przestrzeń można wykorzystać limity alokacji i liczniki jak opisano tutaj May I limit memory usage per function/monad/thread in Haskell?

Powiązane problemy