123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)openServeropenCil_typesletpackage=lettitle="Eva Analysis"inPackage.package~plugin:"eva"~name:"analysis"~title()(* ----- Computation state -------------------------------------------------- *)moduleComputationState=structtypet=Self.computation_stateletjtype=Data.declare~package~name:"computationStateType"~descr:(Markdown.plain"State of the computation of Eva Analysis.")Package.(Junion[Jtag"not_computed";Jtag"computing";Jtag"computed";Jtag"aborted"])letto_json=function|Self.NotComputed->`String"not_computed"|Computing->`String"computing"|Computed->`String"computed"|Aborted->`String"aborted"endlet_signal=States.register_framac_value~package~name:"computationState"~descr:(Markdown.plain"The current computation state of the analysis.")~output:(moduleComputationState)(moduleSelf.ComputationState)let()=Request.register~package~kind:`EXEC~name:"compute"~descr:(Markdown.plain"run eva analysis")~input:(moduleData.Junit)~output:(moduleData.Junit)Analysis.computelet()=Request.register~package~kind:`GET(* able to interrupt the EXEC compute request *)~name:"abort"~descr:(Markdown.plain"abort eva analysis")~input:(moduleData.Junit)~output:(moduleData.Junit)Analysis.abortletclear()=ifSelf.ComputationState.get()<>ComputingthenbeginSelf.clear_results();Emitter.clearEva_utils.emitter;Emitter.clearEva_utils.export_emitter;endlet()=Request.register~package~kind:`SET~name:"clear"~descr:(Markdown.plain"removes all results from previous Eva analyses, \
including emitted alarms, annotations and statuses")~input:(moduleData.Junit)~output:(moduleData.Junit)clear(* ----- Domains states ----------------------------------------------------- *)letcompute_lval_depsrequestlval=letzone=Results.lval_depslvalrequestinMemory_zone.get_baseszoneletcompute_expr_depsrequestexpr=letzone=Results.expr_depsexprrequestinMemory_zone.get_baseszoneletcompute_instr_depsrequest=function|Set(lval,expr,_)->Base.SetLattice.join(compute_lval_depsrequestlval)(compute_expr_depsrequestexpr)|Local_init(vi,AssignInit(SingleInitexpr),_)->Base.SetLattice.join(Base.SetLattice.inject_singleton(Base.of_varinfovi))(compute_expr_depsrequestexpr)|_->Base.SetLattice.emptyletcompute_stmt_depsrequeststmt=matchstmt.skindwith|Instr(instr)->compute_instr_depsrequestinstr|If(expr,_,_,_)->compute_expr_depsrequestexpr|_->Base.SetLattice.emptyletcompute_marker_depsrequest=function|Printer_tag.PStmt(_,stmt)|PStmtStart(_,stmt)->compute_stmt_depsrequeststmt|PLval(_,_,lval)->compute_lval_depsrequestlval|PExp(_,_,expr)->compute_expr_depsrequestexpr|PVDecl(_,_,vi)->Base.SetLattice.inject_singleton(Base.of_varinfovi)|_->Base.SetLattice.emptyletget_filtered_staterequestmarker=letbases=compute_marker_depsrequestmarkerinmatchbaseswith|Base.SetLattice.Top->Results.print_statesrequest|Base.SetLattice.Setbases->ifBase.Hptset.is_emptybasesthen[]elseResults.print_states~filter:basesrequestletget_statefilterrequestmarker=iffilterthenget_filtered_staterequestmarkerelseResults.print_statesrequestletget_states(marker,filter)=letkinstr=Printer_tag.ki_of_localizablemarkerinmatchkinstrwith|Kglobal->[]|Kstmtstmt->letstates_before=get_statefilter(Results.beforestmt)markerinletstates_after=get_statefilter(Results.afterstmt)markerinmatchstates_before,states_afterwith|[],_->List.map(fun(name,after)->name,"",after)states_after|_,[]->List.map(fun(name,before)->name,before,"")states_before|_,_->letjoin(name,before)(name',after)=assert(name=name');name,before,afterinList.rev_map2joinstates_beforestates_afterlet()=Request.register~package~kind:`GET~name:"getStates"~descr:(Markdown.plain"Get the domain states about the given marker")~input:(moduleData.Jpair(Kernel_ast.Marker)(Data.Jbool))~output:(moduleData.Jlist(Data.Jtriple(Data.Jstring)(Data.Jstring)(Data.Jstring)))~signals:Update.signalsget_states