W trakcie omawiania zestawu poprawek rozwiązujących problemy związane z podatnościami typu Spectre w kodzie do pracy z listami powiązanymi, stało się jasne, że problem mógłby być rozwiązany w sposób bardziej elegancki, gdyby w jądrze dozwolono na kod w języku C odpowiadający nowszej wersji standardu. Obecnie dodawany kod jądra musi odpowiadać specyfikacji ANSI C (C89), która została opracowana w 1989 roku.
Problem związany z Spectre w kodzie został spowodowany kontynuacją użycia oddzielnie definiowanego iteratora po pętli – do iteracji po elementach listy powiązanej używany jest makro, a jako że iterator pętli jest przekazywany do tego makra, jest definiowany poza samą pętlą i pozostaje dostępny po jej zakończeniu. Użycie standardu C99 pozwoliłoby na definiowanie zmiennych dla pętli w bloku for(), co rozwiązałoby problem bez wynajdywania obejść.
Linus Torvalds zgodził się z pomysłem wprowadzenia wsparcia dla nowszych specyfikacji i zaproponował w jądrze 5.18 przejście na użycie standardu C11, opublikowanego w 2011 roku. Przy wstępnym sprawdzeniu, kompilacja w GCC i Clang w nowym trybie przebiegła bez odchyleń. Jeśli podczas dokładniejszego testowania nie wystąpią nieprzewidziane problemy, w skryptach budowy jądra 5.18 opcja '--std=gnu89' zostanie zastąpiona przez '--std=gnu11 -Wno-shift-negative-value'. Rozważano również możliwość użycia standardu C17, ale w tym przypadku należałoby podnieść minimalnie wspieraną wersję GCC. Natomiast włączenie wsparcia dla C11 mieści się w obecnych wymaganiach co do wersji GCC (5.1).
Źródło: opennet.ru
