Jądro Linuksa 5.18 planuje umożliwić korzystanie ze standardu języka C C11

Podczas omawiania zestawu poprawek naprawiających problemy związane ze Spectre w kodzie listy połączonych, stało się jasne, że problem można rozwiązać z większą gracją, jeśli do jądra zostanie dopuszczony kod C zgodny z nowszą wersją standardu. Obecnie dodany kod jądra musi być zgodny ze specyfikacją ANSI C (C89), utworzoną w 1989 roku.

Problem w kodzie związany ze Spectre był spowodowany ciągłym używaniem oddzielnie zdefiniowanego iteratora po pętli — makro służy do iteracji po elementach połączonej listy, a ponieważ iterator pętli jest przekazywany do tego makra, jest to zdefiniowana poza samą pętlą i pozostaje dostępna po pętli. Użycie standardu C99 umożliwiłoby zdefiniowanie zmiennych pętli w bloku for(), co rozwiązałoby problem bez konieczności wymyślania obejść.

Linus Torvalds zgodził się z pomysłem wdrożenia obsługi nowszych specyfikacji i zaproponował przeniesienie jądra 5.18 na standard C11, opublikowany w 2011 roku. Podczas wstępnych testów montaż w GCC i Clang w nowym trybie przeszedł bez odchyleń. Jeśli podczas dokładniejszego testowania nie pojawią się żadne nieoczekiwane problemy, opcja „--std=gnu5.18” w skryptach kompilacji jądra 89 zostanie zastąpiona opcją „--std=gnu11 -Wno-shift-negative-value”. Rozważano także możliwość wykorzystania standardu C17, jednak w tym przypadku konieczne byłoby zwiększenie minimalnej obsługiwanej wersji GCC. Włączenie obsługi C11 wpisuje się w aktualne wymagania wersji GCC (5.1).

Źródło: opennet.ru

Dodaj komentarz