Skip to content

Array index out of bounds exception on FindDeadLocalStores #2994

@miguel-vila

Description

@miguel-vila

I'm getting this error when running spotbugs:

The following errors occurred during analysis:
  Exception analyzing BaseUrl using detector edu.umd.cs.findbugs.detect.FindDeadLocalStores
    java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
      At edu.umd.cs.findbugs.BugCounts.addError(PackageStats.java:50)
      At edu.umd.cs.findbugs.PackageStats.addError(PackageStats.java:240)
      At edu.umd.cs.findbugs.ProjectStats.addBug(ProjectStats.java:273)
      At edu.umd.cs.findbugs.SortedBugCollection.add(SortedBugCollection.java:960)
      At edu.umd.cs.findbugs.SortedBugCollection.add(SortedBugCollection.java:227)
      At edu.umd.cs.findbugs.BugCollectionBugReporter.doReportBug(BugCollectionBugReporter.java:110)
      At edu.umd.cs.findbugs.AbstractBugReporter.reportBug(AbstractBugReporter.java:179)
      At edu.umd.cs.findbugs.DelegatingBugReporter.reportBug(DelegatingBugReporter.java:69)
      At edu.umd.cs.findbugs.FilterBugReporter.reportBug(FilterBugReporter.java:49)
      At edu.umd.cs.findbugs.FilterBugReporter.reportBug(FilterBugReporter.java:49)
      At edu.umd.cs.findbugs.BugAccumulator.reportBug(BugAccumulator.java:199)
      At edu.umd.cs.findbugs.BugAccumulator.reportAccumulatedBugs(BugAccumulator.java:180)
      At edu.umd.cs.findbugs.detect.FindDeadLocalStores.analyzeMethod(FindDeadLocalStores.java:647)
      At edu.umd.cs.findbugs.detect.FindDeadLocalStores.visitClassContext(FindDeadLocalStores.java:198)
      At edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:76)
      At edu.umd.cs.findbugs.FindBugs2.lambda$analyzeApplication$1(FindBugs2.java:1108)
      At java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
      At edu.umd.cs.findbugs.CurrentThreadExecutorService.execute(CurrentThreadExecutorService.java:86)
      At java.base/java.util.concurrent.AbstractExecutorService.invokeAll(AbstractExecutorService.java:247)
      At edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1118)
      At edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:309)
      At com.siriusxm.sbt.library.SxmJavaSpotBugsPlugin$.$anonfun$projectSettings$5(SxmJavaSpotBugsPlugin.scala:71)
      At com.siriusxm.sbt.library.SxmJavaSpotBugsPlugin$.$anonfun$projectSettings$5$adapted(SxmJavaSpotBugsPlugin.scala:39)
      At scala.Function1.$anonfun$compose$1(Function1.scala:49)
      At sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:63)
      At sbt.std.Transform$$anon$4.work(Transform.scala:69)
      At sbt.Execute.$anonfun$submit$2(Execute.scala:283)
      At sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:24)
      At sbt.Execute.work(Execute.scala:292)
      At sbt.Execute.$anonfun$submit$1(Execute.scala:283)
      At sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
      At sbt.CompletionService$$anon$2.call(CompletionService.scala:65)
      At java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
      At java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
      At java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
      At java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
      At java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
      At java.base/java.lang.Thread.run(Thread.java:833)

the contents of the class are:

import io.vavr.control.Validation;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Optional;

public class BaseUrl {
  public final String value;

  private BaseUrl(String value) {
    this.value = value;
  }

  public static Validation<String, Optional<BaseUrl>> fromString(String value) {
    if (value.isEmpty()) {
      return Validation.valid(Optional.empty());
    } else {
      if (isValidUrl(value)) {
        return Validation.valid(Optional.of(new BaseUrl(value)));
      } else {
        return Validation.invalid(
            "baseUrl '"
                + value
                + "' doesn't match expected format (must be a valid URL with env/region variables)");
      }
    }
  }

  private static String replace(String value) {
    return value.replace("${region}", "region").replace("${env}", "env");
  }

  private static Boolean isValidUrl(String value) {
    try {
      new URL(replace(value)).toURI();
      return true;
    } catch (MalformedURLException e) {
      return false;
    } catch (URISyntaxException e) {
      return false;
    }
  }

  @Override
  public boolean equals(Object other) {
    if (this == other) {
      return true;
    }
    if (other == null || getClass() != other.getClass()) {
      return false;
    }
    BaseUrl baseUrl = (BaseUrl) other;
    return value.equals(baseUrl.value);
  }

  @Override
  public int hashCode() {
    return value.hashCode();
  }
}

I've tried reproducing it in a test (had to remove the io.vavr import) but it succeeds. I have other files in which the same error raises but they are a bit more complex, I could try minimizing them.

version 4.8.5

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions