Open
Labels
bugSomething isn't workingSomething isn't working
Description
Описание
Продолжение #401, которое PR #403 не покрывает. #403 убирает падения экстрактора на цепочках if / else if примерно до 2200 условий. Дальше начинаются два отказа на стороне Roslyn. Оба возникают раньше flow-прохода, поэтому пропуск метода по лимиту spec §4.2 их не ловит.
- ≈ 2300–2900 условий: падение всего прогона. Первый семантический запрос к такому методу (сейчас это
ProtocolLowering.CheckBoundary→MethodOf→model.GetSymbolInfo) строит карту биндеров. Roslyn бросаетSystem.InsufficientExecutionStackException, экстрактор её не перехватывает, и без фактов остаётся весь репозиторий:Код выхода 3762504530 (0xE0434352).Unhandled exception. System.InsufficientExecutionStackException: Insufficient stack to continue executing the program safely. at Microsoft.CodeAnalysis.CSharp.LocalBinderFactory.VisitIfStatement (×2387) ... at ProtocolLowering.MethodOf(...) ProtocolLowering.cs:line 674 at ProtocolLowering.CheckBoundary(...) ProtocolLowering.cs:line 362 at Program.<Main>$ Program.cs:line 7317 - ≥ 3000 условий: тихая потеря файла. Парсер Roslyn отказывается от вложенности. Экстрактор отрабатывает с rc 0, но из файла не получается ни одного метода (
coverage: 0/0). Пропадает и соседний методLeaky()с настоящей утечкой, и в статистике это никак не отражено.
Замеры на ветке fix/401-extractor-depth (после #403, Windows, .NET 8). Входной файл тот же, что генерирует tests/test_extractor_deep_flow.py::_source(n):
| n | rc | методов во flow | соседняя утечка |
|---|---|---|---|
| 1500, 2000, 2200 | 0 | 1 из 2 (глубокий пропущен) | найдена |
| 2500, 2800 | 3762504530 (InsufficientExecutionStackException) |
— | — |
| 3000 | 0 | 0 из 0 | не найдена |
Пороги зависят от размера стека потока, так что на Linux и macOS они будут другими.
Как воспроизвести
python - <<'EOF'
import sys; sys.path.insert(0, "tests")
from test_extractor_deep_flow import _source
import os; os.makedirs("repro", exist_ok=True)
open("repro/Chain.cs", "w").write(_source(2500))
EOF
dotnet frontend/roslyn/OwnSharp.Extractor/bin/Release/net8.0/ownsharp-extract.dll repro -o facts.json --flow-locals --statsОжидаемое поведение
Прогон не падает. Метод, который Roslyn не может связать или разобрать, учитывается как пропущенный в статистике (или как предупреждение о покрытии), а остальные методы и файлы анализируются.
Возможные направления, требующие оценки:
- перехватывать
InsufficientExecutionStackExceptionвокруг семантической работы с отдельным методом или файлом; - запускать извлечение в потоке с увеличенным стеком;
- сообщать в
--stats, что парсер отбросил файл.
Версия / коммит
Python
3.12.10
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working
Activity