Skip to content

Commit 591154f

Browse files
authored
Merge pull request #1063 from goblint/evalfun-ptranal
Add CIL's ptranal for `EvalFunvar` queries
2 parents c0c8960 + 408fbe1 commit 591154f

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

src/analyses/ptranalAnalysis.ml

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
(** CIL's {!GoblintCil.Ptranal} for function pointer evaluation ([ptranal]).
2+
3+
Useful for sound analysis of function pointers without base. *)
4+
5+
(* TODO: fix unsoundness on some bench repo examples: https://github.com/goblint/analyzer/pull/1063 *)
6+
7+
open GoblintCil
8+
open Analyses
9+
10+
module Spec =
11+
struct
12+
include UnitAnalysis.Spec
13+
14+
let name () = "ptranal"
15+
16+
let query ctx (type a) (q: a Queries.t): a Queries.result =
17+
match q with
18+
| Queries.EvalFunvar (Lval (Mem e, _)) ->
19+
let funs = Ptranal.resolve_exp e in
20+
(* TODO: filter compatible function pointers by type? *)
21+
List.fold_left (fun xs f -> Queries.AD.add (Queries.AD.Addr.of_var f) xs) (Queries.AD.empty ()) funs
22+
| _ -> Queries.Result.top q
23+
24+
let init _: unit =
25+
Ptranal.analyze_file !Cilfacade.current_file;
26+
Ptranal.compute_results false
27+
28+
end
29+
30+
let _ =
31+
MCP.register_analysis (module Spec : MCPSpec)

src/goblint_lib.ml

+1
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ module TaintPartialContexts = TaintPartialContexts
164164
module UnassumeAnalysis = UnassumeAnalysis
165165
module ExpRelation = ExpRelation
166166
module AbortUnless = AbortUnless
167+
module PtranalAnalysis = PtranalAnalysis
167168

168169

169170
(** {1 Domains}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//PARAM: --set ana.activated '["constants", "ptranal"]'
2+
// intentional explicit ana.activated to do tutorial in isolation
3+
int f(int a, int b){
4+
int d = 3;
5+
int z = a + d;
6+
return z;
7+
}
8+
9+
int main(){
10+
int d = 0;
11+
int (*fp)(int,int) = &f;
12+
d = fp(2, 3);
13+
return 0;
14+
}

0 commit comments

Comments
 (0)