Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NullArgumentForNonNullParameter thrown by Error Prone #4225

Closed
caitlinshk opened this issue Dec 27, 2023 · 11 comments
Closed

NullArgumentForNonNullParameter thrown by Error Prone #4225

caitlinshk opened this issue Dec 27, 2023 · 11 comments

Comments

@caitlinshk
Copy link

Hi there,

I'm running my project's local server (https://github.com/civiform/civiform/wiki/Getting-started#running-a-local-server), and I ran into this issue. It asked me to report it, so here I am :)

play.sbt.PlayExceptions$CompilationException: Compilation error[An unhandled exception was thrown by the Error Prone static analysis plugin.
     Please report this at https://github.com/google/error-prone/issues/new and include the following:
  
     error-prone version: 2.23.0
     BugPattern: NullArgumentForNonNullParameter
     Stack Trace:
     java.lang.NullPointerException
  	at com.google.errorprone.util.ASTHelpers.enclosingClass(ASTHelpers.java:1207)
  	at com.google.errorprone.bugpatterns.nullness.NullnessUtils.hasExtraParameterForEnclosingInstance(NullnessUtils.java:263)
  	at com.google.errorprone.bugpatterns.nullness.NullArgumentForNonNullParameter.match(NullArgumentForNonNullParameter.java:102)
  	at com.google.errorprone.bugpatterns.nullness.NullArgumentForNonNullParameter.matchNewClass(NullArgumentForNonNullParameter.java:97)
  	at com.google.errorprone.scanner.ErrorProneScanner.processMatchers(ErrorProneScanner.java:449)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitNewClass(ErrorProneScanner.java:773)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitNewClass(ErrorProneScanner.java:150)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1727)
  	at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
  	at jdk.compiler/com.sun.source.util.TreeScanner.visitReturn(TreeScanner.java:469)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitReturn(ErrorProneScanner.java:817)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitReturn(ErrorProneScanner.java:150)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1570)
  	at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
  	at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:105)
  	at jdk.compiler/com.sun.source.util.TreeScanner.visitBlock(TreeScanner.java:248)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitBlock(ErrorProneScanner.java:520)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitBlock(ErrorProneScanner.java:150)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1048)
  	at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
  	at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:90)
  	at jdk.compiler/com.sun.source.util.TreeScanner.visitMethod(TreeScanner.java:206)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitMethod(ErrorProneScanner.java:740)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitMethod(ErrorProneScanner.java:150)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:898)
  	at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
  	at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:90)
  	at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:105)
  	at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:113)
  	at jdk.compiler/com.sun.source.util.TreeScanner.visitClass(TreeScanner.java:187)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:548)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:150)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:808)
  	at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
  	at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:105)
  	at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:113)
  	at jdk.compiler/com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:144)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:560)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:150)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:591)
  	at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:56)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:58)
  	at com.google.errorprone.scanner.ErrorProneScannerTransformer.apply(ErrorProneScannerTransformer.java:43)
  	at com.google.errorprone.ErrorProneAnalyzer.finished(ErrorProneAnalyzer.java:156)
  	at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1414)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1361)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:960)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:147)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)
  	at sbt.internal.inc.javac.LocalJavaCompiler.run(LocalJava.scala:345)
  	at sbt.internal.inc.javac.AnalyzingJavaCompiler.$anonfun$compile$12(AnalyzingJavaCompiler.scala:172)
  	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
  	at sbt.internal.inc.javac.AnalyzingJavaCompiler.timed(AnalyzingJavaCompiler.scala:262)
  	at sbt.internal.inc.javac.AnalyzingJavaCompiler.compile(AnalyzingJavaCompiler.scala:161)
  	at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compileJava$2(MixedAnalyzingCompiler.scala:103)
  	at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compileJava$2$adapted(MixedAnalyzingCompiler.scala:91)
  	at sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239)
  	at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compileJava$1(MixedAnalyzingCompiler.scala:91)
  	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
  	at sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:248)
  	at sbt.internal.inc.MixedAnalyzingCompiler.compileJava(MixedAnalyzingCompiler.scala:61)
  	at sbt.internal.inc.MixedAnalyzingCompiler.compileJava0$1(MixedAnalyzingCompiler.scala:198)
  	at sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:211)
  	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:534)
  	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:534)
  	at sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:180)
  	at sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:178)
  	at sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:464)
  	at sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:116)
  	at sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56)
  	at sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52)
  	at sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:263)
  	at sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:419)
  	at sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:506)
  	at sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:406)
  	at sbt.internal.inc.Incremental$.apply(Incremental.scala:172)
  	at sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:534)
  	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:488)
  	at sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
  	at sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:425)
  	at sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
  	at sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:2371)
  	at sbt.Defaults$.$anonfun$compileIncrementalTask$2(Defaults.scala:2321)
  	at sbt.internal.server.BspCompileTask$.$anonfun$compute$1(BspCompileTask.scala:31)
  	at sbt.internal.io.Retry$.apply(Retry.scala:47)
  	at sbt.internal.io.Retry$.apply(Retry.scala:29)
  	at sbt.internal.io.Retry$.apply(Retry.scala:24)
  	at sbt.internal.server.BspCompileTask$.compute(BspCompileTask.scala:31)
  	at sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:2319)
  	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:515)
  	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
  	at java.base/java.lang.Thread.run(Thread.java:829)]
	at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:34)
	at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:34)
	at scala.Option.map(Option.scala:230)
	at play.sbt.run.PlayReload$.$anonfun$taskFailureHandler$8(PlayReload.scala:127)
	at scala.Option.map(Option.scala:230)
	at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:100)
	at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:38)
	at play.sbt.run.PlayReload$.$anonfun$compile$3(PlayReload.scala:152)
	at scala.util.Either$LeftProjection.map(Either.scala:573)
	at play.sbt.run.PlayReload$.compile(PlayReload.scala:152)
