LINUX.ORG.RU
ФорумTalks

bc 1.07.1 не за горами или эпичный баг версии 1.07

 , , ,


1

2

К сожалению, разработчики bc 1.07 допустили досадную ошибку, которая при определённых обстоятельствах зацикливает bc бесконечно. И эти обстоятельства возникают при сборке ядра Linux:

   * package version(s): bc 1.07-1
   Steps to reproduce:
   create a file "foobar.bc" with this line as content: foobar = read();
   run "echo 1 | bc -q foobar.bc"
   bc will spin at 100% CPU load. A strace log ends with
   read(0, "1\n", 4096) = 2
   read(0, "", 4096) = 0
   read(0, "", 4096) = 0
   read(0, "", 4096) = 0
   where it reads the 1 just like it should, but then it spins on reading empty strings forever.
   With bc 1.06 the same bc script works without issues.
   I don't know if this is an upstream bug or something with readline/edline/whatever specifically in Archlinux.
   This also breaks building the kernel, because make prepare runs echo 300 | bc -q kernel/time/timeconst.bc which
   then spins forever on read().
   Quick fix:
   execute.c:
   in function "int input_char (void)"
   Change the lines:
   if (in_ch <= ' ')
   return (' ');
   To:
   if (in_ch <= ' ')
   return (':');
   I'll be doing a 1.07.1 release shortly that has a few other tweaks,
   but this fix will stop the read() bug.

★★★★★

Я тот ещё псих, но даже я устал проявлять к тебе толерантность. Да я вообще от тебя устал. В игнор. Ты слишком упорот даже по поим меркам.

Stahl ★★☆
()
Ответ на: комментарий от cetjs2

а в прошлой версии такого не было?

Да, в версии 1.06.x такого не было.

saahriktu ★★★★★
() автор топика

т.е. bc ломает сборку ядра?

Жесть. Каждый коммит в bc должен проходить review со стороны Торвальдса лично! :D

Harald ★★★★★
()

Я не читал код bc, но явно ошибка вызвана исключительно тем, что из bc до сих пор не удалили устаревшую и ненужную поддержку однобайтных кодировок. Ну где ж это видано, чтобы чар сравнивали с однобайтным числом вместо полноценной проверки глифа на валидность значения..

redgremlin ★★★★★
()
Ответ на: комментарий от Harald

т.е. bc ломает сборку ядра?

Да. При сборке ядра скрипт вызывает bc, который начинает бесконечно считывать пустые строки загружая проц на 100%. Но, можно его пропатчить.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от redgremlin

Какого ещё глифа?

  int in_ch;

  /* Get a character from the standard input for the read function. */
  in_ch = getchar();
...
   if (in_ch <= ' ')
   return (':');
int getchar(void);

saahriktu ★★★★★
() автор топика

Разработчик какой-то упоротый, столько лет разрабатывал после последней альфы и такой баг влепил в релизе. Ещё впихнул на пустом месте зависимость от ed.

rst
()

Предыдущий релиз был 17 лет назад. Сложно представить сколько займёт это «не загорами».

rst
()
Ответ на: комментарий от saahriktu

in_ch = getchar();

Ну так вот и источник ошибки. getchar, несмотря на название, в си возвращает не чар, а байт. А байт, как известно, чар вместить не может. Тут спасёт только глубокий рефакторинг bc, где все подобные грубые ошибки будут исправлены.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

байт спокойно вмещает char. А вот wide char - это уже 4 байта. И для его возвращения другая функция:

wint_t getwchar(void);

А ошибка в обработке данных. Вместо пробела нужно возвращать двоеточие.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 2)
Ответ на: комментарий от rst

Так всё было стабильно. Вот потихоньку пилили, пилили,... И допилили, но не учли несколько моментов. Теперь обкатали на практике. Теперь можно и пропатчить.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от redgremlin

Ну так вот и источник ошибки. getchar, несмотря на название, в си возвращает не чар, а байт.

Что за чушь вы несете? int getchar(void);

andreyu ★★★★★
()
Ответ на: комментарий от gadfly

Вот такой у них Юникод :) Образца начала 1990-х.

Имхо, чтобы работать с символами выше 65536 программа должна не пользоваться системными вызовами.

question4 ★★★★★
()

вопиющее неуважение как к !Ъ, так и к Ъ. язабан.

// ссылочку-то можно?

Deleted
()
Ответ на: комментарий от gadfly

С тем же успехом можно в utf8 всё держать.

Безусловно. Но майкрософт всегда идет своим путем.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.