java.lang.IllegalArgumentException: n is not a valid line offset for pointer for S1068 - UnusedPrivateFieldCheck

We have hundreds of Java rules active and S1068 is the only one that fails to run.

  • Sonar version: Enterprise Edition Version 7.9.3 (build 33349)

  • Sonar server java version: 11.0.7+10

  • Java plugin version: 6.3 (build 21585)

  • Gradle plugin: group: ‘org.sonarsource.scanner.gradle’, name: ‘sonarqube-gradle-plugin’, version: ‘2.8’

  • local Java version (running gradle): openjdk version “1.8.0_252”

Stack trace:

Unable to run check class org.sonar.java.checks.unused.UnusedPrivateFieldCheck - S1068 on file 'src/main/java/com/xxxxx/xxxx/xxxx/xxxxxxxxx/services/customerevent/dao/EventAggregatorCustomerEventsDAOImpl.java', To help improve the SonarSource Java Analyzer, please report this problem to SonarSource: see https://community.sonarsource.com/
java.lang.IllegalArgumentException: 19 is not a valid line offset for pointer. File src/main/java/com/xxxxx/xxxx/xxxx/xxxxxxxxx/services/customerevent/dao/EventAggregatorCustomerEventsDAOImpl.java has 0 character(s) at line 18
        at org.sonar.api.internal.google.common.base.Preconditions.checkArgument(Preconditions.java:145)
        at org.sonar.api.batch.fs.internal.DefaultInputFile.checkValid(DefaultInputFile.java:339)
        at org.sonar.api.batch.fs.internal.DefaultInputFile.newPointer(DefaultInputFile.java:272)
        at org.sonar.api.batch.fs.internal.DefaultInputFile.newRange(DefaultInputFile.java:287)
        at org.sonar.java.JavaIssue.setPrimaryLocation(JavaIssue.java:65)
        at org.sonar.java.SonarComponents.reportIssue(SonarComponents.java:260)
        at org.sonar.java.SonarComponents.reportIssue(SonarComponents.java:245)
        at org.sonar.java.model.DefaultJavaFileScannerContext.reportIssue(DefaultJavaFileScannerContext.java:158)
        at org.sonar.java.model.DefaultJavaFileScannerContext.reportIssueWithFlow(DefaultJavaFileScannerContext.java:131)
        at org.sonar.java.model.DefaultJavaFileScannerContext.reportIssue(DefaultJavaFileScannerContext.java:124)
        at org.sonar.java.model.DefaultJavaFileScannerContext.reportIssue(DefaultJavaFileScannerContext.java:118)
        at org.sonar.plugins.java.api.IssuableSubscriptionVisitor.reportIssue(IssuableSubscriptionVisitor.java:62)
        at org.sonar.java.checks.unused.UnusedPrivateFieldCheck.checkIfUnused(UnusedPrivateFieldCheck.java:153)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
        at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
        at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
        at org.sonar.java.checks.unused.UnusedPrivateFieldCheck.checkClassFields(UnusedPrivateFieldCheck.java:142)
        at java.util.ArrayList.forEach(ArrayList.java:1257)
        at org.sonar.java.checks.unused.UnusedPrivateFieldCheck.leaveFile(UnusedPrivateFieldCheck.java:80)
        at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.lambda$run$4(VisitorsBridge.java:289)
        at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.lambda$forEach$9(VisitorsBridge.java:326)
        at org.sonar.java.model.VisitorsBridge.runScanner(VisitorsBridge.java:189)
        at org.sonar.java.model.VisitorsBridge.access$100(VisitorsBridge.java:66)
        at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.forEach(VisitorsBridge.java:326)
        at org.sonar.java.model.VisitorsBridge$IssuableSubsciptionVisitorsRunner.run(VisitorsBridge.java:289)
        at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:171)
        at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:98)
        at org.sonar.java.ast.JavaAstScanner.scan(JavaAstScanner.java:64)
        at org.sonar.java.JavaSquid.scanSources(JavaSquid.java:120)
        at org.sonar.java.JavaSquid.scan(JavaSquid.java:113)
        at org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:103)
        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:136)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122)
        at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:400)
        at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:395)
        at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:358)
        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.doAfterStart(GlobalContainer.java:141)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136)
        at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122)
        at org.sonar.batch.bootstrapper.Batch.doExecute(Batch.java:73)
        at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:67)
        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.$Proxy144.execute(Unknown Source)
        at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:185)
        at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:137)
        at org.sonarqube.gradle.SonarQubeTask.run(SonarQubeTask.java:100)
        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.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:727)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:694)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:568)
...

Scrubbed source with the same number of characters:

package com.xxxxx.xxxx.xxxx.xxxxxxxxx.services.customerevent.dao;

