Nieużywane zmienne

przez | 20 listopada 2019

Krótka ciekawostka. Właściwie to nic odkrywczego jak by się nad tym zastanowić, ale prawdopodobnie mało kto o tym myśli: nieużywane zmienne i informacje kompilatora, że mamy takie w kodzie.

Dziś miała miejsce taka sytuacja. Została zaimplementowana poprawka, projekt kompilował się lokalnie na komputerze osoby, która naprawiała ten problem, kod został wysłany, żeby obejrzeli go inni – jednym słowem standardowa procedura. Zmiana została przez wszystkich zaakceptowana i wysłana na serwer gdzie uruchomiły się skrypty które miały zintegrować poprawkę na gałąź projektową. I operacja się nie udała. Okazało się, że narzędzie do statycznej analizy kodu w zaproponowanej zmianie znalazło zmienną, która nigdzie nie jest używana.

Pierwsza reakcja? Przecież to niemożliwe, nasz projekt buduje się z flagami kompilacji, które traktują każde ostrzeżenie jako błąd i projekt nie powinien się w ogóle zbudować. Problem mógł być niezauważony na komputerze osoby która to implementowała bo być może flagi kompilacji zostały zmienione, ale na serwerze projekt nie powinien się zbudować.

Szybki test na komputerze lokalnym. Sprawdzamy flagi kompilacji – wszystko ustawione tak jak być powinno. Dodajemy nieużywaną zmienną int x i próbujemy zbudować projekt. Dostajemy ostrzeżenie i projekt się nie buduje. Sprawdzamy jaka zmienna była zadeklarowana w poprawce. Zmienna była strukturą! Struktura ma wołany konstruktor i destruktor czyli nie jest nieużywana – zarówno kompilator MSVC jak i GCC nie traktują takiej zmiennej jako nieużywanej. Program do statycznej analizy kodu już to jednak wyłapał.

Jak by się nad tym zastanowić to zachowanie kompilatorów ma sens. C++ w bibliotece standardowej mamy np. coś takiego jak https://en.cppreference.com/w/cpp/thread/lock_guard . Idea jest taka, że obiekt tego typu „żyje” tylko w czasie wykonywania funkcji w której został zadeklarowany – tworzymy zmienną tego typu a konstruktor zatrzaskuje mutex i nie musimy się martwić o to, że zapomnimy go zwolnić przy wychodzeniu z funkcji bo zajmie się tym destruktor. Teoretycznie zmienna jest nieużywana w praktyce pełni bardzo ważną rolę. Ciekawe jak by sobie z tym poradziło nasze narzędzie do statycznej analizy kodu?

Można psioczyć na te dodatkowe narzędzie – że to długo trwa, że się niepotrzebnie czepia, że trzeba rozwiązywać problemy których nie ma, ale raz na jakiś czas coś faktycznie znajdują.

Dodaj komentarz

Twój adres email nie zostanie opublikowany.