Skip to content

NPE in IdeProcessingEnvImpl.replacePlaceholdersUsing() if Map entry has no value #4640

@fbricon

Description

@fbricon

Testing on a project that uses Google's immutables AP, I ran into this NPE :

java.lang.NullPointerException: Cannot invoke "java.lang.CharSequence.length()" because "this.text" is null
	at java.base/java.util.regex.Matcher.getTextLength(Matcher.java:1806)
	at java.base/java.util.regex.Matcher.reset(Matcher.java:459)
	at java.base/java.util.regex.Matcher.<init>(Matcher.java:255)
	at java.base/java.util.regex.Pattern.matcher(Pattern.java:1181)
	at org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeProcessingEnvImpl.lambda$4(IdeProcessingEnvImpl.java:106)
	at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$0(Collectors.java:180)
	at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1716)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:723)
	at org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeProcessingEnvImpl.getOptions(IdeProcessingEnvImpl.java:95)
	at org.immutables.value.internal.$processor$.$Processor$RestrictingIncrementalProcessingEnvironment.<init>($Processor.java:149)
	at org.immutables.value.internal.$processor$.$Processor$RestrictingIncrementalProcessingEnvironment.<init>($Processor.java:142)
	at org.immutables.value.internal.$processor$.$Processor.init($Processor.java:139)
	at org.immutables.processor.ProxyProcessor.init(ProxyProcessor.java:67)
	at org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.discoverNextProcessor(IdeAnnotationProcessorManager.java:91)
	at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:120)
	at org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:177)
	at org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:132)
	at org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:859)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:333)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:309)
	at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:486)
	at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:253)
	at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:377)
	at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:118)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:312)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:224)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:1109)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:299)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:355)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:449)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:452)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:564)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:512)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:594)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:208)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:309)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

This project in particular uses a processor option with no value (https://github.com/apache/arrow-java/blob/266dfc12151a49dd49153890eb16e97937c5667c/memory/memory-core/pom.xml#L71). It's defined by another AP, checker

There's no null check on optionValue here:

The UI allows setting keys without values:

Image

Metadata

Metadata

Assignees

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