import java.util.List;
import com.xxxxx.xxxx.xxxx.xxxxxxxxx.datamodel.events.customer.CustomerEventsByCustomerIdAndTypeRequest;
import com.xxxxx.xxxx.xxxx.xxxxxxxxx.datamodel.events.customer.CustomerEventsByPolicyNumberRequest;
import com.xxxxx.xxxx.xxxx.xxxxxxxxx.datamodel.events.customer.SourceApplication;
import com.xxxxx.xxxx.xxxx.xxxxxxxxx.datamodel.events.customer.application.ApplicationPageTurnBySessionRequest;
import com.xxxxx.xxxx.xxxx.xxxxxxxxx.datamodel.events.customer.application.CustomerApplicationEvent;
import com.xxxxx.xxxx.xxxx.xxxxxxxxx.datamodel.events.customer.application.CustomerApplicationPageTurnEvent;
import com.xxxxx.xxxx.xxxx.xxxxxxxxx.datamodel.events.customer.application.CustomerApplicationSessionEvent;
import com.xxxxx.xxxx.xxxx.xxxxxxxxx.datamodel.events.customer.communication.CustomerCommunicationEvent;
import com.xxxxx.xxxx.xxxx.xxxxxxxxx.datamodel.events.customer.telematics.CustomerTelematicsUpdateEvent;
import org.checkerframework.checker.nullness.qual.NonNull;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Flux;

/**
 * Aggregates events from various child {@link CustomerEventsDAO} implementations
 *
 * @author Sean XXXXXX [ sean@xxxxxxxx.com ]
 */
@Slf4j
@RequiredArgsConstructor
public class EventAggregatorCustomerEventsDAOImpl implements CustomerEventsDAO {

    /**
     * Max merge flux execution concurrency
     */
    private static final int MAX_CONCURRENCY = 3;
    /**
     * Number of downstream events to pull from a fetch at merge start
     */
    private static final int PREFETCH = 1;
    private final List<CustomerEventsDAO> delegates;

    @Override
    public @NonNull Flux<CustomerApplicationSessionEvent> retrieveSessionsForPolicy(final CustomerEventsByPolicyNumberRequest request) {
        return Flux.fromIterable(delegates)
            .map(d -> d.retrieveSessionsForPolicy(request))
            .collectList()
            .flatMapMany(fluxes -> Flux.mergeSequentialDelayError(fluxes, MAX_CONCURRENCY, PREFETCH));
    }

    @Override
    public @NonNull Flux<CustomerApplicationEvent> retrieveEventsForSession(final String sessionId, final SourceApplication sourceApplication) {
        return Flux.fromIterable(delegates)
            .map(d -> d.retrieveEventsForSession(sessionId, sourceApplication))
            .collectList()
            .flatMapMany(fluxes -> Flux.mergeSequentialDelayError(fluxes, MAX_CONCURRENCY, PREFETCH));
    }

    @Override
    public @NonNull Flux<CustomerApplicationPageTurnEvent> retrievePageTurnEventsForSession(final @NonNull ApplicationPageTurnBySessionRequest request) {
        return Flux.fromIterable(delegates)
            .map(d -> d.retrievePageTurnEventsForSession(request))
            .collectList()
            .flatMapMany(fluxes -> Flux.mergeSequentialDelayError(fluxes, MAX_CONCURRENCY, PREFETCH));
    }

    @Override
    public @NonNull Flux<CustomerCommunicationEvent> retrieveCommunicationsForPolicy(final @NonNull CustomerEventsByPolicyNumberRequest request) {
        return Flux.fromIterable(delegates)
            .map(d -> d.retrieveCommunicationsForPolicy(request))
            .collectList()
            .flatMapMany(fluxes -> Flux.mergeSequentialDelayError(fluxes, MAX_CONCURRENCY, PREFETCH));
    }

    @Override
    public @NonNull Flux<CustomerTelematicsUpdateEvent> retrieveTelematicsUpdatesByPolicyNumber(final @NonNull CustomerEventsByPolicyNumberRequest request) {
        return Flux.fromIterable(delegates)
            .map(d -> d.retrieveTelematicsUpdatesByPolicyNumber(request))
            .collectList()
            .flatMapMany(fluxes -> Flux.mergeSequentialDelayError(fluxes, MAX_CONCURRENCY, PREFETCH));
    }

    @Override
    public @NonNull Flux<CustomerTelematicsUpdateEvent> retrieveTelematicsUpdatesByCustomerIdAndType(final @NonNull CustomerEventsByCustomerIdAndTypeRequest request) {
        return Flux.fromIterable(delegates)
            .map(d -> d.retrieveTelematicsUpdatesByCustomerIdAndType(request))
            .collectList()
            .flatMapMany(fluxes -> Flux.mergeSequentialDelayError(fluxes, MAX_CONCURRENCY, PREFETCH));
    }
}

Hello,

While trying to understand what is happening there, I found this blog talking about something similar.
Especially the part at " Telling Sonar about Lombok, @NotNull and other annotations".

Can you have a look at it to eventually see if it contains any clue useful for you?