Czy mógłbyś wprowadzić testy jednostkowe odpowiednich funkcji, które istnieją tylko po to, aby wyłączyć Gcov up przez bezpośrednie atakowanie teoretycznie nieodpornych ścieżek kodu? Ponieważ są to testy jednostkowe, mogą one zignorować "niemożliwość" sytuacji. Mogą wywoływać funkcje, które nigdy nie są wywoływane, przekazywać niepoprawne wartości wyliczeniowe, aby przechwytywać domyślne gałęzie itp.
Następnie należy uruchomić te testy tylko w wersji kodu skompilowanej z NDEBUG, lub uruchomić je w uprzęży, która testuje że aktywacja jest uruchamiana - niezależnie od tego, co obsługuje twoja struktura testowa.
To trochę dziwne, ponieważ specyfikacja mówi, że kod musi tam być, a nie specyfikacja zawierająca wymagania funkcjonalne w kodzie. W szczególności oznacza to, że twoje testy nie testują tych wymagań, co jest równie dobrym powodem, aby utrzymać wymagania w działaniu. Osobiście chciałbym zmodyfikować specyfikację, aby powiedzieć: "jeśli wywołana z nieprawidłową wartością wyliczenia, funkcja nie powiedzie się assert
. Dzwoniący nie będą wywoływać funkcji z nieprawidłową wartością wyliczenia w trybie zwolnienia". Lub niektóre takie.
Przypuszczalnie to, co obecnie mówi, jest na wzór "wszystkie instrukcje przełączników muszą mieć domyślny przypadek". Oznacza to jednak, że standardy kodowania zakłócają obserwowalne zachowanie (przynajmniej możliwe do zaobserwowania pod gcov) poprzez wprowadzenie martwego kodu. Standardy kodowania nie powinny tego robić, więc specyfikacja funkcjonalna powinna w miarę możliwości uwzględniać standardy kodowania.
W przeciwnym razie możesz owinąć niemożliwy do zmienienia kod w #if !GCOV_BUILD
i zrobić osobną kompilację dla korzyści gcov. Ta kompilacja nie spełni pewnych wymagań, ale pod warunkiem, że twoja analiza poprawności kodu jest poprawna, daje ci pewność, że pakiet testowy testuje wszystko inne.
Edycja: mówisz, że używasz generatora podejrzanych kodów, ale prosisz też o rozwiązanie, opisując kod źródłowy. Jeśli zmieniasz źródło, czy możesz po prostu usunąć martwy kod w wielu przypadkach? Nie oznacza to, że zmiana generowanego źródła jest idealna, ale potrzeby muszą ...
Co sprawia, że jesteś tak pewny, że linie są unhittable? Jeśli tak jest, ponieważ nie udało Ci się ich trafić, to właśnie próbujesz się dowiedzieć z pokryciem kodu. – doron
@ deus-ex-machina399: Nie, to nie dlatego, że nie mogłem ich uderzyć. Jest to spowodowane zrozumieniem i analizą kodu. Oczywiście mogę się mylić, ale nie używam analizy zasięgu kodu, aby zweryfikować moje zrozumienie kodu źródłowego. Używam analizy zasięgu kodu do sprawdzenia jakości mojego zestawu testów. – jchl
@doron, przykładem kodu, który powinien być nieodporny, są ścieżki błędów w infrastrukturze testowej. Oczywiście, prawdopodobnie możesz obyć się bez takich ścieżek, ale ja je mam. –