123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)openCil_typestypestatus_accessor=string*(Cil_types.kernel_function->bool->unit)*(Cil_types.kernel_function->bool)moduletypeS=sigvalis_computed:kernel_function->boolvalset:kernel_function->bool->unitvalaccessor:status_accessorendletstates:State.tlistref=ref[]letaccessors:status_accessorlistref=ref[]moduleMake(M:sigvalname:stringvalparameter:Typed_parameter.tvaladditional_parameters:Typed_parameter.tlistvalkernel_active:unit->boolend)=structmoduleH=Kernel_function.Make_Table(Datatype.Bool)(structletname="RTE.Computed."^M.nameletsize=17letdependencies=letextractp=State.getp.Typed_parameter.nameinAst.self::Options.Trivial.self::List.mapextract(M.parameter::M.additional_parameters)end)letis_computed=(* Nothing to do for functions without body. *)letdefaultkf=not(Kernel_function.is_definitionkf)infunkf->(* TODO: Ok, this is far from perfect. Since the kernel does not
centralize alarms management, one might ask RTE whether alarms
have been emitted even if RTE itself has not been started. In
this case, if RTE is configured to use Eva results, it checks
whether Eva emitted these alarms.
*)ifM.kernel_active()&&Options.use_eva_results()&&Eva_analysis.is_computedkfthentrueelseH.memodefaultkfletset=H.replaceletself=H.selfletaccessor=M.name,set,is_computedlet()=states:=self::!states;accessors:=accessor::!accessors;endmoduleInitialized=Make(structletname="initialized"letparameter=Options.DoInitialized.parameterletadditional_parameters=[]letkernel_active()=trueend)moduleMem_access=Make(structletname="mem_access"letparameter=Options.DoMemAccess.parameterletadditional_parameters=[Kernel.SafeArrays.parameter]letkernel_active()=trueend)modulePointer_alignment=Make(structletname="pointer_alignment"letparameter=Kernel.UnalignedPointer.parameterletadditional_parameters=[]letkernel_active()=Kernel.UnalignedPointer.get()end)modulePointer_value=Make(structletname="pointer_value"letparameter=Kernel.InvalidPointer.parameterletadditional_parameters=[]letkernel_active()=Kernel.InvalidPointer.get()end)modulePointer_call=Make(structletname="pointer_call"letparameter=Options.DoPointerCall.parameterletadditional_parameters=[]letkernel_active()=trueend)moduleDiv_mod=Make(structletname="division_by_zero"letparameter=Options.DoDivMod.parameterletadditional_parameters=[]letkernel_active()=trueend)moduleShift=Make(structletname="shift_value_out_of_bounds"letparameter=Options.DoShift.parameterletadditional_parameters=[]letkernel_active()=trueend)moduleLeft_shift_negative=Make(structletname="left_shift_negative"letparameter=Kernel.LeftShiftNegative.parameterletadditional_parameters=[]letkernel_active()=Kernel.LeftShiftNegative.get()end)moduleRight_shift_negative=Make(structletname="right_shift_negative"letparameter=Kernel.RightShiftNegative.parameterletadditional_parameters=[]letkernel_active()=Kernel.RightShiftNegative.get()end)moduleSigned_overflow=Make(structletname="signed_overflow"letparameter=Kernel.SignedOverflow.parameterletadditional_parameters=[]letkernel_active()=Kernel.SignedOverflow.get()end)moduleSigned_downcast=Make(structletname="downcast"letparameter=Kernel.SignedDowncast.parameterletadditional_parameters=[]letkernel_active()=Kernel.SignedDowncast.get()end)moduleUnsigned_overflow=Make(structletname="unsigned_overflow"letparameter=Kernel.UnsignedOverflow.parameterletadditional_parameters=[]letkernel_active()=Kernel.UnsignedOverflow.get()end)moduleUnsigned_downcast=Make(structletname="unsigned_downcast"letparameter=Kernel.UnsignedDowncast.parameterletadditional_parameters=[]letkernel_active()=Kernel.UnsignedDowncast.get()end)modulePointer_downcast=Make(structletname="pointer_downcast"letparameter=Kernel.PointerDowncast.parameterletadditional_parameters=[]letkernel_active()=Kernel.PointerDowncast.get()end)moduleFloat_to_int=Make(structletname="float_to_int"letparameter=Options.DoFloatToInt.parameterletadditional_parameters=[]letkernel_active()=trueend)moduleFinite_float=Make(structletname="finite_float"letparameter=Kernel.SpecialFloat.parameterletadditional_parameters=[]letkernel_active()=Kernel.SpecialFloat.get()<>"none"end)moduleBool_value=Make(structletname="bool_value"letparameter=Kernel.InvalidBool.parameterletadditional_parameters=[]letkernel_active()=Kernel.InvalidBool.get()end)(** DO NOT CALL Make AFTER THIS POINT *)letproxy=State_builder.Proxy.create"RTE"State_builder.Proxy.Backward!statesletself=State_builder.Proxy.getproxyletall_statuses=!accessorsletemitter=Emitter.create"rte"[Emitter.Property_status;Emitter.Alarm]~correctness:[Kernel.SafeArrays.parameter]~tuning:[]letget_registered_annotationsstmt=Annotations.fold_code_annot(funeaacc->ifEmitter.equaleemitterthena::accelseacc)stmt[]