Bug 35523 - [e2k] regexec.c, ext/re/re_exec.c надо собирать с -O1 во избежание некорректной работы
Summary: [e2k] regexec.c, ext/re/re_exec.c надо собирать с -O1 во избежание некорректн...
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: perl (show other bugs)
Version: unstable
Hardware: e2k Linux
: P3 normal
Assignee: viy
QA Contact:
URL: https://bugzilla.redhat.com/show_bug....
Keywords:
Depends on:
Blocks: 40649
  Show dependency tree
 
Reported: 2018-10-18 13:53 MSK by Michael Shigorin
Modified: 2021-08-04 13:27 MSK (History)
6 users (show)

See Also:


Attachments
publican.diff "как есть" (810 bytes, patch)
2018-12-28 21:17 MSK, Michael Shigorin
no flags Details | Diff
модифицированный /usr/bin/publican (изначально из publican-4.3.2-alt3_9) (51.91 KB, text/plain)
2018-12-28 21:18 MSK, Michael Shigorin
no flags Details
Long.pm.diff "как есть" (815 bytes, patch)
2018-12-28 21:19 MSK, Michael Shigorin
no flags Details | Diff
модифицированный /usr/share/perl5/Getopt/Long.pm (изначально из perl-base-5.26.2-alt3) (80.91 KB, text/plain)
2018-12-28 21:21 MSK, Michael Shigorin
no flags Details
воспроизводилка проблемы (442 bytes, text/plain)
2019-06-12 17:41 MSK, Michael Shigorin
no flags Details
суженная воспроизводилка (221 bytes, text/plain)
2019-06-12 18:16 MSK, Michael Shigorin
no flags Details
perl.spec: ALT #35523 workaround (-O1 for regexec, re_exec) (2.66 KB, patch)
2019-06-14 17:12 MSK, Michael Shigorin
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Shigorin 2018-10-18 13:53:28 MSK
publican-4.3.2-alt3_9 у меня на e2k вылетает при сборке docs-alt-workstation:

