- PVSM.RU - https://www.pvsm.ru -

Компиляция без предупреждений — что случилось в Linux-сообществе

Пару недель назад Линус Торвальдс активировал флаг -Werror для всех сборок ядра. Мнения сообщества касательно этого решения разделились. Против даже высказался разработчик фронтенда Clang и фреймворка LLVM. Обсуждаем ситуацию.

Unsplash / Markus Spiske
Unsplash / Markus Spiske

Warning’и не нужны

Год назад Линус Торвальдс в рассылке LKML рассказал [1], что перешел на gcc-10, и новые предупреждения компилятора (описания которых порой занимают целые абзацы) мешают работать над ядром — среди них сложно искать критические ошибки. Так, создатель Linux решил отключить warning’и, не представляющие интереса на конкретном этапе работы — например, restrict, stringop-overflow, array-bounds и zero-length-bounds. Но в начале сентября он предпринял довольно радикальный шаг в другом направлении и изменил [2] параметры компиляции кода ядра Linux для мейнтейнеров. Торвальдс активировал флаг -Werror в Makefile, благодаря которому компилятор начал интерпретировать [3] любое предупреждение как ошибку. Таким образом он хотел улучшить [4] качество получаемых pull-запросов.

Справедливости ради стоит заметить, что соответствующая опция также появилась в Kconfig (то есть -Werror можно было отключить), но инициатива все равно разделила ИТ-сообщество на два лагеря. Одни посчитали, что нововведение серьезно повысит качество кодовой базы. Другие заметили, что оно не принесет ничего, кроме «головной боли», а ситуацию с большим количеством предупреждений нужно решать [5] на стороне компиляторов — например, добавлением нескольких категорий фильтрации ошибок. Далее мы рассмотрим аргументы обеих сторон.

Сомнительное решение

Один из резидентов Hacker News в тематическом треде отметил [6], что обработка warning’ов при разработке программного обеспечения — это хорошая практика. Более того, предупреждения, касающиеся старого кода, могут скрывать [7] реальные проблемы и баги, требующие срочного исправления. Это — одна из причин, по которой флаг -Werror используют [8] многие разработчики. Однако можно привести контраргумент — большинство подобных проектов менее масштабные, чем Linux. В этом случае обработка всех предупреждений может оказаться не просто сложной, но невыполнимой задачей.

При этом на практике не все предупреждения компилятора одинаково полезны. Зачастую они не помогают программистам, а мешают и даже подталкивают к исправлениям правильного кода — эту тему еще несколько лет назад обсуждали на Хабре [9]. Чаще всего проблема возникает [10] при работе со старой кодовой базой. Разработчики компиляторов добавляют новые предупреждения, которых могло не быть во время написания оригинального кода.

Unsplash / Gerrie van der Walt
Unsplash / Gerrie van der Walt

Против решения Линуса Торвальдса также высказался Ник Десанье из Google, работающий над Clang [11] и LLVM [12]. Он даже предложил патч [13], возвращающий флаг в изначальное состояние. По словам [14] инженера, коллегам стоит внимательнее тестировать код на различных конфигурациях и серьезнее относиться к предупреждениям компилятора, но -Werror — слишком кардинальный шаг. Одним из немногих кейсов, когда этот флаг способен принести пользу, является защита «чистой» кодовой базы от ошибок. Эту точку зрения поддержал [15] коллега Ника — по его мнению, старые предупреждения в малоиспользуемых подсистемах не должны мешать разработке и тестированию целого ядра.

Найденный компромисс

В начале недели Линус Торвальдс признался [16], что «погорячился» с включением -Werror, и сообществу удалось прийти к компромиссу. Теперь соответствующий флаг будут использовать только для билдов COMPILE_TEST [17], которые часто проводят с использованием CI-систем. Соответствующий коммит Линус уже опубликовал [18]. Можно с уверенностью сказать, что вопрос не будут поднимать в ближайшем будущем — по крайней мере, до выпуска Linux kernel 5.15, намеченного [19] на ноябрь.

По словам разработчиков, это не самый масштабный релиз, но даже он включает несколько интересных компонентов. Например, в его состав войдет [20] новая реализация файловой системы NTFS от Paragon Software. Старый драйвер не обновлялся уже много лет, а новый привнесет дополнительную функциональность — расширенные атрибуты файлов, режим сжатия данных, списки доступа (ACL). Также можно ожидать появления драйверов для DMA [21]-движка PassThru от AMD.


Свежие посты из нашего блога на Хабре:


Особенности работы интернет-провайдеров — в нашем корп. блоге:


Автор: VAS Experts

Источник [28]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linus-torval-ds/367983

Ссылки в тексте:

[1] в рассылке LKML рассказал: https://lkml.org/lkml/2020/5/10/322

[2] изменил: https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.15-Werror

[3] интерпретировать: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Werror

[4] хотел улучшить: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3fe617ccafd6f5bb33c2391d6f4eeb41c1fd0151

[5] нужно решать: https://news.ycombinator.com/item?id=28466093

[6] отметил: https://news.ycombinator.com/item?id=28463888

[7] могут скрывать: https://stackoverflow.com/a/57842757

[8] используют: https://developers.redhat.com/blog/2021/05/07/use-multiple-compilers-to-build-better-projects

[9] обсуждали на Хабре: https://habr.com/ru/company/abbyy/blog/277261/

[10] возникает: https://embeddedartistry.com/blog/2017/05/22/werror-is-not-your-friend/

[11] Clang: https://ru.wikipedia.org/wiki/Clang

[12] LLVM: https://ru.wikipedia.org/wiki/LLVM

[13] предложил патч: https://lore.kernel.org/lkml/20210907183843.33028-1-ndesaulniers@google.com/

[14] словам: https://www.theregister.com/2021/09/08/compromise_linux_kernel_compiler_warnings/

[15] поддержал: https://lore.kernel.org/lkml/YTfkO2PdnBXQXvsm@elver.google.com/

[16] признался: https://www.theregister.com/2021/09/13/linux_5_15_rc1/

[17] COMPILE_TEST: https://github.com/torvalds/linux/blob/master/init/Kconfig

[18] уже опубликовал: https://github.com/torvalds/linux/commit/b339ec9c229aaf399296a120d7be0e34fbc355ca/

[19] намеченного: https://9to5linux.com/linus-torvalds-announces-first-linux-5-15-kernel-release-candidate

[20] войдет: https://lore.kernel.org/lkml/aa4aa155-b9b2-9099-b7a2-349d8d9d8fbd@paragon-software.com/

[21] DMA: https://en.wikipedia.org/wiki/Direct_memory_access

[22] QUIC стал RFC, но как дела с перспективами — обсуждаем мнения: https://habr.com/ru/company/vasexperts/blog/575422/

[23] Новый открытый VPN-протокол — на что обратить внимание: https://habr.com/ru/company/vasexperts/blog/575104/

[24] Что ждет Wi-Fi: три новых стандарта до 2024-го: https://habr.com/ru/company/vasexperts/blog/574098/

[25] Нужно ли российским провайдерам блокировать пиратский контент: https://vasexperts.ru/blog/nuzhno-li-blokirovat-piratsky-kontent-na-vnutrennem-urovne/

[26] Оптимизация сетей провайдера — как сделать все правильно: https://vasexperts.ru/blog/seti/optimizaciya-setej-provajdera/

[27] На что «пересесть» после ACCEL-PPP: https://vasexperts.ru/blog/bras/posle-accel-ppp/

[28] Источник: https://habr.com/ru/post/578778/?utm_source=habrahabr&utm_medium=rss&utm_campaign=578778