30.06.2022

В ядре Linux 5.18 планируют разрешить использование стандарта языка Си C11

В процессе обсуждения набора патчей с исправлением связанных с уязвимостями класса Spectre проблем в коде для работы со связанными списками, стало ясно, что проблему удалось бы решить более изящно, если бы в ядро допускался код на языке Си, соответствующий более новой версии стандарта. В настоящее время добавляемый ядро код должен соответствовать спецификации ANSI C (С89), сформированной ещё в 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).

Источник.