интересно только программистам
Oct. 8th, 2006 11:01 pmПытаясь понять, почему моя программа не выводит текст так, как я хочу, обнаружил баг в одной из стандартных функций языка Перл. Подробности под катом - понятны будут только тем, кто знает Перл.
Баг в функции sprintf. Он проявляется, когда при выводе строки (аргумент %s), которая к тому же содержит широкие символы в UTF-8 (напр. русские буквы), используются одновременно оба ограничения на длину - минимальное и максимальное - и они равны. Ниже копирую вывод моей тест-программы, которая изолирует баг, и демонстрирует, при каких вызовах функции он происходит.
Первые две пары вызовов printf демонстрируют баг, остальные - его отсутствие при других аргументах.
printf('%-3.3s', 'абвгд'): |абв |
printf('%-3.3s', '01234'): |012|
printf('%3.3s', 'абвгд'): | абв|
printf('%3.3s', '01234'): |012|
printf('%3s', 'абвгд'): |абвгд|
printf('%3s', '01234'): |01234|
printf('%.3s', 'абвгд'): |абв|
printf('%.3s', '01234'): |012|
printf('%3.4s', 'абвгд'): |абвг|
printf('%3.4s', '01234'): |0123|
Проверил, что баг содержится и в самой последней версии языка. Теперь надо посмотреть, сколько осталось пороха в пороховницах и насколько будет легко его починить...