make: Entering directory `/usr/src/RPM/BUILD/docs-alt-workstation-8.2-alt3'
publican build --config publican.cfg --brand_dir ru-RU/Common_Content/altlinux-brand --langs ru-RU --formats html-single --publish && touch tmp/ru-RU/html-single
publican only accepts one action you supplied '10': build & --config & publican.cfg & --brand_dir & ru-RU/Common_Content/altlinux-brand & --langs & ru-RU & --formats & html-single & --publish
 at /usr/bin/publican line 396.
make: *** [tmp/ru-RU/html-single] Error 2

...при этом publican-4.3.2-alt3_11 на сизифе не видит никаких проблем с аргументами (помнится, аналогично обстояло в сентябре и вроде бы в мае тоже).

От обычного вызова строка выше отличается "--brand_dir " вместо "--brand_dir=" -- на аэродинамику не влияет.

Проблема воспроизводится и автономно на самом publican:

x86_64$ $ publican build --help
build
    Transform XML to other formats (pdf, html, html-single,
    drupal-book, etc)
[...]

e2k$ publican build --help
publican only accepts one action you supplied '2': build & --help
 at /usr/bin/publican line 396.
Comment 1 Michael Shigorin 2018-12-28 21:17:13 MSK
Один добрый человек взялся посмотреть; пока докопались до того, что
в Getopt::Long не матчится регэксп в utf8, что попытались объехать добавлением
  utf8::encode $_ for @ARGV;
перед GetOptions( \%opts, @optns, ) в /usr/bin/publican,
после чего текущая картинка сдвинулась в сторону

FATAL ERROR: ru-RU/Book_Info.xml: No such file or directory at /usr/lib64/perl5/XML/Parser/Expat.pm line 466.
 at /usr/bin/publican line 1010.

-- т.е. по крайней мере опции были разобраны верно.

Начали с вставки между GetOptions и croak в /usr/bin/publican:

use Data::Dumper;
$Data::Dumper::Sortkeys=1;
warn Dumper \%opts, \@optns;

и заметили разницу между e2k и x86: http://paste.org.ru/?jf1356

Дальше дошли до отладки Long.pm (похаченая версия из hasher chroot прилагается вместе с diff), в итоге текущее предположение -- надо проверить на perl, собранном с -O0, вдруг это miscompilation (но тогда он происходит и на lcc-1.21.24, и на lcc-1.23.12 с одинаковым эффектом, это проверил).

Проверка -- попыткой пересборки docs-alt-workstation-8.2-alt3.src.rpm
(можно брать сизифный пакет).
Comment 2 Michael Shigorin 2018-12-28 21:17:59 MSK
Created attachment 7922 [details]
publican.diff "как есть"
Comment 3 Michael Shigorin 2018-12-28 21:18:57 MSK
Created attachment 7923 [details]
модифицированный /usr/bin/publican (изначально из publican-4.3.2-alt3_9)
Comment 4 Michael Shigorin 2018-12-28 21:19:46 MSK
Created attachment 7924 [details]
Long.pm.diff "как есть"
Comment 5 Michael Shigorin 2018-12-28 21:21:35 MSK
Created attachment 7925 [details]
модифицированный /usr/share/perl5/Getopt/Long.pm (изначально из perl-base-5.26.2-alt3)

Т.е. объезд совсем исходной проблемы в добуквенной формулировке найден
(--help отрабатывает штатно), но сборка документации всё-таки валится.
Comment 6 Michael Shigorin 2018-12-28 21:40:28 MSK
PS: ещё приборы и материалы:
http://paste.org.ru/?z0np29 -- тест, отрабатывает одинаково на e2k/x86;
http://paste.org.ru/?nmggwk -- publican debug на e2k, не разобрал опции;
http://paste.org.ru/?hccr38 -- publican debug на x86, _разобрал_ опции;

http://paste.org.ru/?mpfzl2 -- Match failed;
http://paste.org.ru/?xr3pn6 -- Match failed (в чруте, собранном lcc-1.23);
http://paste.org.ru/?5q5t08 -- utf8::encode $_ for @ARGV; и Match successful!.
Comment 7 wd 2018-12-31 11:36:16 MSK
можно еще попробовать собирать с LANG=C, тогда @ARGV не должен быть заюникоденным...
хотя use Encode в начале всеравно смущает
Comment 8 Michael Shigorin 2019-06-12 17:41:42 MSK
Created attachment 8165 [details]
воспроизводилка проблемы

Получили воспроизведение проблемы (5.26.2, собранный 1.23.12):

$ LANG=POSIX perl repro.pl --config фыв
$VAR1 = [
          "--config",
          "\321\204\321\213\320\262"
        ];

--config: 1
фыв: 0

$VAR1 = {};
$VAR2 = [
          "config=s"
        ];

_Без_ upgrade получаем разобранные опции.
Comment 9 Michael Shigorin 2019-06-12 18:16:18 MSK
Created attachment 8166 [details]
суженная воспроизводилка

В случае юникодности .* обламывается на втором символе при наличии /s:

$ perl repro2.pl a 
1
1
1
$ perl repro2.pl aa
1
1
0
$ perl repro2.pl aaa
1
1
0
$ _
Comment 10 viy 2019-06-12 19:34:48 MSK
use re 'debug'; показал, что проблема в SANY
смотрим код
regexec.c:

    case SANY:
        if (utf8_target) {
            while (scan < loceol && hardcount < max) {
                scan += UTF8SKIP(scan);
                hardcount++;
            }
        }
        else
            scan = loceol;
        break;

возможность проблемы в UTF8SKIP
utf8.h:
#ifdef DOINIT
EXTCONST unsigned char PL_utf8skip[] = {
/* 0x00 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
[...]
#else
EXTCONST unsigned char PL_utf8skip[];
#endif

Гипотеза: на эльбрусе при сборке не выставлен  DOINIT
Comment 11 Michael Shigorin 2019-06-12 19:43:17 MSK
(В ответ на комментарий №10)
> Гипотеза: на эльбрусе при сборке не выставлен  DOINIT
Да, не выставлен в config.h!
Comment 12 viy 2019-06-12 19:54:38 MSK
(In reply to comment #11)
> (В ответ на комментарий №10)
> > Гипотеза: на эльбрусе при сборке не выставлен  DOINIT
> Да, не выставлен в config.h!

DOINIT выставляется в INTERN.h
а если выбирается EXTERN.h, то нужен внешний сгенерированный файл
Comment 13 Michael Shigorin 2019-06-13 19:55:20 MSK
Было подозрение на массив PL_utf8skip в плане различной инициализации на e2k
и x86_64 -- не подтвердилось, таблица одинаково верно заполнена и там, и там:

$ objdump -s -j .rodata globals.o
[...]
 0400 01010101 01010101 01010101 01010101  ................
 0410 01010101 01010101 01010101 01010101  ................
 0420 01010101 01010101 01010101 01010101  ................
 0430 01010101 01010101 01010101 01010101  ................
 0440 01010101 01010101 01010101 01010101  ................
 0450 01010101 01010101 01010101 01010101  ................
 0460 01010101 01010101 01010101 01010101  ................
 0470 01010101 01010101 01010101 01010101  ................
 0480 01010101 01010101 01010101 01010101  ................
 0490 01010101 01010101 01010101 01010101  ................
 04a0 01010101 01010101 01010101 01010101  ................
 04b0 01010101 01010101 01010101 01010101  ................
 04c0 02020202 02020202 02020202 02020202  ................
 04d0 02020202 02020202 02020202 02020202  ................
 04e0 03030303 03030303 03030303 03030303  ................
 04f0 04040404 04040404 05050505 0606070d  ................
[...]
Comment 14 Michael Shigorin 2019-06-14 16:52:28 MSK
В общем, publican собирается perl, собранным с вот таким патчиком на спек:

 make
 
+%ifarch %e2k
+# http://bugzilla.altlinux.org/35523 workaround
+rm -f regexec.o libperl-%ver.so ext/re/re_exec.o
+make OPTIMIZE+='%optflags -O1' regexec.o
+make libperl-%ver.so
+make -C ext/re OPTIMIZE+='%optflags -O1' re_exec.o
+make -C ext/re all
+%endif
+
 %check

...и дальше собирает, скажем, docs-alt-workstation.

Похоже, это в силе как минимум для lcc 1.23.12 и 1.21.24.

Игорь, Андрей, спасибо!
Comment 15 Michael Shigorin 2019-06-14 17:12:35 MSK
Created attachment 8167 [details]
perl.spec: ALT #35523 workaround (-O1 for regexec, re_exec)
Comment 16 viy 2019-06-14 17:28:42 MSK
(In reply to comment #15)
> Created an attachment (id=8167) [details]
> perl.spec: ALT #35523 workaround (-O1 for regexec, re_exec)

приложил.
Comment 17 Michael Shigorin 2019-06-15 00:35:36 MSK
Спасибо!