Skip to content

NPE in implicit output pattern "%{x}" when x is a "zero" label attribute #5581

@pcj

Description

@pcj

Attempting to use a sass_binary() rule, observing this error with 0.14.1, 0.15.0:

Minimal repo example (for me) is the presence of any sass_binary rule in a BUILD file where the rule is missing the mandatory argument src:

http_archive(
    name = "build_bazel_rules_nodejs",
    url = "https://github.com/bazelbuild/rules_nodejs/archive/0.10.0.zip",
    strip_prefix = "rules_nodejs-0.10.0",
    sha256 = "2f77623311da8b5009b1c7eade12de8e15fa3cd2adf9dfcc9f87cb2082b2211f",
)
load("@build_bazel_rules_nodejs//:defs.bzl", "node_repositories")
node_repositories(package_json = [])

http_archive(
    name = "io_bazel_rules_sass",
    url = "https://github.com/bazelbuild/rules_sass/archive/24331cf9a598c13089c9f441ef7fd9df23654b6f.zip",
    strip_prefix = "rules_sass-24331cf9a598c13089c9f441ef7fd9df23654b6f",
    sha256 = "deb3c4c5ae3f35ca11ace945ba481a77ec1d05fb9bebced1bb6dd41f6e70cb4b",
)
load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories")
sass_repositories()
load("@io_bazel_rules_sass//sass:sass.bzl", "sass_library", "sass_binary")

sass_binary(
    name = "foo",
)

I tried to trace it back manually to see where the "rule" attribute map could be null, didn't think it could be. Maybe it's something about sass_binary is defnining outputs? https://github.com/bazelbuild/rules_sass/blob/master/sass/sass.bzl#L124

Caused by: java.lang.NullPointerException
	at com.google.devtools.build.lib.packages.ImplicitOutputsFunction.attributeValues(ImplicitOutputsFunction.java:408)
	at com.google.devtools.build.lib.packages.ImplicitOutputsFunction.access$000(ImplicitOutputsFunction.java:63)
	at com.google.devtools.build.lib.packages.ImplicitOutputsFunction$1.get(ImplicitOutputsFunction.java:207)
	at com.google.devtools.build.lib.packages.ImplicitOutputsFunction$ParsedTemplate.substituteAttributes(ImplicitOutputsFunction.java:504)
	at com.google.devtools.build.lib.packages.ImplicitOutputsFunction.substitutePlaceholderIntoTemplate(ImplicitOutputsFunction.java:534)
	at com.google.devtools.build.lib.packages.ImplicitOutputsFunction.substitutePlaceholderIntoTemplate(ImplicitOutputsFunction.java:475)
	at com.google.devtools.build.lib.packages.ImplicitOutputsFunction$TemplateImplicitOutputsFunction.getImplicitOutputs(ImplicitOutputsFunction.java:268)
	at com.google.devtools.build.lib.packages.ImplicitOutputsFunction$SkylarkImplicitOutputsFunctionWithCallback.calculateOutputs(ImplicitOutputsFunction.java:124)
	at com.google.devtools.build.lib.packages.ImplicitOutputsFunction$SkylarkImplicitOutputsFunction.getImplicitOutputs(ImplicitOutputsFunction.java:76)
	at com.google.devtools.build.lib.packages.Rule.populateImplicitOutputFiles(Rule.java:551)
	at com.google.devtools.build.lib.packages.Rule.populateOutputFilesInternal(Rule.java:495)
	at com.google.devtools.build.lib.packages.Rule.populateOutputFiles(Rule.java:475)
	at com.google.devtools.build.lib.packages.RuleClass.createRule(RuleClass.java:1611)
	at com.google.devtools.build.lib.packages.RuleFactory.createRule(RuleFactory.java:131)
	at com.google.devtools.build.lib.packages.RuleFactory.createAndAddRule(RuleFactory.java:177)
	at com.google.devtools.build.lib.packages.RuleFactory.createAndAddRule(RuleFactory.java:218)
	at com.google.devtools.build.lib.analysis.skylark.SkylarkRuleClassFunctions$SkylarkRuleFunction.call(SkylarkRuleClassFunctions.java:615)
	at com.google.devtools.build.lib.syntax.BaseFunction.callWithArgArray(BaseFunction.java:462)
	at com.google.devtools.build.lib.syntax.BaseFunction.call(BaseFunction.java:440)
	at com.google.devtools.build.lib.syntax.FuncallExpression.callFunction(FuncallExpression.java:1003)
	at com.google.devtools.build.lib.syntax.FuncallExpression.doEval(FuncallExpression.java:975)
	at com.google.devtools.build.lib.syntax.Expression.eval(Expression.java:69)
	at com.google.devtools.build.lib.syntax.Eval.execDispatch(Eval.java:201)
	at com.google.devtools.build.lib.syntax.Eval.exec(Eval.java:183)
	at com.google.devtools.build.lib.syntax.BuildFileAST.execTopLevelStatement(BuildFileAST.java:237)
	at com.google.devtools.build.lib.syntax.BuildFileAST.doExec(BuildFileAST.java:210)
	at com.google.devtools.build.lib.syntax.BuildFileAST.lambda$exec$1(BuildFileAST.java:200)
	at com.google.devtools.build.lib.syntax.DebugServerUtils.runWithDebuggingIfEnabled(DebugServerUtils.java:62)
	at com.google.devtools.build.lib.syntax.BuildFileAST.exec(BuildFileAST.java:199)
	at com.google.devtools.build.lib.packages.PackageFactory.evaluateBuildFile(PackageFactory.java:1650)
	at com.google.devtools.build.lib.packages.PackageFactory.createPackageFromAst(PackageFactory.java:1289)
	at com.google.devtools.build.lib.skyframe.PackageFunction.loadPackage(PackageFunction.java:1233)
	at com.google.devtools.build.lib.skyframe.PackageFunction.compute(PackageFunction.java:475)
	at com.google.devtools.build.skyframe.AbstractParallelEvaluator$Evaluate.run(AbstractParallelEvaluator.java:382)

Adding a valid src attribute recovers bazel from the NPE, restoring expected/normal behaviour:

sass_binary(
    name = "foo",
    src = "main.scss",
)

Metadata

Metadata

Assignees

Labels

P2We'll consider working on this in future. (Assignee optional)team-Rules-APIAPI for writing rules/aspects: providers, runfiles, actions, artifactstype: bug

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions