X-Git-Url: https://git.hcoop.net/bpt/coccinelle.git/blobdiff_plain/1eddfd5052863e93b723b26a1d1266471882f234..4dfbc1c2559051afaa06fbd7f7be19276d24bf44:/engine/cocci_vs_c.ml diff --git a/engine/cocci_vs_c.ml b/engine/cocci_vs_c.ml index cf5a2b6..fa0e1fe 100644 --- a/engine/cocci_vs_c.ml +++ b/engine/cocci_vs_c.ml @@ -22,23 +22,6 @@ *) -(* Yoann Padioleau, Julia Lawall - * - * Copyright (C) 2006, 2007, 2008 Ecole des Mines de Nantes - * Copyright (C) 2009, 2010 DIKU, INRIA, LIP6 - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License (GPL) - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * file license.txt for more details. - * - * This file was part of Coccinelle. - *) - open Common module A = Ast_cocci @@ -520,7 +503,7 @@ let one_initialisation_to_affectation x = match var with | Some (name, iniopt) -> (match iniopt with - | Some (iini, (B.InitExpr e, ii_empty2)) -> + | B.ValInit (iini, (B.InitExpr e, ii_empty2)) -> let local = match local with Ast_c.NotLocalDecl -> Ast_c.NotLocalVar @@ -688,7 +671,6 @@ module type PARAM = val optional_qualifier_flag : (bool -> tin -> 'x tout) -> (tin -> 'x tout) val value_format_flag: (bool -> tin -> 'x tout) -> (tin -> 'x tout) - end (*****************************************************************************) @@ -1378,6 +1360,8 @@ let rec (expression: (A.expression, Ast_c.expression) matcher) = | _, ((B.Sequence _,_),_) | _, ((B.StatementExpr _,_),_) | _, ((B.Constructor _,_),_) + | _, ((B.New _,_),_) + | _, ((B.Delete _,_),_) -> fail @@ -1415,7 +1399,7 @@ and (ident_cpp: info_ident -> (A.ident, B.name) matcher) = fail and (ident: info_ident -> (A.ident, string * Ast_c.info) matcher) = - fun infoidb ida ((idb, iib)) -> (* (idb, iib) as ib *) + fun infoidb ida ((idb, iib) as ib) -> (* (idb, iib) as ib *) let check_constraints constraints idb = let meta_id_val l x = Ast_c.MetaIdVal(x,l) in match constraints with @@ -1495,6 +1479,10 @@ and (ident: info_ident -> (A.ident, string * Ast_c.info) matcher) = | DontKnow -> failwith "MetaLocalFunc, need more semantic info about id" ) + (* not clear why disj things are needed, after disjdistr? *) + | A.DisjId ias -> + ias +> List.fold_left (fun acc ia -> acc >|+|> (ident infoidb ia ib)) fail + | A.OptIdent _ | A.UniqueIdent _ -> failwith "not handling Opt/Unique for ident" @@ -1737,20 +1725,32 @@ and (declaration: (A.mcodekind * bool * A.declaration,B.declaration) matcher) = ))) | _, (B.DeclList (xs, iiptvirgb::iifakestart::iisto)) -> - if X.mode =*= PatternMode + let indexify l = + let rec loop n = function + [] -> [] + | x::xs -> (n,x)::(loop (n+1) xs) in + loop 0 l in + let rec repln n vl cur = function + [] -> [] + | x::xs -> + if n = cur then vl :: xs else x :: (repln n vl (cur+1) xs) in + if X.mode =*= PatternMode || A.get_safe_decl decla then - xs +> List.fold_left (fun acc var -> - acc >||> ( + (indexify xs) +> List.fold_left (fun acc (n,var) -> + (* consider all possible matches *) + acc >||> (function tin -> ( X.tokenf_mck mckstart iifakestart >>= (fun mckstart iifakestart -> onedecl allminus decla (var, iiptvirgb, iisto) >>= (fun decla (var, iiptvirgb, iisto) -> return ( (mckstart, allminus, decla), - (B.DeclList ([var], iiptvirgb::iifakestart::iisto)) - ))))) + (* adjust the variable that was chosen *) + (B.DeclList (repln n var 0 xs, + iiptvirgb::iifakestart::iisto)) + )))) tin)) fail else - failwith "More that one variable in decl. Have to split to transform." + failwith "More that one variable in decl. Have to split to transform. Check that there is no transformation on the type or the ;" | A.MacroDecl (sa,lpa,eas,rpa,enda), B.MacroDecl ((sb,ebs),ii) -> let (iisb, lpb, rpb, iiendb, iifakestart, iistob) = @@ -1791,7 +1791,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> *) | A.TyDecl (tya0, ptvirga), - ({B.v_namei = Some (nameidb, None); + ({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb0; B.v_storage = (B.StoTypedef, inl); B.v_local = local; @@ -1855,7 +1855,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> return ( (A.TyDecl (tya0, ptvirga)) +> A.rewrap decla, - (({B.v_namei = Some (nameidb, None); + (({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb0; B.v_storage = (B.StoTypedef, inl); B.v_local = local; @@ -1884,7 +1884,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> return ( (A.TyDecl (tya0, ptvirga)) +> A.rewrap decla, - (({B.v_namei = Some (nameidb, None); + (({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb0; B.v_storage = (B.StoTypedef, inl); B.v_local = local; @@ -1916,14 +1916,13 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> (* could handle iso here but handled in standard.iso *) | A.UnInit (stoa, typa, ida, ptvirga), - ({B.v_namei = Some (nameidb, None); + ({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = stob; B.v_local = local; B.v_attr = attrs; B.v_type_bis = typbbis; }, iivirg) -> - tokenf ptvirga iiptvirgb >>= (fun ptvirga iiptvirgb -> fullType typa typb >>= (fun typa typb -> ident_cpp DontKnow ida nameidb >>= (fun ida nameidb -> @@ -1931,7 +1930,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> (fun stoa (stob, iistob) -> return ( (A.UnInit (stoa, typa, ida, ptvirga)) +> A.rewrap decla, - (({B.v_namei = Some (nameidb, None); + (({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = stob; B.v_local = local; @@ -1942,7 +1941,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> ))))) | A.Init (stoa, typa, ida, eqa, inia, ptvirga), - ({B.v_namei = Some(nameidb, Some (iieqb, inib)); + ({B.v_namei = Some(nameidb, B.ValInit (iieqb, inib)); B.v_type = typb; B.v_storage = stob; B.v_local = local; @@ -1959,7 +1958,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> initialiser inia inib >>= (fun inia inib -> return ( (A.Init (stoa, typa, ida, eqa, inia, ptvirga)) +> A.rewrap decla, - (({B.v_namei = Some(nameidb, Some (iieqb, inib)); + (({B.v_namei = Some(nameidb, B.ValInit (iieqb, inib)); B.v_type = typb; B.v_storage = stob; B.v_local = local; @@ -1969,6 +1968,16 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> iiptvirgb,iistob) ))))))) + | A.Init (stoa, typa, ida, eqa, inia, ptvirga), + ({B.v_namei = Some(nameidb, B.ConstrInit _); + B.v_type = typb; + B.v_storage = stob; + B.v_local = local; + B.v_attr = attrs; + B.v_type_bis = typbbis; + },iivirg) + -> fail (* C++ constructor declaration not supported in SmPL *) + (* do iso-by-absence here ? allow typedecl and var ? *) | A.TyDecl (typa, ptvirga), ({B.v_namei = None; B.v_type = typb; @@ -1996,7 +2005,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> | A.Typedef (stoa, typa, ida, ptvirga), - ({B.v_namei = Some (nameidb, None); + ({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = (B.StoTypedef,inline); B.v_local = local; @@ -2049,7 +2058,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> ) >>= (fun ida nameidb -> return ( (A.Typedef (stoa, typa, ida, ptvirga)) +> A.rewrap decla, - (({B.v_namei = Some (nameidb, None); + (({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = (B.StoTypedef,inline); B.v_local = local; @@ -2405,7 +2414,7 @@ and (struct_field: (A.declaration, B.field) matcher) = fun fa fb -> let iisto = [] in let stob = B.NoSto, false in let fake_var = - ({B.v_namei = Some (nameidb, None); + ({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = stob; B.v_local = Ast_c.NotLocalDecl; @@ -2420,7 +2429,7 @@ and (struct_field: (A.declaration, B.field) matcher) = fun fa fb -> (fun fa (var,iiptvirgb,iisto) -> match fake_var with - | ({B.v_namei = Some (nameidb, None); + | ({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = stob; }, iivirg) -> @@ -2992,6 +3001,7 @@ and (typeC: (A.typeC, Ast_c.typeC) matcher) = ) + | _, (B.NoType, ii) -> fail | _, (B.TypeOfExpr e, ii) -> fail | _, (B.TypeOfType e, ii) -> fail @@ -3281,6 +3291,8 @@ and compatible_type a (b,local) = let ok = return ((),()) in let rec loop = function + | _, (qua, (B.NoType, _)) -> + failwith "compatible_type: matching with NoType" | Type_cocci.BaseType a, (qua, (B.BaseType b,ii)) -> compatible_base_type a None b @@ -3565,8 +3577,7 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) = | _, F.EndStatement _ | _, F.CaseNode _ | _, F.TrueNode | _, F.FalseNode | _, F.AfterNode | _, F.FallThroughNode | _, F.LoopFallThroughNode - | _, F.InLoopNode - -> fail2() + | _, F.InLoopNode -> fail2() (* really ? diff between pattern.ml and transformation.ml *) | _, F.Fake -> fail2() @@ -3982,6 +3993,15 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) = ))) else fail + | A.Undef(undefa,ida), F.DefineHeader ((idb, ii), B.Undef) -> + let (defineb, iidb, ieol) = tuple_of_list3 ii in + ident DontKnow ida (idb, iidb) >>= (fun ida (idb, iidb) -> + tokenf undefa defineb >>= (fun undefa defineb -> + return ( + A.Undef(undefa,ida), + F.DefineHeader ((idb,[defineb;iidb;ieol]),B.Undef) + )) + ) | A.DefineHeader(definea,ida,params), F.DefineHeader ((idb, ii), defkind) -> @@ -4081,7 +4101,8 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) = (F.Label (_, _, _)|F.Break (_, _)|F.Continue (_, _)|F.Default (_, _)| F.Case (_, _)|F.Include _|F.Goto _|F.ExprStatement _| F.DefineType _|F.DefineExpr _|F.DefineTodo| - F.DefineHeader (_, _)|F.ReturnExpr (_, _)|F.Return (_, _)|F.MacroIterHeader (_, _)| + F.DefineHeader (_, _)|F.ReturnExpr (_, _)|F.Return (_, _)| + F.MacroIterHeader (_, _)| F.SwitchHeader (_, _)|F.ForHeader (_, _)|F.DoWhileTail _|F.DoHeader (_, _)| F.WhileHeader (_, _)|F.Else _|F.IfHeader (_, _)| F.SeqEnd (_, _)|F.SeqStart (_, _, _)|