SonarQube Java分析器应该能够分析语义不正确的Java源代码吗?

SonarQube Java分析器应该能够分析语义不正确的Java源代码吗?,java,sonarqube,Java,Sonarqube,给定以下java源代码 public class Test { private static int a; private static int a; } 您在分析过程中会遇到错误,这是预期的吗?我认为应该将日志记录为解析器故障,而不是停止分析,对吗 ERROR: Error during Sonar runner execution org.sonar.runner.impl.RunnerException: Unable to execute Sonar at org.so

给定以下java源代码

public class Test {
  private static int a;
  private static int a;
}
您在分析过程中会遇到错误,这是预期的吗?我认为应该将日志记录为解析器故障,而不是停止分析,对吗

ERROR: Error during Sonar runner execution
org.sonar.runner.impl.RunnerException: Unable to execute Sonar
    at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:91)
    at org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69)
    at org.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50)
    at org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102)
    at org.sonar.runner.api.Runner.execute(Runner.java:100)
    at org.sonar.runner.Main.executeTask(Main.java:70)
    at org.sonar.runner.Main.execute(Main.java:59)
    at org.sonar.runner.Main.main(Main.java:53)
Caused by: org.sonar.squidbridge.api.AnalysisException: SonarQube is unable to analyze file : '/home/administrator/tmp/frameworks/av/Test.java'
    at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:102)
    at org.sonar.java.ast.JavaAstScanner.scan(JavaAstScanner.java:75)
    at org.sonar.java.JavaSquid.scanSources(JavaSquid.java:131)
    at org.sonar.java.JavaSquid.scan(JavaSquid.java:124)
    at org.sonar.plugins.java.JavaSquidSensor.analyse(JavaSquidSensor.java:86)
    at org.sonar.batch.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:59)
    at org.sonar.batch.phases.SensorsExecutor.execute(SensorsExecutor.java:51)
    at org.sonar.batch.phases.DatabaseModePhaseExecutor.execute(DatabaseModePhaseExecutor.java:120)
    at org.sonar.batch.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:264)
    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
    at org.sonar.batch.scan.ProjectScanContainer.scan(ProjectScanContainer.java:235)
    at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:230)
    at org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:220)
    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
    at org.sonar.batch.scan.ScanTask.scan(ScanTask.java:57)
    at org.sonar.batch.scan.ScanTask.execute(ScanTask.java:45)
    at org.sonar.batch.bootstrap.TaskContainer.doAfterStart(TaskContainer.java:135)
    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
    at org.sonar.batch.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:158)
    at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:95)
    at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:67)
    at org.sonar.runner.batch.IsolatedLauncher.execute(IsolatedLauncher.java:48)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87)
    ... 9 more
Caused by: java.lang.IllegalArgumentException: duplicate key: a
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)
    at com.google.common.collect.RegularImmutableMap.<init>(RegularImmutableMap.java:72)
    at com.google.common.collect.ImmutableMap$Builder.fromEntryList(ImmutableMap.java:221)
    at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:207)
    at org.sonar.java.checks.HiddenFieldCheck.visitNode(HiddenFieldCheck.java:94)
    at org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:89)
    at org.sonar.java.ast.visitors.SubscriptionVisitor.visitChildren(SubscriptionVisitor.java:115)
    at org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:91)
    at org.sonar.java.ast.visitors.SubscriptionVisitor.scanTree(SubscriptionVisitor.java:72)
    at org.sonar.java.ast.visitors.SubscriptionVisitor.scanFile(SubscriptionVisitor.java:65)
    at org.sonar.java.checks.SubscriptionBaseVisitor.scanFile(SubscriptionBaseVisitor.java:33)
    at org.sonar.java.checks.HiddenFieldCheck.scanFile(HiddenFieldCheck.java:80)
    at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:123)
    at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:94)
    ... 38 more
