java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

Template for a good bug report, formatted with Markdown:

  • versions used (SonarQube, Scanner, Plugin, and any relevant extension)
    Maven Plugin: 3.5.0.1254
    SonarQube: Developer Edition Version 7.3 (build 15553)

  • error observed (wrap logs/code around triple quote ``` for proper formatting)

[ERROR] Unable to run check class org.sonar.java.se.SymbolicExecutionVisitor -  on file /mnt/ebs1/jenkins/workspace/g-pd_onboardingserv_develop-BHYVP3SWVDSJ6BQG5DGQ4QTAIYTWLMXTBAZDYOZB6QHQCIJ7XE4A/server/service/src/main/java/com/yapstone/onboarding/service/mapper/BuilderFactory.java, To help improve SonarJava, please report this problem to SonarSource : see https://www.sonarqube.org/community/
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at java.util.ArrayList.rangeCheck(ArrayList.java:657)
        at java.util.ArrayList.get(ArrayList.java:433)
        at org.sonar.java.resolve.BytecodeMethodVisitor.visitParameterAnnotation(BytecodeMethodVisitor.java:64)
        at org.sonar.java.resolve.BytecodeMethodVisitor.visitTypeAnnotation(BytecodeMethodVisitor.java:75)
        at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1176)
        at org.objectweb.asm.ClassReader.accept(ClassReader.java:631)
        at org.objectweb.asm.ClassReader.accept(ClassReader.java:355)
        at org.sonar.java.resolve.BytecodeCompleter.complete(BytecodeCompleter.java:86)
        at org.sonar.java.resolve.JavaSymbol.complete(JavaSymbol.java:110)
        at org.sonar.java.resolve.JavaSymbol$TypeJavaSymbol.getSuperclass(JavaSymbol.java:361)
        at org.sonar.java.resolve.JavaSymbol$TypeJavaSymbol.superClass(JavaSymbol.java:455)
        at org.sonar.java.resolve.JavaSymbol$TypeJavaSymbol.superTypes(JavaSymbol.java:422)
        at org.sonar.java.resolve.ClassJavaType.superTypeContains(ClassJavaType.java:85)
        at org.sonar.java.resolve.ClassJavaType.isSubtypeOf(ClassJavaType.java:57)
        at org.sonar.java.se.checks.UnclosedResourcesCheck.needsClosing(UnclosedResourcesCheck.java:196)
        at org.sonar.java.se.checks.UnclosedResourcesCheck.access$800(UnclosedResourcesCheck.java:68)
        at org.sonar.java.se.checks.UnclosedResourcesCheck$PostStatementVisitor.methodOpeningResource(UnclosedResourcesCheck.java:487)
        at org.sonar.java.se.checks.UnclosedResourcesCheck$PostStatementVisitor.visitMethodInvocation(UnclosedResourcesCheck.java:473)
        at org.sonar.java.model.expression.MethodInvocationTreeImpl.accept(MethodInvocationTreeImpl.java:96)
        at org.sonar.java.se.checks.UnclosedResourcesCheck.checkPostStatement(UnclosedResourcesCheck.java:150)
        at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:106)
        at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
        at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:118)
        at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
        at org.sonar.java.se.checks.NullDereferenceCheck.checkPostStatement(NullDereferenceCheck.java:192)
        at org.sonar.java.se.CheckerDispatcher.executePost(CheckerDispatcher.java:106)
        at org.sonar.java.se.CheckerDispatcher.addTransition(CheckerDispatcher.java:97)
        at org.sonar.java.se.CheckerDispatcher.executeCheckPostStatement(CheckerDispatcher.java:69)
        at org.sonar.java.se.ExplodedGraphWalker.executeMethodInvocation(ExplodedGraphWalker.java:705)
        at org.sonar.java.se.ExplodedGraphWalker.visit(ExplodedGraphWalker.java:541)
        at org.sonar.java.se.ExplodedGraphWalker.execute(ExplodedGraphWalker.java:250)
        at org.sonar.java.se.ExplodedGraphWalker.visitMethod(ExplodedGraphWalker.java:210)
        at org.sonar.java.se.ExplodedGraphWalker.visitMethod(ExplodedGraphWalker.java:202)
        at org.sonar.java.se.SymbolicExecutionVisitor.execute(SymbolicExecutionVisitor.java:78)
        at org.sonar.java.se.SymbolicExecutionVisitor.visitNode(SymbolicExecutionVisitor.java:64)
        at org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:95)
        at org.sonar.java.ast.visitors.SubscriptionVisitor.visitChildren(SubscriptionVisitor.java:120)
        at org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:97)
        at org.sonar.java.ast.visitors.SubscriptionVisitor.visitChildren(SubscriptionVisitor.java:120)
        at org.sonar.java.ast.visitors.SubscriptionVisitor.visit(SubscriptionVisitor.java:97)
        at org.sonar.java.ast.visitors.SubscriptionVisitor.scanTree(SubscriptionVisitor.java:78)
        at org.sonar.java.ast.visitors.SubscriptionVisitor.scanFile(SubscriptionVisitor.java:64)
        at org.sonar.java.se.SymbolicExecutionVisitor.scanFile(SymbolicExecutionVisitor.java:54)
        at org.sonar.java.model.VisitorsBridge.runScanner(VisitorsBridge.java:135)
        at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:124)
        at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:96)
        at org.sonar.java.ast.JavaAstScanner.scan(JavaAstScanner.java:68)
        at org.sonar.java.JavaSquid.scanSources(JavaSquid.java:116)
        at org.sonar.java.JavaSquid.scan(JavaSquid.java:110)
        at org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:93)
        at org.sonar.scanner.sensor.SensorWrapper.analyse(SensorWrapper.java:45)
        at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:88)
        at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:62)
        at org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:74)
        at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:166)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122)
        at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:300)
        at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:295)
        at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:293)
        at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:293)
        at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:269)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122)
        at org.sonar.scanner.task.ScanTask.execute(ScanTask.java:48)
        at org.sonar.scanner.task.TaskContainer.doAfterStart(TaskContainer.java:82)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122)
        at org.sonar.scanner.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:131)
        at org.sonar.batch.bootstrapper.Batch.doExecuteTask(Batch.java:116)
        at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:71)
        at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46)
        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:498)
        at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)
        at com.sun.proxy.$Proxy23.execute(Unknown Source)
        at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:171)
        at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:128)
        at org.sonarsource.scanner.maven.bootstrap.ScannerBootstrapper.execute(ScannerBootstrapper.java:65)
        at org.sonarsource.scanner.maven.SonarQubeMojo.execute(SonarQubeMojo.java:104)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:956)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:290)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:194)
        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:498)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
 
  • steps to reproduce
    This happens to many seemingly normal classes, but here is the first one for reference.
package com.yapstone.onboarding.service.mapper;

import com.yapstone.onboarding.service.model.Action;
import com.yapstone.onboarding.service.model.ActionStatus;
import com.yapstone.onboarding.service.model.Address;
import com.yapstone.onboarding.service.model.ApplicantConsent;
import com.yapstone.onboarding.service.model.Asset;
import com.yapstone.onboarding.service.model.BankAccount;
import com.yapstone.onboarding.service.model.BankAccountData;
import com.yapstone.onboarding.service.model.BeneficialOwner;
import com.yapstone.onboarding.service.model.BusinessApplicant;
import com.yapstone.onboarding.service.model.BusinessId;
import com.yapstone.onboarding.service.model.BusinessOwner;
import com.yapstone.onboarding.service.model.BusinessProfile;
import com.yapstone.onboarding.service.model.Consent;
import com.yapstone.onboarding.service.model.Contract;
import com.yapstone.onboarding.service.model.CustomerHistory;
import com.yapstone.onboarding.service.model.DeactivateRequest;
import com.yapstone.onboarding.service.model.DeactivateResponse;
import com.yapstone.onboarding.service.model.EntityProductStatus;
import com.yapstone.onboarding.service.model.GovernmentId;
import com.yapstone.onboarding.service.model.IndividualApplicant;
import com.yapstone.onboarding.service.model.IndividualOwner;
import com.yapstone.onboarding.service.model.MarketplaceApplicant;
import com.yapstone.onboarding.service.model.MarketplaceProduct;
import com.yapstone.onboarding.service.model.MarketplaceProductPayoutInstrument;
import com.yapstone.onboarding.service.model.MarketplaceProperty;
import com.yapstone.onboarding.service.model.Money;
import com.yapstone.onboarding.service.model.Name;
import com.yapstone.onboarding.service.model.Owner;
import com.yapstone.onboarding.service.model.PayoutInstrument;
import com.yapstone.onboarding.service.model.PayoutProduct;
import com.yapstone.onboarding.service.model.Phone;
import com.yapstone.onboarding.service.model.PriceSetting;
import com.yapstone.onboarding.service.model.Products;
import com.yapstone.onboarding.service.model.Profile;
import com.yapstone.onboarding.service.model.Property;
import com.yapstone.onboarding.service.model.PropertyHistory;
import com.yapstone.onboarding.service.model.PropertyInfo;
import com.yapstone.onboarding.service.model.PropertyOwner;
import com.yapstone.onboarding.service.model.PropertyTracker;
import com.yapstone.onboarding.service.model.Registration;
import com.yapstone.onboarding.service.model.ReservationSetting;
import com.yapstone.onboarding.service.model.SocialNetwork;
import com.yapstone.onboarding.service.model.Status;
import com.yapstone.onboarding.service.model.StatusReason;
import com.yapstone.onboarding.service.model.StaySetting;
import com.yapstone.onboarding.service.model.SuspensionReason;
import com.yapstone.onboarding.service.model.Traveler;

/**
 * Workaround for Mapstruct's inability to handle "standard" {@code Builder} creation patterns until the `1.3.0` release
 * of Mapstruct.
 */
public class BuilderFactory {

    public Action.Builder actionBuilder() {
        return Action.builder();
    }

    public ActionStatus.Builder actionStatusBuilder() {
        return ActionStatus.builder();
    }

    public Address.Builder addressBuilder() {
        return Address.builder();
    }

    public ApplicantConsent.Builder applicantConsentBuilder() {
        return ApplicantConsent.builder();
    }

    public Asset.Builder assetBuilder() {
        return Asset.builder();
    }

    public BankAccount.Builder bankAccountBuilder() {
        return BankAccount.builder();
    }

    public BankAccountData.Builder bankAccountDataBuilder() {
        return BankAccountData.builder();
    }

    public BeneficialOwner.Builder beneficialOwnerBuilder() {
        return BeneficialOwner.builder();
    }

    public BusinessApplicant.Builder businessApplicantBuilder() {
        return BusinessApplicant.builder();
    }

    public BusinessId.Builder businessIdBuilder() {
        return BusinessId.builder();
    }

    public BusinessOwner.Builder businessOwnerBuilder() {
        return BusinessOwner.builder();
    }

    public BusinessProfile.Builder businessProfileBuilder() {
        return BusinessProfile.builder();
    }

    public Consent.Builder consentBuilder() {
        return Consent.builder();
    }

    public Contract.Builder contractBuilder() {
        return Contract.builder();
    }

    public CustomerHistory.Builder customerHistoryBuilder() {
        return CustomerHistory.builder();
    }

    public DeactivateRequest.Builder deactivateRequestBuilder() {
        return DeactivateRequest.builder();
    }

    public DeactivateResponse.Builder deactivateResponseBuilder() {
        return DeactivateResponse.builder();
    }

    public EntityProductStatus.Builder entityProductStatusBuilder() {
        return EntityProductStatus.builder();
    }

    public GovernmentId.Builder governmentIdBuilder() {
        return GovernmentId.builder();
    }

    public IndividualApplicant.Builder individualApplicantBuilder() {
        return IndividualApplicant.builder();
    }

    public IndividualOwner.Builder individualOwnerBuilder() {
        return IndividualOwner.builder();
    }

    public MarketplaceApplicant.Builder marketplaceApplicantBuilder() {
        return MarketplaceApplicant.builder();
    }

    public MarketplaceProduct.Builder marketplaceProductBuilder() {
        return MarketplaceProduct.builder();
    }

    public MarketplaceProperty.Builder marketplacePropertyBuilder() {
        return MarketplaceProperty.builder();
    }

    public Money.Builder moneyBuilder() {
        return Money.builder();
    }

    public Name.Builder nameBuilder() {
        return Name.builder();
    }

    public Owner.Builder ownerBuilder() {
        return Owner.builder();
    }

    public PayoutInstrument.Builder payoutInstrumentBuilder() {
        return PayoutInstrument.builder();
    }

    public MarketplaceProductPayoutInstrument.Builder marketplaceProductPayoutInstrumentBuilder() {
        return MarketplaceProductPayoutInstrument.builder();
    }

    public PayoutProduct.Builder payoutProductBuilder() {
        return PayoutProduct.builder();
    }

    public Phone.Builder phoneBuilder() {
        return Phone.builder();
    }

    public PriceSetting.Builder priceSettingBuilder() {
        return PriceSetting.builder();
    }

    public Products.Builder productsBuilder() {
        return Products.builder();
    }

    public Profile.Builder profileBuilder() {
        return Profile.builder();
    }

    public Property.Builder propertyBuilder() {
        return Property.builder();
    }

    public PropertyHistory.Builder propertyHistoryBuilder() {
        return PropertyHistory.builder();
    }

    public PropertyInfo.Builder propertyInfoBuilder() {
        return PropertyInfo.builder();
    }

    public PropertyOwner.Builder propertyOwnerBuilder() {
        return PropertyOwner.builder();
    }

    public PropertyTracker.Builder propertyTrackerBuilder() {
        return PropertyTracker.builder();
    }

    public ReservationSetting.Builder reservationSettingBuilder() {
        return ReservationSetting.builder();
    }

    public Registration.Builder registrationBuilder() {
        return Registration.builder();
    }

    public SocialNetwork.Builder socialNetworkBuilder() {
        return SocialNetwork.builder();
    }

    public Status.Builder statusBuilder() {
        return Status.builder();
    }

    public StatusReason.Builder statusReasonBuilder() {
        return StatusReason.builder();
    }

    public StaySetting.Builder staySettingBuilder() {
        return StaySetting.builder();
    }

    public SuspensionReason.Builder suspensionReasonBuilder() {
        return SuspensionReason.builder();
    }

    public Traveler.Builder travelerBuilder() {
        return Traveler.builder();
    }


}

  • potential workaround

None as of yet.

Could you specify which version of the sonarjava analyzer is installed on your server ?

We use the Maven plugin to execute the SonarQube analysis, so we don’t install any SonarJava analyzer on our build servers.

I’m not sure if this answers your question or not?

[INFO] --- sonar-maven-plugin:3.5.0.1254:sonar (default-cli) @ onboardingserv ---
[INFO] User cache: /home/ec2-user/.sonar/cache
[INFO] SonarQube version: 7.3.0

Hi, it does not :slight_smile:
I’m looking for the version of the Java Analyzer that is installed on your sonarqube instance. You can see that in the marketplace of SonarQube if you’re an admin.

* **5.7 (build 15470)** installed

I see now that there is an update available, I’ll try again after updating and report back…

Still seeing the same problem

[ERROR] Unable to run check class org.sonar.java.se.SymbolicExecutionVisitor -  on file /mnt/ebs1/jenkins/workspace/g-pd_onboardingserv_develop-BHYVP3SWVDSJ6BQG5DGQ4QTAIYTWLMXTBAZDYOZB6QHQCIJ7XE4A/server/service/src/main/java/com/yapstone/onboarding/service/mapper/BuilderFactory.java, To help improve SonarJava, please report this problem to SonarSource : see https://www.sonarqube.org/community/
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	at java.util.ArrayList.rangeCheck(ArrayList.java:657)
	at java.util.ArrayList.get(ArrayList.java:433)
	at org.sonar.java.resolve.BytecodeMethodVisitor.visitParameterAnnotation(BytecodeMethodVisitor.java:65)
	at org.sonar.java.resolve.BytecodeMethodVisitor.visitTypeAnnotation(BytecodeMethodVisitor.java:76)
	at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1213)
	at org.objectweb.asm.ClassReader.accept(ClassReader.java:679)
	at org.objectweb.asm.ClassReader.accept(ClassReader.java:391)

With 5.8 (build 15699)installed

hello @awhiteside ,

sorry for the late reaction, are you still able to reproduce the issue with the latest version of sonar-java? From the stacktrace it seems that problem will be in the dependencies of the class you are analyzing, so I am not able to reproduce it from the source code only.

I’m seeing this same problem on a 7.4 instance but running sonar-java 6.0.0-SNAPSHOT. Trying to trim down a test case.

hello @hajush,

thanks for your effort to trace down the issue, however using 6.0.0-SNAPSHOT is highly not recommended, because 6.x is major refactoring of the sonar-java plugin. Anything you will find will be irrelevant anyway, because this issue is coming from semantic engine, which is being replaced.

Hi @saberduck - thanks for your reply. I was also able to reproduce this on the default plugin with 7.9.1, which I believe is 5.13.1.18282. But since I’m also submitting a code fix pull request the sonar-java plugin, I’ve been pulling the latest code from github.

I’ve extracted a test case which I’ve been able to reproduce. I’m not able to attach it here directly, so I’m including a link https://trello-attachments.s3.amazonaws.com/5ac4dfbc9f50e70c638a54c1/5d5c457d39b9494276a2091c/ccbe06e022f43aef8d8e3d7bf421920a/sonar-ioobe.tar

SonarServer version 7.9.1 LTS (Community)
SonarJava version 5.14 (build 18788)
Gradle version 5.6
JDK 1.8.0_202 (Azul Systems, Inc. 25.202-b05)

I’ve done a fair amount of debugging to see if it was something I could fix, but it’s getting a ‘2’ for the parameter index out of the bytecode with from asm7.1 with some esoteric math (this.targetTypeAndInfo & 16711680) >> 16), in TypeReference.getFormalParameterIndex(), and as in the original submission, the List of parameter symbols where ByteCodeMethodVisitor does the IndexOutOfBoundsException has length 0. This is beyond me. What is curious is the issue goes away if the dependent java class is moved into the same module. So the gradle submodule configuration is important for some reason.

FYI - in the real world build and sonarqube scan where this is happening, the scan seems mostly to be ok. But we’re getting 55 of these IndexOutOfBoundsExceptions, preventing access to symbol tables and whatever checks depend on them.

Sorry for the late reply : the latest sonarjava version released (6.0.1) works with a new frontend that should prevent such kind of issue happening. I would suggest you to upgrade to that version of the analyzer if you are still encountering the issue.

@Nicolas_Peru - very much appreciate your reply. Not been getting responses to bug reports, questions, etc. for a very long time from SonarSource. Hope all is well over there!

FYI - we did the upgrade to SonarJava 6.0 (build 20538) a month ago. The 6.0.1 SonarJava doesn’t appear to be available through the Marketplace at least as far as I am seeing. I do see it in github though, but at least in 6.0 the IndexOutOfBounds errors have gone away. Thanks!

This same problem still happens with the latest version.

[ERROR] Unable to run check class org.sonar.java.checks.DateFormatWeekYearCheck - S3986 on file 'jaxb-core-schiphol/src/main/java/nl/schiphol/jaxb/util/datetime/SimpleDateFormatThreadSafe.java', To help improve the SonarSource Java Analyzer, please report this problem to SonarSource: see https://community.sonarsource.com/
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	at java.util.ArrayList.rangeCheck(ArrayList.java:657)
	at java.util.ArrayList.get(ArrayList.java:433)
	at org.sonar.java.ast.parser.ListTreeImpl.get(ListTreeImpl.java:143)
	at org.sonar.java.ast.parser.ListTreeImpl.get(ListTreeImpl.java:34)
	at org.sonar.java.checks.DateFormatWeekYearCheck.onMethodInvocationFound(DateFormatWeekYearCheck.java:67)
	at org.sonar.java.checks.methods.AbstractMethodDetection.visitNode(AbstractMethodDetection.java:45)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.lambda$visit$6(VisitorsBridge.java:287)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.lambda$forEach$9(VisitorsBridge.java:303)
	at org.sonar.java.model.VisitorsBridge.runScanner(VisitorsBridge.java:159)
	at org.sonar.java.model.VisitorsBridge.access$100(VisitorsBridge.java:62)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.forEach(VisitorsBridge.java:303)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visit(VisitorsBridge.java:289)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visitChildren(VisitorsBridge.java:273)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visit(VisitorsBridge.java:293)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visitChildren(VisitorsBridge.java:273)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visit(VisitorsBridge.java:293)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visitChildren(VisitorsBridge.java:273)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visit(VisitorsBridge.java:293)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visitChildren(VisitorsBridge.java:273)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visit(VisitorsBridge.java:293)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visitChildren(VisitorsBridge.java:273)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.visit(VisitorsBridge.java:293)
	at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.run(VisitorsBridge.java:264)
	at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:139)
	at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:127)
	at org.sonar.java.ast.JavaAstScanner.scan(JavaAstScanner.java:79)
	at org.sonar.java.JavaSquid.scanSources(JavaSquid.java:130)
	at org.sonar.java.JavaSquid.scan(JavaSquid.java:116)
	at org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:105)
	at org.sonar.scanner.sensor.AbstractSensorWrapper.analyse(AbstractSensorWrapper.java:48)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:85)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.lambda$execute$1(ModuleSensorsExecutor.java:59)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.withModuleStrategy(ModuleSensorsExecutor.java:77)
	at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:59)
	at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:82)
	at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:137)
	at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:123)
	at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:392)
	at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:388)
	at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:385)
	at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:357)
	at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:137)
	at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:123)
	at org.sonar.scanner.bootstrap.GlobalContainer.doAfterStart(GlobalContainer.java:150)
	at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:137)
	at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:123)
	at org.sonar.batch.bootstrapper.Batch.doExecute(Batch.java:72)
	at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:66)
	at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46)
	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:498)
	at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)
	at com.sun.proxy.$Proxy24.execute(Unknown Source)
	at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:189)
	at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:138)
	at org.sonarsource.scanner.maven.bootstrap.ScannerBootstrapper.execute(ScannerBootstrapper.java:65)
	at org.sonarsource.scanner.maven.SonarQubeMojo.execute(SonarQubeMojo.java:104)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:956)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
	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:498)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)

      <plugin>
        <groupId>org.sonarsource.scanner.maven</groupId>
        <artifactId>sonar-maven-plugin</artifactId>
        <version>3.7.0.1746</version>
      </plugin>
  • Community Edition
  • Version 8.9 (build 43852)

Class it’s trying to analyse:

public class SimpleDateFormatThreadSafe extends SimpleDateFormat {

  private static final long serialVersionUID = 1L;

  ThreadLocal<SimpleDateFormat> localSimpleDateFormat;

  public SimpleDateFormatThreadSafe() {
    super();
    localSimpleDateFormat =
        new ThreadLocal<SimpleDateFormat>() {
          protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat();
          }
        };
  }

  public SimpleDateFormatThreadSafe(final String pattern) {
    super(pattern);
    localSimpleDateFormat =
        new ThreadLocal<SimpleDateFormat>() {
          protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat(pattern);
          }
        };
  }

  public SimpleDateFormatThreadSafe(final String pattern, final DateFormatSymbols formatSymbols) {
    super(pattern, formatSymbols);
    localSimpleDateFormat =
        new ThreadLocal<SimpleDateFormat>() {
          protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat(pattern, formatSymbols);
          }
        };
  }

  public SimpleDateFormatThreadSafe(final String pattern, final Locale locale) {
    super(pattern, locale);
    localSimpleDateFormat =
        new ThreadLocal<SimpleDateFormat>() {
          protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat(pattern, locale);
          }
        };
  }

  public Object parseObject(String source) throws ParseException {
    return localSimpleDateFormat.get().parseObject(source);
  }

  public String toString() {
    return localSimpleDateFormat.get().toString();
  }

  public Date parse(String source) throws ParseException {
    return localSimpleDateFormat.get().parse(source);
  }

  public Object parseObject(String source, ParsePosition pos) {
    return localSimpleDateFormat.get().parseObject(source, pos);
  }

  public void setCalendar(Calendar newCalendar) {
    localSimpleDateFormat.get().setCalendar(newCalendar);
  }

  public Calendar getCalendar() {
    return localSimpleDateFormat.get().getCalendar();
  }

  public void setNumberFormat(NumberFormat newNumberFormat) {
    localSimpleDateFormat.get().setNumberFormat(newNumberFormat);
  }

  public NumberFormat getNumberFormat() {
    return localSimpleDateFormat.get().getNumberFormat();
  }

  public void setTimeZone(TimeZone zone) {
    localSimpleDateFormat.get().setTimeZone(zone);
  }

  public TimeZone getTimeZone() {
    return localSimpleDateFormat.get().getTimeZone();
  }

  public void setLenient(boolean lenient) {
    localSimpleDateFormat.get().setLenient(lenient);
  }

  public boolean isLenient() {
    return localSimpleDateFormat.get().isLenient();
  }

  public void set2DigitYearStart(Date startDate) {
    localSimpleDateFormat.get().set2DigitYearStart(startDate);
  }

  public Date get2DigitYearStart() {
    return localSimpleDateFormat.get().get2DigitYearStart();
  }

  public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos) {
    return localSimpleDateFormat.get().format(date, toAppendTo, pos);
  }

  public AttributedCharacterIterator formatToCharacterIterator(Object obj) {
    return localSimpleDateFormat.get().formatToCharacterIterator(obj);
  }

  public Date parse(String text, ParsePosition pos) {
    return localSimpleDateFormat.get().parse(text, pos);
  }

  public String toPattern() {
    return localSimpleDateFormat.get().toPattern();
  }

  public String toLocalizedPattern() {
    return localSimpleDateFormat.get().toLocalizedPattern();
  }

  public void applyPattern(String pattern) {
    localSimpleDateFormat.get().applyPattern(pattern);
  }

  public void applyLocalizedPattern(String pattern) {
    localSimpleDateFormat.get().applyLocalizedPattern(pattern);
  }

  public DateFormatSymbols getDateFormatSymbols() {
    return localSimpleDateFormat.get().getDateFormatSymbols();
  }

  public void setDateFormatSymbols(DateFormatSymbols newFormatSymbols) {
    localSimpleDateFormat.get().setDateFormatSymbols(newFormatSymbols);
  }

  public Object clone() {
    return localSimpleDateFormat.get().clone();
  }

  public int hashCode() {
    return localSimpleDateFormat.get().hashCode();
  }

  public boolean equals(Object obj) {
    return localSimpleDateFormat.get().equals(obj);
  }
}

Hey @CaptainDuckman,

Thank you for reporting the problem, it looks like you are not the only running into this bug.
Thanks to your report and sample code, the issue has been identified and a ticket has been created to implement a fix.

Cheers,

Dorian