diff --git a/infer/src/backend/symExec.ml b/infer/src/backend/symExec.ml index 1924031fd..a6279d19b 100644 --- a/infer/src/backend/symExec.ml +++ b/infer/src/backend/symExec.ml @@ -1362,7 +1362,7 @@ and call_unknown_or_scan is_scan cfg pdesc tenv pre path let actuals_by_ref = IList.filter (function - | Sil.Lvar _, _ -> true + | Sil.Lvar _, Sil.Tptr (Sil.Tptr _, _) -> true | _ -> false) actual_pars in let pre_final = diff --git a/infer/tests/codetoanalyze/c/errors/null_dereference/angelism.c b/infer/tests/codetoanalyze/c/errors/null_dereference/angelism.c index 21bf6a819..8d5e2a413 100644 --- a/infer/tests/codetoanalyze/c/errors/null_dereference/angelism.c +++ b/infer/tests/codetoanalyze/c/errors/null_dereference/angelism.c @@ -35,6 +35,7 @@ extern struct delicious *bakery(struct delicious **cake); extern struct delicious *bakery2(struct delicious **cake, struct delicious **pie); extern struct delicious *returnPassByRef(); +extern void skip(struct delicious * s); struct delicious *skip_external_function(void) { struct delicious *cake = NULL; @@ -87,3 +88,10 @@ void returnPassByRefDeref() { ret->yum = 2; // should not report a warning free(ret); } + +int passStructByRefDeref() { + struct delicious d; + d.yum = 7; + skip(&d); + return 1 / d.yum; // should not report a warning +}