错误:执行Sonar runner时出错
org.sonar.runner.impl.RunnerException:无法执行sonar
位于org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:91)
位于org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75)
位于java.security.AccessController.doPrivileged(本机方法)
位于org.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69)
位于org.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50)
位于org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102)
位于org.sonar.runner.api.runner.execute(runner.java:100)
位于org.sonar.runner.Main.executeTask(Main.java:70)
位于org.sonar.runner.Main.execute(Main.java:59)
位于org.sonar.runner.Main.Main(Main.java:53)
原因:org.sonar.squidbridge.api.AnalysisException:SonarQube无法分析文件:'/home/administrator/tmp/frameworks/av/Test.java'
位于org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:102)
在org.sonar.java.ast.JavaAstScanner.scan(JavaAstScanner.java:75)上
位于org.sonar.java.JavaSquid.scanSources(JavaSquid.java:131)
位于org.sonar.java.JavaSquid.scan(JavaSquid.java:124)
位于org.sonar.plugins.java.JavaSquidSensor.analysis(JavaSquidSensor.java:86)
位于org.sonar.batch.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:59)
位于org.sonar.batch.phases.SensorsExecutor.execute(SensorsExecutor.java:51)
位于org.sonar.batch.phases.DatabaseModePhaseExecutor.execute(DatabaseModePhaseExecutor.java:120)
位于org.sonar.batch.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:264)
位于org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
位于org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
位于org.sonar.batch.scan.ProjectScanContainer.scan(ProjectScanContainer.java:235)
在org.sonar.batch.scan.ProjectScanContainer.scanRecursive上(ProjectScanContainer.java:230)
位于org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:220)
位于org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
位于org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
位于org.sonar.batch.scan.scanstask.scan(scanstask.java:57)
位于org.sonar.batch.scan.scanstask.execute(scanstask.java:45)
位于org.sonar.batch.bootstrap.TaskContainer.doAfterStart(TaskContainer.java:135)
位于org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
位于org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
位于org.sonar.batch.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:158)
位于org.sonar.batch.bootstrapper.batch.executeTask(batch.java:95)
位于org.sonar.batch.bootstrapper.batch.execute(batch.java:67)
在org.sonar.runner.batch.IsolatedLauncher.execute(IsolatedLauncher.java:48)上
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87)
... 9更多
原因:java.lang.IllegalArgumentException:重复键:a
位于com.google.common.base.premissions.checkArgument(premissions.java:115)
位于com.google.common.collect.regulammutablemap.(regulammutablemap.java:72)
位于com.google.common.collect.ImmutableMap$Builder.fromEntryList(ImmutableMap.java:221)
位于com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:207)
位于org.sonar.java.checks.HiddenFieldCheck.visitNode(HiddenFieldCheck.java:94)
访问org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:89)
访问org.sonar.java.ast.visitors.SubscriptionVisitor.visitChildren(SubscriptionVisitor.java:115)
访问org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:91)
位于org.sonar.java.ast.visitors.SubscriptionVisitor.scanTree(SubscriptionVisitor.java:72)
位于org.sonar.java.ast.visitors.SubscriptionVisitor.scanFile(SubscriptionVisitor.java:65)
位于org.sonar.java.checks.SubscriptionBaseVisitor.scanFile(SubscriptionBaseVisitor.java:33)
位于org.sonar.java.checks.HiddenFieldCheck.scanFile(HiddenFieldCheck.java:80)
位于org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:123)
位于org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:94)
... 38多

此源代码无法编译,因此我们也不希望SonarQube Java Analyzer能够分析这段代码。但是错误消息应该更有意义。我创建了以下Jira通知单:

事情比一条错误消息要复杂一些。这里stacktrace表示失败发生在检查过程中,而不是语义分析过程中(应该失败),我将用一条注释更新记录单。是的,这就是我的意思,在分析此类源代码时,您应该报告一个解析器错误,而不是停止分析。@MaksonLee不,我们肯定应该失败分析(这里确实有人提出了这一点):分析不可编译的代码有什么意义?我的观点是,在分析过程中(在语义分析过程中),失败应该发生得更快更准确。请注意,这不是解析错误,这是语义问题(从语法上讲,您的代码是有效的)@benzonico,我的意思是,你在一个项目中有很多Java源代码,你应该保留analyz