Установка последнего символа целевого массива на '\0'
явно представляется бесполезной, если snprintf
соответствует стандарту C.
Обратите внимание, однако, что ядро Linux использует свою собственную версию библиотеки C, которая можетили может не соответствовать стандарту C.Большинство функций старше, чем стандарт C99, где впервые было указано snprintf
, что может объяснять различия в реализации.Текущая версия реализации ядра snprintf
устанавливает нулевой терминатор.Похоже, что опубликованный код получен из кода пользователя, а не кода ядра, так что это не имеет значения.
Обратите также внимание, что некоторые библиотеки C имеют нестандартное поведение.Например, библиотека времени выполнения Microsoft C не поддерживала расширения C99 в течение почти 15 лет после ее публикации и все еще не полностью соответствует по различным причинам.Например, snprintf
имеет нестандартное поведение для преобразования %n
.
Обратите также внимание, что некоторые расширения Microsoft с именами, очень похожими на стандартные функции, ведут себя удивительным и запутанным образом.Например, _snprintf()
не будет устанавливать нулевой терминатор в целевом массиве, если выходные данные будут усечены.см. эту страницу документации для подробностей.
Для размещенного кода библиотека C вряд ли поступит от Microsoft, но ядро linux может использоваться в системах с различными библиотеками C: GNU libc используется для большинства настольных дистрибутивов, но Android, например, использует другую библиотеку.Автор фрагмента кода:
- не полностью понимает стандарт C и написал избыточный код.
- не доверяет реализации локальной библиотеки C и не хочетпредположим,
snprintf
записывает нулевой терминатор. - использует защитное программирование по привычке и на всякий случай пишет избыточный код.