Frama-C-discuss mailing list archives
This page gathers the archives of the old Frama-C-discuss archives, that was hosted by Inria's gforge before its demise at the end of 2020. To search for mails newer than September 2020, please visit the page of the new mailing list on Renater.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Frama-c-discuss] How to transform a statement with case label by using the visitor?
- Subject: [Frama-c-discuss] How to transform a statement with case label by using the visitor?
- From: abiao.yang at gmail.com (David Yang)
- Date: Fri, 16 May 2014 03:29:12 +0800
Dear all,
I am writing a script to insert a statement into the case statement.
But I failed to correctly transform the code for value anaysis.
i want to transform a case statement from :
case 0: result = f1(a);
to:
case 0: result = 1; result = f1(a);
I know this code transform has no semantic meanings to this piece of code.
What I am focus on is how to transform the statement with case labels.
the command line I used for loading the script is:
--------------------command------------------------
frama-c -load-script transform_case.ml case_func.c
Attached please find the file "transform_case.ml" and the file "case_func.c"
/* ------------------------ content of case_func.c -------------- */
int main (int arg)
{
int result;
char* a;
int b;
switch(argz) {
case 0: result = f1(a);
default: result = -1;
}
return result;
}
(* ---------------- content of transform_case.ml --------------------- *)
open Cil
open Cil_types
class transform_case_call_stmt prj =
object (self)
inherit Visitor.frama_c_copy prj
method vstmt_aux stmt =
if (List.exists Cil.is_case_label stmt.labels) then begin
match stmt.skind with
| Instr (Call(lval, _, _, loc)) ->
begin
match lval with
| Some(Var vi, _) ->
begin
let instr = Cil_types.Set(Cil.var vi, Cil.integer ~loc 1, loc) in
let insert_stmt = Cil.mkStmt (Cil_types.Instr instr) in
insert_stmt.labels <- stmt.labels;
stmt.labels <- [];
let bloc_kind = Cil_types.Block(Cil.mkBlock [insert_stmt; stmt]) in
let new_stmt = Cil.mkStmt bloc_kind in
Cil.ChangeTo new_stmt
end
| _ -> Cil.DoChildren
end
| _ -> Cil.DoChildren
end else Cil.DoChildren
end;;
module Computed =
State_builder.False_ref(
struct
let name = "transform"
let dependencies = []
let kind = `Internal
end
)
let main () =
if not (Computed.get()) then
begin
Computed.set true;
Ast.compute ();
Format.printf "Before transfering:\n%a" Printer.pp_file (Ast.get ());
let vis = new transform_case_call_stmt in
let prj = File.create_project_from_visitor "transfer" vis in
Project.set_current prj;
Format.printf "\n\nAfter transfering:\n%a" Printer.pp_file (Ast.get ());
Globals.set_entry_point "main" true;
!Db.Value.compute ();
end;
;;
let () = Db.Main.extend main
-------------- next part --------------
A non-text attachment was scrubbed...
Name: case_func.c
Type: text/x-csrc
Size: 230 bytes
Desc: not available
URL: <http://lists.gforge.inria.fr/pipermail/frama-c-discuss/attachments/20140516/98861f81/attachment.c>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: transform_case.ml
Type: application/octet-stream
Size: 1554 bytes
Desc: not available
URL: <http://lists.gforge.inria.fr/pipermail/frama-c-discuss/attachments/20140516/98861f81/attachment.obj>
- Follow-Ups:
- [Frama-c-discuss] How to transform a statement with case label by using the visitor?
- From: abiao.yang at gmail.com (David Yang)
- [Frama-c-discuss] How to transform a statement with case label by using the visitor?
- Prev by Date: [Frama-c-discuss] Questions on wp about _Bool, inductive predicates and Coq
- Next by Date: [Frama-c-discuss] How to transform a statement with case label by using the visitor?
- Previous by thread: [Frama-c-discuss] Questions on wp about _Bool, inductive predicates and Coq
- Next by thread: [Frama-c-discuss] How to transform a statement with case label by using the visitor?
- Index(es):
