Ze względu na to, że niezbyt stare wersje GNU Compiler Collection (GCC) mogą generować zły kod z poziomem optymalizacji kompilatora”-O3″i czasami nie dają korzyści związanych z wydajnością, Linus Torvalds nie chce używać tej flagi optymalizacji podczas kompilowania jądra Linuksa.
Wysłane w tym tygodniu jako część poprawek sieciowych dla jądra Linux 5.13 zostały WireGuard poprawił, że wśród nich spadła kompilacja modułu WireGuard z flagą”-O3″C.
Główny programista WireGuard, Jason Donenfeld, budował WireGuard z poziomem optymalizacji”-O3″od samego początku projektu i w przeszłości badał wygenerowany kod. Chociaż nie był świadkiem przypadków generowania złego kodu z użycia”-O3″, dzięki wskazówkom Linusa Torvaldsa zrezygnował z tej opcji.
Wytyczne „-O3 ogólnie jest niebezpieczne” od Torvaldsa pochodzą z ten ostatni wątek jądra, w którym niektórzy programiści dyskutowali o użyciu-O3, ale przekazywali również”-fnotree-loop-vectorize”, aby obejść niektóre wersje GCC, prawdopodobnie generując zły kod na wyższym poziomie optymalizacji.
W tym ostatnim poście e-mail Torvalds podsumował swoją obecną perspektywę-O3:
W przeszłości było to strasznie błędne. Jest lepiej, ale ten przypadek wyraźnie pokazuje, że „stało się lepiej” tak naprawdę nie jest tak wysoko poprzeczką.
Bardzo niewiele projektów używa-O3, co oczywiście jest częścią tego, dlaczego jest on wadliwy. Ale drugą przyczyną błędów jest to, że wektoryzacja jest po prostu bardzo skomplikowana i szczerze mówiąc, sądząc po ostatnim raporcie, ludzie z gcc nie dbają o ostrożność. Dosłownie nie mają nic przeciwko świadomemu generowaniu sprawdzenia zakresu off-by-one, ponieważ „to niezdefiniowane zachowanie”.
Z taką mentalnością nie jestem osobiście skłonny do powiedzenia „oczywiście, użyj-O3”. Wiemy, że ma błędy nawet w dobrze zdefiniowanych przypadkach.
Więc moduł jądra WireGuard’a idący do przodu nie zostanie zbudowany w-O3. LZ4 i Zstd pozostają jedynymi znanymi użytkownikami kodu jądra kompilowanego z opcją-O3.
Biorąc pod uwagę powolną kadencję wielu dostawców przechodzących na nowe wersje kompilatorów, a nawet dłużej, zanim opiekunowie jądra zechcą zrezygnować ze wsparcia dla starych wersji kompilatora, prawdopodobnie miną lata, zanim jądro Linux uzna, że domyślnie będzie bezpiecznie używać”-O3″–brak sprawdzania wersji lub po prostu włączenie go dla Clang lub innych warunków uważanych za bezpieczne.