Skip to content

BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY not detected fix#3871

Draft
gtoison wants to merge 2 commits into
spotbugs:masterfrom
gtoison:issue-3752
Draft

BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY not detected fix#3871
gtoison wants to merge 2 commits into
spotbugs:masterfrom
gtoison:issue-3752

Conversation

@gtoison

@gtoison gtoison commented Jan 4, 2026

Copy link
Copy Markdown
Contributor

BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY isn't raised when casting the return of a Stream (or a Collection) toArray().
This should fix #3752

@gtoison gtoison self-assigned this Jan 4, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes issue #3752 where SpotBugs failed to detect impossible downcasts of the return value from Stream.toArray() and Collection.toArray() methods. The fix ensures that the BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY warning is correctly raised when developers attempt to cast the Object[] return value to more specific array types like String[].

Changes:

  • Modified the cast detection logic to continue analysis for Object[] casts instead of skipping them
  • Extracted the toArray downcast check into a reusable method to handle both normal and exception cases
  • Updated documentation to reflect that the warning applies to both collections and streams

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

File Description
spotbugsTestCases/src/java/ghIssues/Issue3752.java Adds test cases demonstrating the bug with both Stream.toArray() and Collection.toArray()
spotbugs/src/main/java/edu/umd/cs/findbugs/detect/FindBadCast2.java Updates detection logic to avoid skipping Object[] casts and extracts check into reusable method
spotbugs/etc/messages.xml Updates documentation to mention streams in addition to collections
spotbugs-tests/src/test/java/edu/umd/cs/findbugs/detect/Issue3752Test.java Adds integration test verifying both test cases are detected

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

if (!operandTypeIsExact && "Ljava/lang/Object;".equals(refSig2)) {
if (!operandTypeIsExact
&& "Ljava/lang/Object;".equals(refSig2)
// Keep inspecting this instruction if casting an Object[] because it might from a toArray() call

Copilot AI Jan 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Grammar issue in comment: "it might from a toArray()" should be "it might be from a toArray()"

Suggested change
// Keep inspecting this instruction if casting an Object[] because it might from a toArray() call
// Keep inspecting this instruction if casting an Object[] because it might be from a toArray() call

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

A false negative bug in the BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY detector

2 participants