@cpovirk
Copy link
Member

cpovirk commented Dec 27, 2023

Thanks. Most of the actual Error Prone team is OOO this week, but I wrote this check, so I'm seeing how easily I can have a look.

Given how much Google's security policies discourage the use of Docker, I've been trying to see if there's a shorter path to reproducing this. I've managed to install scala and sbt, kick off sbt from within server, and run build. That built successfully. Do you see the failure you posted at head (e9f8449aaa13f6402ad41fb3acc14a8b33ad8eff in my clone), or does it appear only with local changes?

@cpovirk
Copy link
Member

cpovirk commented Dec 27, 2023

In any case, this whole failure is interesting:

It looks to me like we have a symbol for which isConstructor is true but for which enclosingClass returns null. At least under JDK11 (which might be what sbt is using on my machine?), I don't see how we could have a MethodSymbol with a null owner (which is what enclosingClass returns) without getting an NPE in the MethodSymbol constructor... unless somehow it gets overwritten later?

As an aside, I'm not sure that my enclosingClass(constructedClass) check could possibly work: If I'm reading it right, that should call constructedClass.enclClass(), which should return constructedClass itself....

@cpovirk
Copy link
Member

cpovirk commented Dec 27, 2023

(isContructor() is implemented as a check against the name <init>. I suppose it's possible that something uses that as a name for a non-constructor? Do you have Scala deps? That still seems like a long shot. I'm probably missing something obvious.)

@caitlinshk
Copy link
Author

I realized I misspoke in my original report: The error happens when running browser tests locally, not when running the server. https://github.com/civiform/civiform/wiki/Testing#functional-browser-tests are our browser test directions (specifically bin/run-browser-test-env).

But, it actually looks like I can no longer reproduce the error. Earlier today, I was working on a few different local PRs (civiform/civiform#6254, then civiform/civiform#6272 which is stacked on top) and I had one of those PR branches checked out when I started seeing the error. What I just did was:

  1. Checkout main
  2. run bin/run-browser-test-env -- works fine.
  3. Checkout [Program Card Images] Add breadcrumbs to admin program image upload page civiform/civiform#6254.
  4. run bin/run-browser-test-env -- works fine.
  5. Checkout [Program Card Images] Polish the admin page UI civiform/civiform#6272.
  6. run bin/run-browser-test-env -- works fine.

It seems like something got temporarily mangled, but checking out main un-mangled it somehow?

Since I can't repro and don't have good repro steps, feel free to close as not reproducible.

@cpovirk
Copy link
Member

cpovirk commented Dec 27, 2023

Thanks. I'll see if the aforementioned real Error Prone team has any thoughts upon their return. It does seem believable that some file got mangled or something.

In any case, I am going to look more into this whole "I'm not sure that my enclosingClass(constructedClass) check could possibly work" concern. So we will get something out of this one way or another :)

@cpovirk
Copy link
Member

cpovirk commented Dec 27, 2023

Oh, I'm wrong: It works fine because the call to enclClass() is made on sym.owner, not on sym. (It's possible that ASTHelpers.enclosingClass() was implementing the same unfortunate behavior as enclClass() up until cl/153079032, when cushon@ gave it the behavior that I need.)

I should probably still have a test for this.

And this is a reminder that it's nice not to have to deal with enclosing classes at all.... Really, the more checking that we can do just based on questions like "Is the target type here a primitive type?" (like https://errorprone.info/bugpattern/NullTernary), the better. Probably NullArgumentForNonNullParameter should handle primitive types differently or leave that to another future checker. Anyway, I digress.

copybara-service bot pushed a commit that referenced this issue Dec 28, 2023
It does, but I got confused in #4225.

PiperOrigin-RevId: 594090535
copybara-service bot pushed a commit that referenced this issue Dec 28, 2023
It does, but I got confused in #4225.

PiperOrigin-RevId: 594123682
@cushon
Copy link
Collaborator

cushon commented Jan 2, 2024

I don't have any theories about how that NPE could have happened. I don't know much about the interaction between sbt and javac. My current best idea is to add a more descriptive assertion that would catch that NPE, and see if it happens again.

copybara-service bot pushed a commit that referenced this issue Jan 3, 2024
PiperOrigin-RevId: 595213359
copybara-service bot pushed a commit that referenced this issue Jan 3, 2024
PiperOrigin-RevId: 595414757
@cushon
Copy link
Collaborator

cushon commented Jan 3, 2024

@caitlinshk I added an assertion that should print more information if this happens again and released that change as v2.24.1, can you try updating your build to use the latest version and let us know if you see this crash again?

@caitlinshk
Copy link
Author

Yes definitely! It wasn't super reproducible but I'll let you know if I see it again.

apereocas-bot referenced this issue in apereo/cas Jan 17, 2024
…e_core to v2.24.1

[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [com.google.errorprone:error_prone_core](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.23.0` -> `2.24.1` | [![age](https://developer.mend.io/api/mc/badges/age/maven/com.google.errorprone:error_prone_core/2.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.google.errorprone:error_prone_core/2.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.google.errorprone:error_prone_core/2.23.0/2.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.google.errorprone:error_prone_core/2.23.0/2.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>google/error-prone (com.google.errorprone:error_prone_core)</summary>

### [`v2.24.1`](https://togithub.com/google/error-prone/releases/tag/v2.24.1): Error Prone 2.24.1

Changes:

-   Add an assertion to try to help debug [https://github.com/google/error-prone/issues/4225](https://togithub.com/google/error-prone/issues/4225)

Full Changelog: google/error-prone@v2.24.0...v2.24.1

### [`v2.24.0`](https://togithub.com/google/error-prone/releases/tag/v2.24.0): Error Prone 2.24.0

New checks:

-   [`MultipleNullnessAnnotations`](https://errorprone.info/bugpattern/MultipleNullnessAnnotations): Discourage multiple nullness annotations
-   [`NullableTypeParameter`](https://errorprone.info/bugpattern/NullableTypeParameter): Discourage nullness annotations on type parameters
-   [`NullableWildcard`](https://errorprone.info/bugpattern/NullableWildcard): Discourage nullness annotations on wildcards
-   [`SuperCallToObjectMethod`](https://errorprone.info/bugpattern/SuperCallToObjectMethod): Generalization of `SuperEqualsIsObjectEquals`, now covers `hashCode`

Full Changelog: google/error-prone@v2.23.0...v2.24.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "after 10pm every weekday,before 6am every weekday" (UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/apereo/cas).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMDMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjEyNy4wIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIn0=-->
@caitlinshk
Copy link
Author

Just FYI I still haven't seen this error again, so feel free to close.

@cushon
Copy link
Collaborator

cushon commented Jan 17, 2024

Thanks for following up!

@cushon cushon closed this as completed Jan 17, 2024
leleuj referenced this issue in leleuj/cas Jan 18, 2024
…e_core to v2.24.1

[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [com.google.errorprone:error_prone_core](https://errorprone.info) ([source](https://togithub.com/google/error-prone)) | `2.23.0` -> `2.24.1` | [![age](https://developer.mend.io/api/mc/badges/age/maven/com.google.errorprone:error_prone_core/2.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.google.errorprone:error_prone_core/2.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.google.errorprone:error_prone_core/2.23.0/2.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.google.errorprone:error_prone_core/2.23.0/2.24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>google/error-prone (com.google.errorprone:error_prone_core)</summary>

### [`v2.24.1`](https://togithub.com/google/error-prone/releases/tag/v2.24.1): Error Prone 2.24.1

Changes:

-   Add an assertion to try to help debug [https://github.com/google/error-prone/issues/4225](https://togithub.com/google/error-prone/issues/4225)

Full Changelog: google/error-prone@v2.24.0...v2.24.1

### [`v2.24.0`](https://togithub.com/google/error-prone/releases/tag/v2.24.0): Error Prone 2.24.0

New checks:

-   [`MultipleNullnessAnnotations`](https://errorprone.info/bugpattern/MultipleNullnessAnnotations): Discourage multiple nullness annotations
-   [`NullableTypeParameter`](https://errorprone.info/bugpattern/NullableTypeParameter): Discourage nullness annotations on type parameters
-   [`NullableWildcard`](https://errorprone.info/bugpattern/NullableWildcard): Discourage nullness annotations on wildcards
-   [`SuperCallToObjectMethod`](https://errorprone.info/bugpattern/SuperCallToObjectMethod): Generalization of `SuperEqualsIsObjectEquals`, now covers `hashCode`

Full Changelog: google/error-prone@v2.23.0...v2.24.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "after 10pm every weekday,before 6am every weekday" (UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/apereo/cas).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMDMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjEyNy4wIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIn0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants