1c-syntax / bsl-language-server

Реализация Language Server Protocol для языка 1C (BSL)
https://1c-syntax.github.io/bsl-language-server
Other
299 stars 105 forks source link

[BUG] Падает разбор исходного кода, если в "Попытке" нет секции "Исключение" #1622

Open p0s0l opened 3 years ago

p0s0l commented 3 years ago

Версия: 08:37:17.167 INFO: SonarQube Scanner 3.0.3.778 08:37:17.167 INFO: Java 11.0.9.1 Ubuntu (64-bit) 08:37:17.167 INFO: Linux 4.15.0-55-generic amd64 08:37:17.436 INFO: SonarQube server 7.9.1 08:37:17.886 DEBUG: Plugins: 08:37:17.887 DEBUG: 1C (BSL) Community Plugin 1.8.1 (communitybsl) 08:37:17.887 DEBUG: Git 1.8.0.1574 (scmgit)

Сканер падает с ошибкой: 08:38:36 08:38:36.957 INFO: ------------------------------------------------------------------------ 08:38:36 08:38:36.957 INFO: EXECUTION FAILURE 08:38:36 08:38:36.957 INFO: ------------------------------------------------------------------------ 08:38:36 08:38:36.957 INFO: Total time: 1:19.826s 08:38:38 08:38:38.289 INFO: Final Memory: 1651M/5576M 08:38:38 08:38:38.289 INFO: ------------------------------------------------------------------------ 08:38:38 08:38:38.289 ERROR: Error during SonarQube Scanner execution 08:38:38 java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: 29 is not a valid line offset for pointer. File src/cf/CommonModules/СтатуснаяМодельСервер/Ext/Module.bsl has 18 character(s) at line 48 08:38:38 at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 08:38:38 at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 08:38:38 at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 08:38:38 at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) 08:38:38 at java.base/java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:600) 08:38:38 at java.base/java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:678) 08:38:38 at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:737) 08:38:38 at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159) 08:38:38 at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173) 08:38:38 at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233) 08:38:38 at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) 08:38:38 at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:661) 08:38:38 at com.github._1c_syntax.bsl.sonar.BSLCoreSensor.lambda$execute$4(BSLCoreSensor.java:167) 08:38:38 at java.base/java.util.HashMap.forEach(HashMap.java:1336) 08:38:38 at com.github._1c_syntax.bsl.sonar.BSLCoreSensor.execute(BSLCoreSensor.java:150) 08:38:38 at org.sonar.scanner.sensor.AbstractSensorWrapper.analyse(AbstractSensorWrapper.java:48) 08:38:38 at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:85) 08:38:38 at org.sonar.scanner.sensor.ModuleSensorsExecutor.lambda$execute$1(ModuleSensorsExecutor.java:59) 08:38:38 at org.sonar.scanner.sensor.ModuleSensorsExecutor.withModuleStrategy(ModuleSensorsExecutor.java:77) 08:38:38 at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:59) 08:38:38 at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:82) 08:38:38 at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136) 08:38:38 at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122) 08:38:38 at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:400) 08:38:38 at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:395) 08:38:38 at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:358) 08:38:38 at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136) 08:38:38 at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122) 08:38:38 at org.sonar.scanner.bootstrap.GlobalContainer.doAfterStart(GlobalContainer.java:141) 08:38:38 at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136) 08:38:38 at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122) 08:38:38 at org.sonar.batch.bootstrapper.Batch.doExecute(Batch.java:73) 08:38:38 at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:99) 08:38:38 at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:63) 08:38:38 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 08:38:38 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 08:38:38 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 08:38:38 at java.base/java.lang.reflect.Method.invoke(Method.java:566) 08:38:38 at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60) 08:38:38 at com.sun.proxy.$Proxy0.execute(Unknown Source) 08:38:38 at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:233) 08:38:38 at org.sonarsource.scanner.api.EmbeddedScanner.runAnalysis(EmbeddedScanner.java:151) 08:38:38 at org.sonarsource.scanner.cli.Main.runAnalysis(Main.java:123) 08:38:38 at org.sonarsource.scanner.cli.Main.execute(Main.java:77) 08:38:38 at org.sonarsource.scanner.cli.Main.main(Main.java:61) 08:38:38 Caused by: java.lang.IllegalArgumentException: 29 is not a valid line offset for pointer. File src/cf/CommonModules/СтатуснаяМодельСервер/Ext/Module.bsl has 18 character(s) at line 48 08:38:38 at org.sonar.api.internal.google.common.base.Preconditions.checkArgument(Preconditions.java:145) 08:38:38 at org.sonar.api.batch.fs.internal.DefaultInputFile.checkValid(DefaultInputFile.java:339) 08:38:38 at org.sonar.api.batch.fs.internal.DefaultInputFile.newPointer(DefaultInputFile.java:272) 08:38:38 at org.sonar.api.batch.fs.internal.DefaultInputFile.newRange(DefaultInputFile.java:288) 08:38:38 at com.github._1c_syntax.bsl.sonar.IssuesLoader.getTextRange(IssuesLoader.java:226) 08:38:38 at com.github._1c_syntax.bsl.sonar.IssuesLoader.getNewIssueLocation(IssuesLoader.java:215) 08:38:38 at com.github._1c_syntax.bsl.sonar.IssuesLoader.lambda$createIssue$0(IssuesLoader.java:117) 08:38:38 at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) 08:38:38 at com.github._1c_syntax.bsl.sonar.IssuesLoader.createIssue(IssuesLoader.java:109) 08:38:38 at com.github._1c_syntax.bsl.sonar.BSLCoreSensor.lambda$processFile$5(BSLCoreSensor.java:197) 08:38:38 at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) 08:38:38 at com.github._1c_syntax.bsl.sonar.BSLCoreSensor.processFile(BSLCoreSensor.java:197) 08:38:38 at com.github._1c_syntax.bsl.sonar.BSLCoreSensor.lambda$execute$3(BSLCoreSensor.java:172) 08:38:38 at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) 08:38:38 at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) 08:38:38 at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) 08:38:38 at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290) 08:38:38 at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746) 08:38:38 at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) 08:38:38 at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) 08:38:38 at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) 08:38:38 at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) 08:38:38 at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) 08:38:38 08:38:38.292 DEBUG: Execution getVersion 08:38:38 08:38:38.292 DEBUG: Execution stop

Пример кода

Процедура ИзменениеРеквизитовФормы(Форма, Отказ, СтандартнаяОбработка) Экспорт
    Если Форма.Параметры.Свойство("Ключ") 
        И Метаданные.ОпределяемыеТипы.ТипОбъектовДляИзмененияСтатусов.Тип.Типы().Найти(ТипЗнч(Форма.Параметры.Ключ)) <> Неопределено Тогда 
        // ... код ...
    ИначеЕсли Форма.ИмяФормы = "Справочник.ДоговорыКонтрагентов.Форма.ФормаСписка"
        ИЛИ Форма.ИмяФормы = "Справочник.ДоговорыКонтрагентов.Форма.ФормаСпискаПродажи"
        ИЛИ Форма.ИмяФормы = "Справочник.ДоговорыКонтрагентов.Форма.ФормаСпискаЗакупки" Тогда
        // ... код ...
    ИначеЕсли Форма.Параметры.Свойство("ТекущаяСтрока") Тогда
        Попытка
            ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Форма.Список.ОсновнаяТаблица);
        Исключение
            ОбъектМетаданных = Неопределено;
        КонецПопытки;       
        Если ОбъектМетаданных <> Неопределено Тогда
            Для Каждого Тип Из Метаданные.ОпределяемыеТипы.ТипОбъектовДляИзмененияСтатусов.Тип.Типы() Цикл
                Если Метаданные.НайтиПоТипу(Тип) = ОбъектМетаданных Тогда

                    Попытка
                        Форма.Элементы.СписокСтатус.Видимость = Ложь;   
                    КонецПопытки;

                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Конфигуратор ругается на такой код: {ОбщийМодуль.СтатуснаяМодельСервер.Модуль(48,6)}: Ожидается ключевое слово 'Исключение' ('Except') <<?>>КонецПопытки; (Проверка: Сервер)

Ожидаемое поведение Сканер не должен падать, но должна быть зарегистрирована ошибка по диагностике ParseError.

nixel2007 commented 3 years ago

Судя по стек-трейсу, какая-то диагностика возвращает неверный диапазон для позиционирования. Спасибо за репорт, проверим.

В сонар-плагине параллельно уже существует доработка, которая более мягко проверяет диапазоны и имеет некую fall back стратегию Для поиска диапазона рядом. Но в данном случае смотреть надо в том числе на стороне bsl ls.