@@ -99,8 +99,9 @@ auto addressofMatcher() {
99
99
}
100
100
101
101
auto functionCallMatcher () {
102
- return callExpr (hasDeclaration (functionDecl (returns (isAnyPointer ()))))
103
- .bind (kVar );
102
+ return callExpr (
103
+ callee (functionDecl (hasAnyParameter (anyOf (hasType (pointerType ()),
104
+ hasType (referenceType ()))))));
104
105
}
105
106
106
107
auto assignMatcher () {
@@ -362,6 +363,49 @@ void matchAddressofExpr(const Expr *expr,
362
363
RootValue->setProperty (kIsNonnull , Env.getBoolLiteralValue (true ));
363
364
}
364
365
366
+ void matchPtrArgFunctionExpr (const CallExpr *fncall,
367
+ const MatchFinder::MatchResult &Result,
368
+ Environment &Env) {
369
+ // Inner storageloc, inner type
370
+ fncall->dump ();
371
+
372
+ for (const auto *Arg : fncall->arguments ()) {
373
+ // WrappedArg->dump();
374
+ // const auto *Arg = WrappedArg->IgnoreCasts();
375
+ Arg->dump ();
376
+
377
+ // FIXME: Add handling for reference types as arguments
378
+ if (Arg->getType ()->isPointerType ()) {
379
+ llvm::errs () << (int )Env.getValue (*Arg)->getKind ();
380
+ PointerValue *OuterValue = cast_or_null<PointerValue>(
381
+ Env.getValue (*Arg));
382
+
383
+ if (!OuterValue)
384
+ continue ;
385
+
386
+ QualType InnerType = Arg->getType ()->getPointeeType ();
387
+ if (!InnerType->isPointerType ())
388
+ continue ;
389
+
390
+ StorageLocation &InnerLoc = OuterValue->getPointeeLoc ();
391
+
392
+ PointerValue *InnerValue =
393
+ cast_or_null<PointerValue>(Env.getValue (InnerLoc));
394
+
395
+ if (!InnerValue)
396
+ continue ;
397
+
398
+ Value *NewValue = Env.createValue (InnerType);
399
+ assert (NewValue && " Failed to re-initialize a pointer's value" );
400
+
401
+ Env.setValue (InnerLoc, *NewValue);
402
+
403
+ // FIXME: Recursively invalidate all member pointers of eg. a struct
404
+ // Should be part of the framework, most likely.
405
+ }
406
+ }
407
+ }
408
+
365
409
void matchAnyPointerExpr (const Expr *fncall,
366
410
const MatchFinder::MatchResult &Result,
367
411
Environment &Env) {
@@ -502,7 +546,7 @@ auto buildTransferMatchSwitch() {
502
546
.CaseOfCFGStmt <Stmt>(arrowMatcher (), matchDereferenceExpr)
503
547
.CaseOfCFGStmt <Expr>(nullptrMatcher (), matchNullptrExpr)
504
548
.CaseOfCFGStmt <Expr>(addressofMatcher (), matchAddressofExpr)
505
- .CaseOfCFGStmt <Expr >(functionCallMatcher (), matchAnyPointerExpr )
549
+ .CaseOfCFGStmt <CallExpr >(functionCallMatcher (), matchPtrArgFunctionExpr )
506
550
.CaseOfCFGStmt <Expr>(anyPointerMatcher (), matchAnyPointerExpr)
507
551
.CaseOfCFGStmt <Expr>(castExprMatcher (), matchNullCheckExpr)
508
552
.CaseOfCFGStmt <Expr>(nullCheckExprMatcher (), matchNullCheckExpr)
@@ -586,24 +630,32 @@ void NullPointerAnalysisModel::join(QualType Type, const Value &Val1,
586
630
case SR::False:
587
631
return MergedEnv.getBoolLiteralValue (false );
588
632
case SR::Unknown:
589
- if (MergedEnv.proves (MergedEnv.arena ().makeEquals (LHSVar->formula (),
590
- RHSVar->formula ())))
591
- return *LHSVar;
592
-
593
- return MergedEnv.makeTopBoolValue ();
633
+ break ;
594
634
}
595
635
}
596
636
637
+ if (LHSVar && RHSVar &&
638
+ MergedEnv.proves (MergedEnv.arena ().makeEquals (LHSVar->formula (),
639
+ RHSVar->formula ()))) {
640
+ return *LHSVar;
641
+ }
642
+
597
643
return MergedEnv.makeTopBoolValue ();
598
644
};
599
645
600
646
BoolValue &NonnullValue = MergeValues (kIsNonnull );
601
647
BoolValue &NullValue = MergeValues (kIsNull );
602
648
603
- MergedVal.setProperty (kIsNonnull , NonnullValue);
604
- MergedVal.setProperty (kIsNull , NullValue);
605
-
606
- MergedEnv.assume (MergedEnv.makeOr (NonnullValue, NullValue).formula ());
649
+ if (&NonnullValue == &MergedEnv.makeTopBoolValue () ||
650
+ &NullValue == &MergedEnv.makeTopBoolValue ()) {
651
+ MergedVal.setProperty (kIsNonnull , MergedEnv.makeTopBoolValue ());
652
+ MergedVal.setProperty (kIsNull , MergedEnv.makeTopBoolValue ());
653
+ } else {
654
+ MergedVal.setProperty (kIsNonnull , NonnullValue);
655
+ MergedVal.setProperty (kIsNull , NullValue);
656
+
657
+ MergedEnv.assume (MergedEnv.makeOr (NonnullValue, NullValue).formula ());
658
+ }
607
659
}
608
660
609
661
ComparisonResult NullPointerAnalysisModel::compare (QualType Type,
0 commit comments