Из ядра Linux выпилили strncpy: шесть лет, 362 коммита, одна функция

Шесть лет обсуждений, 362 коммита, десятки тысяч строк изменённого кода. Всё это ради удаления одной, казалось бы, безобидной функции. strncpy, долгие годы считавшаяся «безопасной» альтернативой strcpy, наконец изгнана из ядра Linux. Разработчики признали: она не только не защищает от переполнения буфера, но и создаёт ложное чувство безопасности. Почему этот момент стал историческим для сообщества и что пришло на смену? Давайте разбираться.
Проблема strncpy: почему её решили удалить
На первый взгляд strncpy кажется разумным решением: скопировать не более n символов, чтобы не выйти за границы буфера. Но её семантика полна неочевидных ловушек. Во-первых, если исходная строка длиннее n, функция не добавляет завершающий нулевой символ — буфер остаётся «не-terminated». Во-вторых, если исходная строка короче n, strncpy добивает остаток нулями, что приводит к излишним операциям. В ядре Linux эти особенности неоднократно становились источниками уязвимостей: баги в драйверах, файловых системах и сетевом стеке.
«strncpy — это медленная, запутанная и небезопасная функция. Она должна быть запрещена в любом серьёзном проекте», — написал один из мейнтейнеров ядра в обсуждении на LKML. Статические анализаторы, такие как Coccinelle и smatch, выявили сотни мест, где использование strncpy могло привести к ошибкам. Именно это и послужило триггером для масштабного рефакторинга.
Шесть лет борьбы: как проходило удаление
Первые предложения удалить strncpy появились ещё в 2018 году. Тогда сообщество раскололось: одни считали, что функция всё ещё полезна в legacy-коде, другие настаивали на её полном искоренении. Процесс шёл поэтапно: сначала скрипты проанализировали каждое вхождение, затем для каждого случая подобрали правильную замену — чаще всего strscpy или memcpy. Каждый коммит проходил ревью у мейнтейнера соответствующей подсистемы. В итоге за 6 лет было отправлено 362 коммита, которые постепенно вычистили все использования из исходного кода. И вот, начиная с версии 6.14, strncpy больше не считается частью ядра Linux.
В чем суть? Это не просто технический апгрейд. Это сигнал всему сообществу: безопасность должна быть встроенной, а не имитированной. Вы не можете полагаться на функцию, которая при переполнении просто молча обрезает строку, не предупреждая вас об ошибке.
Альтернативы: что пришло на смену
Вместо strncpy разработчикам предлагаются две основные функции: strlcpy и strscpy. Обе гарантируют нуль-терминацию, но ведут себя по-разному при переполнении. strlcpy возвращает длину исходной строки, что может привести к скрытым ошибкам, если забыть проверить результат. strscpy возвращает -E2BIG в случае обрезания, что удобно для обработки ошибок. Именно strscpy рекомендована в современном коде ядра.
- strncpy — нуль-терминация: нет (если строка длиннее n). Поведение при переполнении: не обрезает, нет нуля. Безопасность: низкая. Статус: удалена.
- strlcpy — нуль-терминация: да. Поведение при переполнении: обрезает, возвращает длину источника. Безопасность: средняя. Статус: используется реже.
- strscpy — нуль-терминация: да. Поведение при переполнении: обрезает, возвращает -E2BIG. Безопасность: высокая. Статус: рекомендована.
Личное наблюдение автора. Как программист, писавший на C ещё в университете, я сам не раз использовал strncpy, думая, что делаю код безопаснее. Потом, разбирая чужие баги, понял, насколько коварна эта функция. Приятно видеть, что даже в таком консервативном проекте, как Linux, возможны радикальные изменения, если они действительно повышают качество кода.
Практические выводы для разработчиков
Если вы пишете код для пользовательского пространства или встраиваемых систем, не повторяйте ошибок ядра. Откажитесь от strncpy в пользу strscpy или, если окружение позволяет, используйте более современные языки с безопасной работой со строками. В любом случае, всегда проверяйте документацию и не доверяйте слепо «безопасным» функциям. Помните: функция, которая не может вернуть ошибку при переполнении, — это бомба замедленного действия.
Резюме от автора. Удаление strncpy — это не просто очистка кода. Это победа здравого смысла над ложным чувством безопасности. Не ждите, пока ваш проект станет следующим «ядерным» примером того, как неправильная абстракция приводит к уязвимостям. Меняйте привычки сейчас.












