This option prevents converting direct function calls into the
calls-by-pointers if the address of the function has been taken
somewhere.  Calls from inside of structures are converted anyway.

(A small debug print fix has been also applied)
---
 src/ext/simplify.ml |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/ext/simplify.ml b/src/ext/simplify.ml
index 706e12d..0e3de67 100644
--- a/src/ext/simplify.ml
+++ b/src/ext/simplify.ml
@@ -85,6 +85,10 @@ let splitStructs = ref true
 let simpleMem = ref true
 let simplAddrOf = ref true
 
+(* Whether to convert function calls to calls-by-pointer when function address
+ * has been taken somewhere. *)
+let convertDirectCalls = ref true
+
 let onlyVariableBasics = ref false
 let noStringConstantsBasics = ref false
 
@@ -130,7 +134,7 @@ and makeBasic (setTemp: taExp -> bExp) (e: exp) : bExp =
   (* Make it a three address expression first *)
   let e' = makeThreeAddress setTemp e in
   if dump then 
-    ignore (E.log "   e'= %a\n" d_plainexp e);
+    ignore (E.log "   e'= %a\n" d_plainexp e');
   (* See if it is a basic one *)
   match e' with 
   | Lval (Var _, _) -> e'
@@ -220,8 +224,9 @@ and simplifyLval
       in
       let a' = if !simpleMem then makeBasic setTemp a' else a' in
       Mem (mkCast a' (typeForCast restoff)), restoff
-
-  | Var v, off when v.vaddrof -> (* We are taking this variable's address *)
+  (* We are taking this variable's address; but suppress simplification if 
it's a simple function
+   * call in no-convert mode*)
+  | Var v, off when v.vaddrof && (!convertDirectCalls || not (isFunctionType 
(typeOfLval lv) ))  ->
       let offidx, restoff = offsetToInt v.vtype off in
       (* We cannot call makeBasic recursively here, so we must do it 
        * ourselves *)
@@ -714,6 +719,9 @@ let feature : featureDescr =
     fd_extraopt = [
       ("--no-split-structs", Arg.Clear splitStructs,
                     " do not split structured variables"); 
+      ("--no-convert-direct-calls", Arg.Clear convertDirectCalls,
+                    " do not convert direct function calls to function pointer 
\
+                      calls if the address of the function was taken");
     ];
     fd_doit = (function f -> iterGlobals f doGlobal);
     fd_post_check = true;
-- 
1.7.0.2


------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
CIL-users mailing list
CIL-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cil-users

Reply via email to