Вопрос или проблема
С версией GNU bash, версия 5.2.32(1)-release (x86_64-pc-linux-gnu) в Debian эта команда:
$ printf '%010f\n' '1234'
000.000000
Не использует указанное число и изменяется при каждом выполнении? :
$ printf '%010f\n' '1234'
000.000000
$ printf '%010f\n' '1234'
-00.000000
$ printf '%010f\n' '1234'
-483727882220210383673538789311734784068460135136461336086484727908638813056859257411855537705282271270980907616349527085348099018785353082643221259209294558156190448714309764451049347540471064551446885137304830478611003880772998267972492798437861990242385390167399221730525636524535959100898865048044621829532180872869831407033533680957149104798943111261125290846584672637786950588494241537852501370987086890557439435578999950651169388180476906711478049091875710028706657130770652700584029129393783335159019276229170433952983735319574924819265320406630232536315336832562784656716950007939401275466624481927781927258325705879156330466999432612166518529539015750123768161816142453794507679229993846158691958525270639720288023359751521266391315728694060032591665637983258824799749300768142902211449165371138800414916337009245091261553826987554933951337065582043260565800658802960164297014952829986461975404403328316973961329623423683108873863706900026374773894180497513448143048382250942260806514095625959417231557222342591236652512686787828803609697693656123275076808865225369983011037611625663587582203365010071225681027800095427631778822391073362620068182757407019491657182878003911077240783559336224719331241350462550966676226233143230279692283620645084683412441335955962689659909099953181023376906230488367104.000000
1.- Может кто-нибудь воспроизвести это?
2.- Откуда bash читает эти значения?
3.- Из памяти компьютера?
ИЗМЕНЕНИЕ
Существует уже зарегистрированный баг здесь:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1078556
Из этого, код:
$ LC_ALL=C bash -c "printf '%.0f\n' 1.1"
Также демонстрирует проблему. Таким образом, это не связано с локализацией.
И выполнение:
$ valgrind bash -c 'printf %f 2'
Показывает, что используются “неинициализированные значение(я)”.
Это проблема безопасности, этот баг может быть использован для чтения значений памяти.
Ответ или решение
Проблема, с которой вы столкнулись, связана с некорректной работой команды printf
в вашей версии Bash на Debian. Исходя из представленной вами информации и вашего вывода, существует несколько ключевых моментов, на которые стоит обратить внимание.
1. Повторяемость проблемы
Проблема не является индивидуальной. Вы можете воспроизвести её на других системах с аналогичной версией Bash (5.2.32). Как вы показали, команды printf
возвращают разные значения при каждом запуске, что указывает на использование неинициализированной памяти. Такой нежелательный эффект может произойти из-за сбоев в реализации самого printf
.
2. Происхождение значений
Поскольку ваши запуски printf
показывают неопределённые (или «мусорные») значения, это указывает на то, что Bash может читать данные из памяти, которая не была предварительно инициализирована. В таких случаях компилятор может использовать область памяти, в которой хранятся другие значения, что приводит к непредсказуемому поведению, как в вашем случае.
3. Проверка через Valgrind
Вы правильно указали, что запуск с использованием valgrind
показывает наличие «неинициализированных значений». Это указывает на то, что есть потенциальные утечки памяти, и это действительно является проблемой безопасности. Это означает, что какая-то часть памяти используется без предварительной её инициализации, что может открывать доступ к конфиденциальным данным.
Решение и возможные действия:
-
Обновление Bash: Убедитесь, что вы используете последние обновления для Bash и других связанных библиотек. Эта проблема может быть исправлена в следующих выпусках.
-
Переход к другой версии ПО: Если обновление не решает проблему, вы можете рассмотреть возможность использования другой дистрибутива Linux или более ранней/поздней версии Bash.
-
Доклад об ошибке: Поскольку проблема уже зарегистрирована, вам стоит следить за обновлениями по адресу bugreport Debian, где разработчики могут предложить фикс или обходные пути.
-
Ограничение использования: Попробуйте избегать использования этой функции
printf
до тех пор, пока проблема не будет официально решена, поскольку она может быть связана с уязвимостями в системе.
Заключение
Это поведение printf
в вашей версии Bash действительно вызывает беспокойство в отношении безопасности и корректности работы приложения. Регулярный мониторинг сообщений о системных ошибках и установка обновлений будет способствовать поддержанию системной стабильности и безопасности.