В процес на обсъждане на пакета с пачове за решаване на уязвимости от класa Spectre в кода за работа с свързани списъци, стана ясно, че проблемът би могъл да бъде разрешен по-елегантно, ако кодът на езика C, който се добавя в ядрото, отговаряше на по-нова версия на стандарта. В момента добавеният в ядрото код трябва да отговаря на спецификацията на ANSI C (C89), изготвена още през 1989 година.
Проблемата, свързана със Spectre, в кода беше причинена от продължаващото използване на отделно определен итератор след цикъла — макросът се използва за обхождане на елементите на свързания списък и тъй като итераторът на цикъла се предава на този макрос, той се дефинира извън самия цикъл и остава достъпен след цикъла. Използването на стандарта C99 би могло да позволи определяне на променливи в цикъла в блока for(), което би решило проблема без необходимост от заобиколни решения.
Линус Торвалдс се съгласи с идеята за реализиране на поддръжка на по-нови спецификации и предложи в ядрото 5.18 да се премине към използване на стандарта C11, публикуван през 2011 година. При предварителната проверка, компилацията в GCC и Clang в новия режим премина без проблеми. Ако при по-подробно тестване не възникнат неочаквани проблеми, в скриптовете за компилация на ядрото 5.18 опцията '—std=gnu89' ще бъде заменена с '—std=gnu11 -Wno-shift-negative-value'. Обсъждаше се възможността и за използване на стандарта C17, но в такъв случай би трябвало да се повиши минимално поддържаната версия на GCC. Включването на поддръжка за C11 отговаря на текущите изисквания за версия на GCC (5.1).
Източник: opennet.ru
