Skip to content

Отладка сборки на актуальном GitHub’е#369

Merged
Mazdaywik merged 7 commits intomasterfrom
fail-actions
Nov 29, 2025
Merged

Отладка сборки на актуальном GitHub’е#369
Mazdaywik merged 7 commits intomasterfrom
fail-actions

Conversation

@Mazdaywik
Copy link
Member

@Mazdaywik Mazdaywik commented Nov 26, 2025

  • Использование upload-artifact@v4 в GitHub Actions
  • Исправление обнаруженной ошибки — новая версия GCC выдаёт предупреждение на отсутствие проверки возврата fgets().
  • Исправлена ошибка обобщённого сопоставления с повторными переменными.
  • Теперь случайные тесты с меньшей вероятностью упадут при недостатке памяти — подробнее в комментарии коммита 9a6eb2f.
  • Исправлена сборка на GCC C++ 15.2.0 при работе с пустым вектором.

@Mazdaywik Mazdaywik changed the title Использование upload-artifact@v4 в GitHub Actions Отладка сборки на обновлённом GitHub Nov 26, 2025
@Mazdaywik Mazdaywik changed the title Отладка сборки на обновлённом GitHub Отладка сборки на обновлённом GitHub’е Nov 28, 2025
Скорее всего, эта ошибка уже давно параллельно исправлена в ветке v3.4.
Исправления:
• Временно повышен порог допустимой памяти для случайных тестов, после
  вливания master в v3.4 следует всё вернуть обратно и отладить.
• На стадии LowLevelRASL устранено избыточное копирование.
• При генерации кода на C++ строки не копятся в памяти, а сразу же
  выписываются в целевой файл.
• В заголовке отладочного дампа при недостатке памяти указывается
  текущее её потребление.
@Mazdaywik Mazdaywik self-assigned this Nov 28, 2025
@Mazdaywik
Copy link
Member Author

@shkarupa, у меня всё работает.

@TonitaN, одобряешь запрос на слияние?

@Mazdaywik
Copy link
Member Author

@shkarupa, проблема была в работе с пустыми STL-векторами — индекс 0 выходил за пределы контейнера. В старых версиях, например, было

  new_table->external_memory.resize(fixed_part.external_size);
  read = fread(&new_table->external_memory[0], 1, fixed_part.external_size);

и когда величина fixed_part.external_size была равна нулю, проблем не возникало. Обращение к вектору new_table->external_memory[0] давало неопределённую ссылку, а взятие адреса от этой ссылки давало неопределённый адрес. Но проблем с этим адресом не возникало, т.к. функция fread() по этому адресу ничего не писала (писала ноль байт).

Однако, выход индекса за границы контейнера — это неопределённое поведение, Стандарт разрешает в этом случае происходить всему, чему угодно. Не только возвращать неопределённую ссылку, но и аварийно завершать программу, например, при помощи утверждения в отладочном режиме.

В итоге пришлось поправить код так, чтобы избегать обращений к неопределённым элементам у пустых векторов.

Попутно нашлось несколько других ошибок. Проблема с fgets() у меня где-то выскочила, но второй раз мне найти её не удалось. Но я её, тем не менее, исправил, т.к. предупреждения всегда исправляю. Две другие ошибки выявились случайными тестами, одну исправил, у второй смягчил последствия — в реальности нужно разбираться с этой проблемой в задачах #332 и #362.

@shkarupa
Copy link
Member

Passing special test in dir dynamic
Passing special test in dir 1-simple-load
*Compiling module.sref:
** Compilation succeeded **
*Compiling caller.ref:
caller.ref:6:38: WARNING: Suspicious repeated variable t.Handle [-Wrepeated]
caller.ref:7:52: WARNING: Suspicious repeated variable t.Handle [-Wrepeated]
+Linking ../../../lib/references/Library.rasl
** Compilation succeeded **
Success /home/damn/bmstu/refal-5-lambda/autotests/dynamic/1-simple-load/module.rasl-module 
/usr/include/c++/15.2.1/bits/stl_list.h:1650: std::__cxx11::list<_Tp, _Allocator>::reference std::__cxx11::list<_Tp, _Allocator>::front() [with _Tp = refalrts::Module*; _Alloc = std::allocator<refalrts::Module*>; reference = refalrts::Module*&]: Assertion '!this->empty()' failed.
./run.sh: line 6: 133993 Aborted                    (core dumped) ./caller
TEST FAILED!
TEST FAILED
TEST FAILED

Версия GCC — 15.2.1.

@Mazdaywik
Copy link
Member Author

Большое спасибо, @shkarupa!

В файле autotests/dynamic/1-simple-load/run.sh замените строчку

./caller

на

gdb --args ./caller

и запустите тест снова.

Когда отладчик попросит Вас ввести команду, введите run. Отлаживаемая программа упадёт с ошибкой, введите команду backtrace и скопируйте вывод сюда. Закройте отладчик при помощи команды quit и верните run.sh в предыдущее состояние. Именно так я нашёл предыдущие ошибки.

Хотя я догадываюсь, где ошибка (строчка 872), будет лучше предоставить более подробную диагностику.

@Mazdaywik
Copy link
Member Author

@shkarupa, выслал Вам приглашение. Может, тогда Вы сделаете ревью коммита, чтобы его можно было слить?

@shkarupa
Copy link
Member

Ошибка до коммита 0271b79:

*Compiling module.sref:
** Compilation succeeded **
*Compiling caller.ref:
caller.ref:6:38: WARNING: Suspicious repeated variable t.Handle [-Wrepeated]
caller.ref:7:52: WARNING: Suspicious repeated variable t.Handle [-Wrepeated]
+Linking ../../../lib/references/Library.rasl
** Compilation succeeded **
GNU gdb (GDB) 16.3
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./caller...
(gdb) run
Starting program: /home/damn/bmstu/refal-5-lambda/autotests/dynamic/1-simple-load/caller 

This GDB supports auto-downloading debuginfo from the following URLs:
  <https://debuginfod.archlinux.org>
Enable debuginfod for this session? (y or [n]) 
Debuginfod has been disabled.
To make this setting permanent, add 'set debuginfod enabled off' to .gdbinit.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
Success /home/damn/bmstu/refal-5-lambda/autotests/dynamic/1-simple-load/module.rasl-module 
/usr/include/c++/15.2.1/bits/stl_list.h:1650: std::__cxx11::list<_Tp, _Allocator>::reference std::__cxx11::list<_Tp, _Allocator>::front() [with _Tp = refalrts::Module*; _Alloc = std::allocator<refalrts::Module*>; reference = refalrts::Module*&]: Assertion '!this->empty()' failed.

Program received signal SIGABRT, Aborted.
0x00007ffff789890c in ?? () from /usr/lib/libc.so.6
(gdb) backtrace
#0  0x00007ffff789890c in ?? () from /usr/lib/libc.so.6
#1  0x00007ffff783e3a0 in raise () from /usr/lib/libc.so.6
#2  0x00007ffff782557a in abort () from /usr/lib/libc.so.6
#3  0x00007ffff7c9a41f in std::__glibcxx_assert_fail (file=<optimized out>, 
    line=<optimized out>, function=<optimized out>, condition=<optimized out>)
    at /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/assert_fail.cc:41
#4  0x00005555555793a4 in std::__cxx11::list<refalrts::Module*, std::allocator<refalrts::Module*> >::front (this=0x7fffffffcca8)
    at /usr/include/c++/15.2.1/bits/stl_list.h:1650
#5  0x00005555555725c0 in refalrts::Domain::ModuleStorage::splice_and_init (
    this=0x7fffffffe1d0, vm=0x7fffffffe2a0, pos=0x5555555e3d90, other=..., 
    result=@0x7fffffffce10: refalrts::cSuccess)
    at ../../../lib/scratch-rt/refalrts-dynamic.cpp:872
#6  0x0000555555573cac in refalrts::Domain::initialize (this=0x7fffffffe1a0, 
    vm=0x7fffffffe2a0, pos=0x5555555e3d90, new_module=0x5555555bdd90, 
    new_storage=..., 
    event=0x555555569784 <(anonymous namespace)::empty_module_loading_error_callback(refalrts::ModuleLoadingError, refalrts::ModuleLoadingErrorDetail*, void*)>, callback_data=0x0, result=@0x7fffffffce10: refalrts::cSuccess)
    at ../../../lib/scratch-rt/refalrts-dynamic.cpp:1174
#7  0x00005555555735a2 in refalrts::Domain::load_module (this=0x7fffffffe1a0, 
    vm=0x7fffffffe2a0, pos=0x5555555e3d90, name=0x7fffffffce50 "module", 
    event=0x555555569784 <(anonymous namespace)::empty_module_loading_error_call

Все ошибки были исправлены. Последний коммит поставил жирную точку в этом пулл-реквесте.

@shkarupa shkarupa self-requested a review November 29, 2025 14:13
@Mazdaywik
Copy link
Member Author

Всё верно, ошибка была в строке 872 файла refalrts-dynamic.cpp:

#5  0x00005555555725c0 in refalrts::Domain::ModuleStorage::splice_and_init (
    this=0x7fffffffe1d0, vm=0x7fffffffe2a0, pos=0x5555555e3d90, other=..., 
    result=@0x7fffffffce10: refalrts::cSuccess)
    at ../../../lib/scratch-rt/refalrts-dynamic.cpp:872

В остальных местах обращения к методам .front() у списков предварительно проверялись. Здорово, что в новом GCC добавили эти проверки — в случае списков проблема с неопределённым поведением ИМХО была серьёзнее (в теории). Хотя, скорее всего, там возвращался адрес фиктивного «объекта», на который «указывает» итератор .end(), и дальнейшие сравнения с ним были бы заведомо ложными.

@Mazdaywik Mazdaywik changed the title Отладка сборки на обновлённом GitHub’е Отладка сборки на актуальном GitHub’е Nov 29, 2025
@Mazdaywik Mazdaywik merged commit 359128b into master Nov 29, 2025
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants