Для Linux 5.18 планируется перенести код на более актуальную версию C с целью решения различных проблем. 

Что такое Linux и для чего он нужен?

В процессе обсуждение разработчиков ядра линукса о иl тема набора патчи для исправления уязвимостей Spectre в коде для работы со связанными списками, стало ясно для многих разработчиков проблема может быть решена легче, если было разрешено в коде ядра C que соответствует более новой версии стандарта. 

И дело в том, что в настоящее время код, добавляемый в ядро ​​Linux, должен соответствовать спецификации ANSI C (C89), которая была сформирована в 1989 году.

Оттого проблема, связанная со Spectre в коде было потому что se продолжал использовать итератор определяется отдельно после цикла.

Несмотря на свою в целом быструю природу, проект ядра опирается на ряд старых инструментов. В то время как критики любят сосредотачиваться на широком использовании электронной почты сообществом, возможно, более значительным анахронизмом является использование версии 1989 года стандарта языка C для кода ядра, стандарта, который был кодифицирован до того, как проект ядра начался более 30 лет назад. Похоже, эта давняя практика может закончиться, как только ядро ​​5.18 ожидается в мае этого года.

Упоминается, что макрос используется для перебора элементов связанного списка, а поскольку итератор цикла передается этому макросу, он определяется вне самого цикла и остается доступным после окончания цикла. Использование стандарта C99 позволило бы разработчикам определять переменные для цикла в блоке for(), что решило бы проблему, не придумывая обходные пути.

К сожалению, в ядре есть несколько мест, где список
итератор используется после цикла, который прерывается при таком изменении. к счастью
есть скрипт use_after_iter.cocci, который можно использовать для идентификации таких
кодовые места. Мне пришлось немного адаптировать скрипт, так как он уменьшает ложные
положительные моменты в исходном варианте использования, но они имеют отношение к этому патчу.

В большом количестве сообщаемых местоположений кода итератор списка используется только после
цикл, если был ранний выход (break/goto) и поэтому они не
Соответствующий.

Со своей стороны, Линус Торвальдс согласился с идеей чтобы иметь возможность реализовать поддержку более новых спецификаций, а также предложил перейти на ядро ​​​​5.18 для использования стандарта C11, выпущенного в 2011 году.

После этого при предварительной проверке подключение к GCC и Clang в новом режиме прошло без отклонений. Если не возникнут непредвиденные проблемы из-за более тщательного тестирования, сценарии сборки ядра 5.18 изменят параметр «–std=gnu89» на «–std=gnu11 -Wno-shift-negative-value».

Линусу Торвальдсу патч не очень понравился, и он не увидел, как он связан со спекулятивными уязвимостями выполнения. Однако после того, как Кошель объяснил ситуацию, Торвальдс согласился, что «это обычная ошибка, обычная и простая», и сказал, что ее следует исправить независимо от более крупной серии. Но затем он углубился в настоящий источник проблемы: итератор, передаваемый в макросы обхода списка, должен быть объявлен в области видимости вне самого цикла:

Основная причина такого рода неспекулятивных ошибок заключается в том, что исторически у нас не было «объявления переменных в циклах» в стиле C99. Таким образом, list_for_each_entry() — и все остальные — принципиально всегда отфильтровывают последнюю запись HEAD из цикла просто потому, что мы не можем объявить переменную итератора в самом цикле.

Также стоит отметить, что рассматривалась возможность использования стандарта С17, но в этом случае необходимо было бы увеличить минимальную поддерживаемую версию GCC, так как включение поддержки C11 соответствует текущим требованиям для версии GCC (5.1).

В конце концов если вам интересно узнать об этом больше, вы можете проверить подробности в по следующей ссылке.


Будьте первым, чтобы комментировать

Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: AB Internet Networks 2008 SL
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.