Guard include scanner against null grepIncludes The grepIncludes artifact may be null if the owning rule doesn't have a $grep_includes attribute (see CppHelper.getGrepIncludes). This seems to be intentional. However, the remote include scanner requires that grepIncludes is *not* null, so we need to safe-guard against it. Unfortunately, this is brittle, because accidentally misspelling or removing the attributes makes all grep operations fall back to the built-in implementation. PiperOrigin-RevId: 277499382
diff --git a/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java b/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java index 0857f29..acde8ac 100644 --- a/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java +++ b/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java
@@ -843,13 +843,16 @@ Artifact file, ActionExecutionMetadata actionExecutionMetadata, ActionExecutionContext actionExecutionContext, - Artifact grepIncludes, + @Nullable Artifact grepIncludes, @Nullable SpawnIncludeScanner remoteIncludeScanner, boolean isOutputFile) throws IOException, ExecException, InterruptedException { Collection<Inclusion> inclusions; + // TODO(ulfjack): grepIncludes may be null if the corresponding attribute on the rule is missing + // (see CppHelper.getGrepIncludes) or misspelled. It would be better to disallow this case. if (remoteIncludeScanner != null + && grepIncludes != null && remoteIncludeScanner.shouldParseRemotely(file, actionExecutionContext)) { inclusions = remoteIncludeScanner.extractInclusions( @@ -866,7 +869,7 @@ extractInclusions( FileSystemUtils.readContent(actionExecutionContext.getInputPath(file))); } catch (IOException e) { - if (remoteIncludeScanner != null) { + if (remoteIncludeScanner != null && grepIncludes != null) { logger.log( Level.WARNING, "Falling back on remote parsing of " + actionExecutionContext.getInputPath(file),
diff --git a/src/main/java/com/google/devtools/build/lib/includescanning/LegacyIncludeScanner.java b/src/main/java/com/google/devtools/build/lib/includescanning/LegacyIncludeScanner.java index 0c16c97..440fef0 100644 --- a/src/main/java/com/google/devtools/build/lib/includescanning/LegacyIncludeScanner.java +++ b/src/main/java/com/google/devtools/build/lib/includescanning/LegacyIncludeScanner.java
@@ -58,6 +58,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; +import javax.annotation.Nullable; /** * C include scanner. Quickly scans C/C++ source files to determine the bounding set of transitively @@ -650,7 +651,7 @@ private class LegacyIncludeVisitor extends AbstractQueueVisitor implements IncludeVisitor { private final ActionExecutionMetadata actionExecutionMetadata; private final ActionExecutionContext actionExecutionContext; - private final Artifact grepIncludes; + @Nullable private final Artifact grepIncludes; private final Map<PathFragment, Artifact> pathToLegalOutputArtifact; /** The set of headers known to be part of a C++ module. Scanning can stop here. */ private final Set<Artifact> modularHeaders; @@ -661,7 +662,7 @@ public LegacyIncludeVisitor( ActionExecutionMetadata actionExecutionMetadata, ActionExecutionContext actionExecutionContext, - Artifact grepIncludes, + @Nullable Artifact grepIncludes, final Map<PathFragment, Artifact> pathToLegalOutputArtifact, Set<Artifact> modularHeaders) { super(