123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155(**************************************************************************)(* *)(* This file is part of Frama-C. *)(* *)(* Copyright (C) 2007-2023 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It 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 *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file licenses/LGPLv2.1). *)(* *)(**************************************************************************)openCil_types(** Points-to graphs datastructure. *)moduleG=Abstract_state.Gletvid=Abstract_state.vidmoduleLSet=Abstract_state.LSetmoduleAbstract_state=Abstract_stateletcheck_computed()=ifnot(Analysis.is_computed())thenOptions.abort"Static analysis must be called before any function of the API can be called"letlset(get_set:Abstract_state.t->LSet.t)(kf:kernel_function)(s:stmt)=check_computed();matchAnalysis.get_state_before_stmtkfswith|None->LSet.empty|Somestate->get_setstateletpoints_to_set_stmtkfslv=lset(Abstract_state.points_to_setlv)kfsletnew_points_to_set_stmtkfslv=letget_setstate=letnew_state=Analysis.do_stmtstatesinAbstract_state.points_to_setlvnew_stateinlsetget_setkfsletaliases_stmtkfslv=lset(Abstract_state.find_all_aliaseslv)kfsletnew_aliases_stmtkfslv=letget_setstate=letnew_state=Analysis.do_stmtstatesinAbstract_state.find_all_aliaseslvnew_stateinlsetget_setkfsletpoints_to_set_kf(kf:kernel_function)(lv:lval)=check_computed();ifKernel_function.has_definitionkfthenlets=Kernel_function.find_returnkfinnew_points_to_set_stmtkfslvelseOptions.abort"points_to_set_kf: function %a has no definition"Kernel_function.prettykfletaliases_kf(kf:kernel_function)(lv:lval)=check_computed();ifKernel_function.has_definitionkfthenlets=Kernel_function.find_returnkfinnew_aliases_stmtkfslvelseOptions.abort"aliases_kf: function %a has no definition"Kernel_function.prettykfletfundec_stmts(kf:kernel_function)(lv:lval)=check_computed();ifKernel_function.has_definitionkfthenList.map(funs->s,new_aliases_stmtkfslv)(Kernel_function.get_definitionkf).sallstmtselseOptions.abort"fundec_stmts: function %a has no definition"Kernel_function.prettykfletfold_points_to_setf_foldacckfslv=LSet.fold(funea->f_foldae)(points_to_set_stmtkfslv)accletfold_aliases_stmtf_foldacckfslv=LSet.fold(funea->f_foldae)(aliases_stmtkfslv)accletfold_new_aliases_stmtf_foldacckfslv=LSet.fold(funea->f_foldae)(new_aliases_stmtkfslv)accletfold_points_to_set_kf(f_fold:'a->lval->'a)(acc:'a)(kf:kernel_function)(lv:lval):'a=LSet.fold(funea->f_foldae)(points_to_set_kfkflv)accletfold_aliases_kf(f_fold:'a->lval->'a)(acc:'a)(kf:kernel_function)(lv:lval):'a=LSet.fold(funea->f_foldae)(aliases_kfkflv)accletfold_fundec_stmts(f_fold:'a->stmt->lval->'a)(acc:'a)(kf:kernel_function)(lv:lval):'a=List.fold_left(funacc(s,set)->LSet.fold(funlva->f_foldaslv)setacc)acc(fundec_stmtskflv)letare_aliased(kf:kernel_function)(s:stmt)(lv1:lval)(lv2:lval):bool=check_computed();matchAnalysis.get_state_before_stmtkfswithNone->false|Somestate->letsetv1=Abstract_state.find_all_aliaseslv1stateinLSet.memlv2setv1letfold_vertex(f_fold:'a->G.V.t->lval->'a)(acc:'a)(kf:kernel_function)(s:stmt)(lv:lval):'a=check_computed();matchAnalysis.get_state_before_stmtkfswithNone->acc|Somestate->letv:G.V.t=Abstract_state.find_vertexlvstateinletset_aliases=Abstract_state.find_aliaseslvstateinLSet.fold(funlva->f_foldavlv)set_aliasesaccletfold_vertex_closure(f_fold:'a->G.V.t->lval->'a)(acc:'a)(kf:kernel_function)(s:stmt)(lv:lval):'a=check_computed();matchAnalysis.get_state_before_stmtkfswithNone->acc|Somestate->letlist_closure:(G.V.t*LSet.t)list=Abstract_state.find_transitive_closurelvstateinList.fold_left(funacc(i,s)->LSet.fold(funlva->f_foldailv)sacc)acclist_closureletget_state_before_stmt=Analysis.get_state_before_stmtletcall_functionafresargs=matchAnalysis.get_summaryfwithNone->None|Somesu->Some(Abstract_state.callaresargssu)letsimplify_lval=Simplified.Lval.simplify