его после его контекста (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
Вход Перед тем как оставить комментарий