По време на обсъждането на набор от пачове за решаване на проблеми, свързани с уязвимостите от класа 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
