REKLAMA

Programista 4/2021 (98) – wrzesień/październik 2021 – Zaprzyjaźnij się z kompilatorem

Krótki przewodnik po flagach kompilatora

Zaawansowane metody optymalizacji mogą przyczynić się do generowania trudnych do wykrycia błędów, jeśli kod wejściowy nie jest napisany zgodnie ze standardem. Wykrycie źródła nieprawidłowości może być trudne i zależne od wielu czynników, np. wersji kompilatora i stopnia optymalizacji. Część błędów można wyeliminować, korzystając z rozbudowanej diagnostyki, jaką oferują kompilatory.

Standard języka C zakłada, że pewne operacje są niezdefiniowane (np. dzielenie przez zero) i nie mogą one wystąpić w prawdziwym kodzie. Twórcy kompilatorów wykorzystują ten fakt w celu opracowywania coraz bardziej wyrafinowanych metod optymalizacji kodu. Zakładając, że opisane w standardzie sytuacje nie mogą mieć miejsca, kompilator może rozszerzyć obszar optymalizacji i wygenerować bardziej wydajny kod wynikowy. Warto zaznaczyć, że kompilator nie jest zobowiązany do wykrywania wyrażeń niezdefiniowanych podczas procesu kompilacji. Według standardu to programista jest zobowiązany do tworzenia poprawnego kodu. Jeśli programista popełni błąd i dopuści do pojawienia się operacji niezdefiniowanej, to kompilator ma pełną dowolność, w jaki sposób taki kod zostanie przetworzony. Sposób obsługi niepoprawnego kodu wejściowego może zależeć od wielu czynników: wersji kompilatora, stopnia optymalizacji czy architektury procesora. Istnieje szansa, że w pewnych warunkach skompilowany program będzie zachowywał się zgodnie z intencją programisty, podczas gdy na innej platformie będą obserwowane nieskorelowane błędy. W konsekwencji wykrycie przyczyny może być żmudne i czasochłonne. Na szczęście można ograniczyć ryzyko zaimplementowania niedozwolonej operacji poprzez dodanie odpowiednich opcji diagnostycznych na etapie budowania i testowania kodu...

Zagadnienia poruszane w tym artykule:

  • Korzyści z rozbudowanej diagnostyki;
  • Wall, Wextra, Wpedatnic?
  • Dodatkowe flagi – lepszy kod;
  • Jak nie rozwiązywać zgłoszonych ostrzeżeń;
  • Im więcej, tym lepiej?
  • Brak ostrzeżeń = poprawny kod?
  • Sanitizery – dynamiczne wykrywanie pułapek.

Artukuł pochodzi z magazynu Programista nr 98 (4/2021). Magazyn jest z przełomu września i paździenirka 2021 r. Szczegółowy spis treści wydania nr 98: https://programistamag.pl/programista-4-2021-98/

Autorem artykułu jest Dominik Adamski. Programista w Mobica Limited. Zwolennik maksymalnego wykorzystania dostępnych narzędzi programistycznych w celu uzyskania jak najbardziej wydajnego kodu. Aktywnie działa w łódzkiej grupie CEHUG, która ma na celu dzielenie się wiedzą z zakresu szeroko pojętych systemów wbudowanych. Prywatnie pasjonat górskich wędrówek.