From 5e9a21573bdbcdd5a46e78501652253ebc9b4480 Mon Sep 17 00:00:00 2001 From: Sam Blackshear Date: Tue, 9 Feb 2016 17:02:33 -0800 Subject: [PATCH] preventing Bad_footprint when passing struct value by reference Reviewed By: jberdine Differential Revision: D2912475 fb-gh-sync-id: 1dd5442 shipit-source-id: 1dd5442 --- infer/src/backend/symExec.ml | 2 +- .../codetoanalyze/c/errors/null_dereference/angelism.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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 +}