1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openharmony-arkcompiler_ets_frontend

 / Детали:

[Ошибка]: Создание ArenaUnorderedMap на стеке приводит к аварийному завершению программы (segfault), если удалить...

Предстоит сделать
Владелец
Создано  
04.03.2025

его после его контекста (Context)

Какова была проблема?

Когда копия карты externalSources_ выходит за пределы области видимости и уничтожается после уничтожения контекста, это приводит к сегментационному сбою.

Какое поведение ожидалось?

Карта должна проверять, действительно ли требуется освобождать память в деструкторе, а не вызывать сегментационный сбой. Для программы необходим деструктор, который бы учитывал это, а не использовал стандартный деструктор.

Как воспроизвести эту ошибку

Добавление следующего кода в конец файла lsp_api_test.cpp должно помочь воспроизвести ошибку:
Затем просто запустите команду ninja lsp_api_test && ./bin-gtests/lsp_api_test --gtest_filter=LSPAPITests.SegFaultBug

TEST_F(LSPAPITests, SegFaultBug)
{
    using std::string;
    using std::vector;
    using ark::es2panda::parser::Program;
    using ark::es2panda::ir::AstNode;
    using ark::es2panda::public_lib::Context;
    using ark::es2panda::lsp::Initializer;

    vector<string> fileNames;
    vector<string> fileContents;
    vector<vector<size_t>> tokenPositions;

    // Создание файла, где будет находиться токен, который будем искать
    fileNames.push_back("tokenFile.sts");
    fileContents.push_back("\nexport function dummy(x: number) {\nconsole.println(x);\n}\n");
    const size_t tokenOffset = 16;
    tokenPositions.push_back({tokenOffset});

    // Создание файла для поиска токена
    fileNames.push_back("referenceFile.sts");
    fileContents.push_back("import { dummy } from \"./tokenFile.sts\";\n\ndummy(123);\n");
    const size_t referenceOffset = 42;
    tokenPositions.push_back({referenceOffset});

    auto filePaths = CreateTempFile(fileNames, fileContents);
    const int expectedFileCount = 2;
    ASSERT_EQ(filePaths.size(), expectedFileCount);
}
``````cpp
auto ctx = CreateContextAndProceedToState(impl_, cfg_, fileContents[1].c_str(), filePaths[1].c_str(), ES2PANDA_STATE_CHECKED);
auto state = reinterpret_cast<Context*>(ctx)->state;
ASSERT_EQ(state, ES2PANDA_STATE_CHECKED);
auto program = reinterpret_cast<Context*>(ctx)->parserProgram;
auto externalSources = program->DirectExternalSources();
(void)externalSources;
impl_->DestroyContext(ctx);
printf("Контекст уничтожен\n");
// Сегментационный сбой происходит после выхода за пределы области видимости при уничтожении карты externalSources

Дополнительная информация

Ветка на самом деле называется OpenHarmony_feature_20241108, но этот вариант недоступен, поэтому выбрана ветка master

Информация о версии или ветке

  • master
  • 5.0-Beta1
  • Release 4.1
  • Release 4.0
  • Release 3.2

Комментарий (0)

GitLife Service Account Задача создана
GitLife Service Account добавлено
 
waiting_for_assign
label.
GitLife Service Account добавлено
 
bug
label.
Развернуть журнал операций

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/openharmony-arkcompiler_ets_frontend.git
git@api.gitlife.ru:oschina-mirror/openharmony-arkcompiler_ets_frontend.git
oschina-mirror
openharmony-arkcompiler_ets_frontend
openharmony-arkcompiler_ets_frontend