Skip to content

[java] SimplifyConditional can not detect the case if(foo != null && (foo instanceof Bar)) #2541

@wuchiuwong

Description

@wuchiuwong

Affects PMD Version:
6.22.0

Rule:
SimplifyConditional

Description:
SimplifyConditional can not detect the case if(foo != null && (foo instanceof Bar)).
This rule is implemented through xpath search:

//Expression
 [ConditionalOrExpression
 [EqualityExpression[@Image='==']
  //NullLiteral
  and
  UnaryExpressionNotPlusMinus
   [@Image='!']//InstanceOfExpression[PrimaryExpression
     //Name/@Image = ancestor::ConditionalOrExpression/EqualityExpression
      /PrimaryExpression/PrimaryPrefix/Name/@Image]
  and
  (count(UnaryExpressionNotPlusMinus) + 1 = count(*))
 ]
or
ConditionalAndExpression
 [EqualityExpression[@Image='!=']//NullLiteral
 and
InstanceOfExpression
 [PrimaryExpression[count(PrimarySuffix[@ArrayDereference='true'])=0]
  //Name[not(contains(@Image,'.'))]/@Image = ancestor::ConditionalAndExpression
   /EqualityExpression/PrimaryExpression/PrimaryPrefix/Name/@Image]
 and
(count(InstanceOfExpression) + 1 = count(*))
 ]
]

AST analyse result for the code sample is:

<ConditionalAndExpression FindBoundary='false' Image='' SingleLine='true'>
	<EqualityExpression FindBoundary='false' Image='!=' Operator='!=' SingleLine='true'>
		<PrimaryExpression FindBoundary='false' Image='' SingleLine='true'>
			<PrimaryPrefix FindBoundary='false' Image='' SingleLine='true' SuperModifier='false' ThisModifier='false'>
                <Name FindBoundary='false' Image='temp' SingleLine='true' />
            </PrimaryPrefix>
		</PrimaryExpression>
		<PrimaryExpression FindBoundary='false' Image='' SingleLine='true'>
            <PrimaryPrefix FindBoundary='false' Image='' SingleLine='true' SuperModifier='false' ThisModifier='false'>
				<Literal CharLiteral='false' DoubleLiteral='false' EscapedStringLiteral='' FindBoundary='false' FloatLiteral='false' Image='' IntLiteral='false' LongLiteral='false' SingleCharacterStringLiteral='false' SingleLine='true' StringLiteral='false' TextBlock='false' TextBlockContent='' ValueAsDouble='NaN' ValueAsFloat='NaN' ValueAsInt='0' ValueAsLong='0'>
					<NullLiteral FindBoundary='false' Image='' SingleLine='true' />
				</Literal>
			</PrimaryPrefix>
		</PrimaryExpression>
    </EqualityExpression>
    <PrimaryExpression FindBoundary='false' Image='' SingleLine='true'>
        <PrimaryPrefix Image='' SingleLine='true' SuperModifier='false' ThisModifier='false'>
            <Expression Image='' SingleLine='true' StandAlonePrimitive='false'>
                <InstanceOfExpression FindBoundary='false' Image='' SingleLine='true'>
                    <PrimaryExpression FindBoundary='false' Image='' SingleLine='true'>
                        <PrimaryPrefix FindBoundary='false' Image='' SingleLine='true' SuperModifier='false' ThisModifier='false'>
                            <Name FindBoundary='false' Image='temp' SingleLine='true' />
                        </PrimaryPrefix>
                    </PrimaryExpression>
                    <Type Array='false' ArrayDepth='0' ArrayType='false' FindBoundary='false' Image='' SingleLine='true' TypeImage='ListTag'>
                        <ReferenceType Array='false' ArrayDepth='0' FindBoundary='false' Image='' SingleLine='true'>
                            <ClassOrInterfaceType AnonymousClass='false' Array='false' ArrayDepth='0' FindBoundary='false' Image='ListTag' ReferenceToClassSameCompilationUnit='false' SingleLine='true'>
                                <TypeArguments Diamond='false' FindBoundary='false' Image='' SingleLine='true'>
                                    <TypeArgument FindBoundary='false' Image='' SingleLine='true' Wildcard='true' />
                                </TypeArguments>
                            </ClassOrInterfaceType>
                        </ReferenceType>
                    </Type>
                </InstanceOfExpression>
            </Expression>
        </PrimaryPrefix>
    </PrimaryExpression>
</ConditionalAndExpression>

Adding parentheses around temp instanceof ListTag<?> causes the AST chain to reach this node become: ConditionalAndExpression -> PrimaryExpression -> PrimaryPrefix -> Expression -> InstanceOfExpression

Code Sample demonstrating the issue:

if(temp != null && (temp instanceof List<?>))

Expected outcome:
false-negative

Running PMD through:
CLI

Metadata

Metadata

Assignees

No one assigned

    Labels

    a:false-negativePMD doesn't flag a problematic piece of code

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions