Похоже, printf не работает в bash

Вопрос или проблема

С версией 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 показывает наличие «неинициализированных значений». Это указывает на то, что есть потенциальные утечки памяти, и это действительно является проблемой безопасности. Это означает, что какая-то часть памяти используется без предварительной её инициализации, что может открывать доступ к конфиденциальным данным.

Решение и возможные действия:

  1. Обновление Bash: Убедитесь, что вы используете последние обновления для Bash и других связанных библиотек. Эта проблема может быть исправлена в следующих выпусках.

  2. Переход к другой версии ПО: Если обновление не решает проблему, вы можете рассмотреть возможность использования другой дистрибутива Linux или более ранней/поздней версии Bash.

  3. Доклад об ошибке: Поскольку проблема уже зарегистрирована, вам стоит следить за обновлениями по адресу bugreport Debian, где разработчики могут предложить фикс или обходные пути.

  4. Ограничение использования: Попробуйте избегать использования этой функции printf до тех пор, пока проблема не будет официально решена, поскольку она может быть связана с уязвимостями в системе.

Заключение

Это поведение printf в вашей версии Bash действительно вызывает беспокойство в отношении безопасности и корректности работы приложения. Регулярный мониторинг сообщений о системных ошибках и установка обновлений будет способствовать поддержанию системной стабильности и безопасности.

Оцените материал
Добавить комментарий

Капча загружается...