diff --git a/pybind/AE.cpp b/pybind/AE.cpp index 5fabd52..5b23f33 100644 --- a/pybind/AE.cpp +++ b/pybind/AE.cpp @@ -734,14 +734,12 @@ void bind_abstract_state(py::module& m) { return self.getTrace().count(node) > 0; }, py::arg("node")) - // Def/Use site queries. - .def("getUseSitesOfObjVar", &AbstractInterpretation::getUseSitesOfObjVar, - py::arg("obj"), py::arg("node")) - .def("getUseSitesOfValVar", &AbstractInterpretation::getUseSitesOfValVar, py::arg("var")) - .def("getDefSiteOfValVar", &AbstractInterpretation::getDefSiteOfValVar, - py::arg("var"), py::return_value_policy::reference) - .def("getDefSiteOfObjVar", &AbstractInterpretation::getDefSiteOfObjVar, - py::arg("obj"), py::arg("node"), py::return_value_policy::reference) + // Def/Use site queries used to live on AbstractInterpretation but + // moved to FullSparseAbstractInterpretation in upstream PR #1812 + // (sparse-AE refactor). They aren't part of the dense base class + // public API any more, and pysvf has no FullSparseAbstractInterpretation + // binding yet, so they're dropped here. Equivalent SVFG-based + // queries are available on the SVFG class directly. // Top-level driver methods. .def("analyse", &AbstractInterpretation::analyse) diff --git a/pybind/Graphs.cpp b/pybind/Graphs.cpp index 7e924e8..03aa54f 100644 --- a/pybind/Graphs.cpp +++ b/pybind/Graphs.cpp @@ -942,18 +942,26 @@ void bind_svfg(py::module& m) { .def("hasFormalINSVFGNodes", [](SVFG& svfg, const FunObjVar* fun) { return svfg.hasFormalINSVFGNodes(fun); }, py::arg("fun"), "Check if there are FormalIN SVFG nodes for a given function") .def("getSVFGNode", [](SVFG& svfg, NodeID id) -> SVFGNode* { return svfg.getSVFGNode(id); }, py::arg("id"), py::return_value_policy::reference, "Get an SVFG node by ID") .def("hasSVFGNode", [](SVFG& svfg, NodeID id) { return svfg.hasSVFGNode(id); }, py::arg("id"), "Check if an SVFG node exists") - .def("getDefSiteOfValVar", [](SVFG& svfg, const ValVar* var) { return svfg.getDefSiteOfValVar(var); }, py::arg("var"), py::return_value_policy::reference, "Get the definition site of a value variable") - .def("getDefSiteOfObjVar", [](SVFG& svfg, const ObjVar* obj, const ICFGNode* node) { return svfg.getDefSiteOfObjVar(obj, node); }, py::arg("obj"), py::arg("node"), py::return_value_policy::reference, "Get the definition site of an object variable") + // Upstream PR #1812 follow-up retyped these from ICFGNode to SVFGNode. + // The SVFGNode is the SVFG-internal representation of a def/use site; + // callers can map back to ICFGNode via SVFGNode::getICFGNode() if + // they need ICFG-side information. + .def("getDefSiteOfValVar", [](SVFG& svfg, const ValVar* var) { return svfg.getDefSiteOfValVar(var); }, py::arg("var"), py::return_value_policy::reference, "Get the SVFG definition site of a value variable") + .def("getDefSiteOfObjVar", [](SVFG& svfg, const ObjVar* obj, const SVFGNode* node) { + Set sites = svfg.getDefSiteOfObjVar(obj, node); + std::vector result(sites.begin(), sites.end()); + return result; + }, py::arg("obj"), py::arg("node"), py::return_value_policy::reference, "Get the SVFG definition sites of an object variable reaching this SVFG node") .def("getUseSitesOfValVar", [](SVFG& svfg, const ValVar* var) { - Set sites = svfg.getUseSitesOfValVar(var); - std::vector result(sites.begin(), sites.end()); + Set sites = svfg.getUseSitesOfValVar(var); + std::vector result(sites.begin(), sites.end()); return result; - }, py::arg("var"), py::return_value_policy::reference, "Get the use sites of a value variable") - .def("getUseSitesOfObjVar", [](SVFG& svfg, const ObjVar* obj, const ICFGNode* node) { - Set sites = svfg.getUseSitesOfObjVar(obj, node); - std::vector result(sites.begin(), sites.end()); + }, py::arg("var"), py::return_value_policy::reference, "Get the SVFG use sites of a value variable") + .def("getUseSitesOfObjVar", [](SVFG& svfg, const ObjVar* obj, const SVFGNode* node) { + Set sites = svfg.getUseSitesOfObjVar(obj, node); + std::vector result(sites.begin(), sites.end()); return result; - }, py::arg("obj"), py::arg("node"), py::return_value_policy::reference, "Get the use sites of an object variable") + }, py::arg("obj"), py::arg("node"), py::return_value_policy::reference, "Get the SVFG use sites of an object variable starting from this SVFG def-site node") .def("isFunEntrySVFGNode", [](SVFG& svfg, const SVFGNode* node) { return svfg.isFunEntrySVFGNode(node); }, py::arg("node"), py::return_value_policy::reference, "Check if the SVFG node is a function entry node, returns the function or nullptr") .def("isCallSiteRetSVFGNode", [](SVFG& svfg, const SVFGNode* node) { return svfg.isCallSiteRetSVFGNode(node); }, py::arg("node"), py::return_value_policy::reference, "Check if the SVFG node is a call site return node, returns the call site or nullptr"); } diff --git a/pysvf/pysvf.pyi b/pysvf/pysvf.pyi index a9d58fd..fb40d22 100644 --- a/pysvf/pysvf.pyi +++ b/pysvf/pysvf.pyi @@ -1719,14 +1719,14 @@ class SVFG(VFG): """Get an SVFG node by ID""" def hasSVFGNode(self, id: int) -> bool: ... """Check if an SVFG node exists""" - def getDefSiteOfValVar(self, var: ValVar) -> ICFGNode: ... - """Get the definition site of a value variable""" - def getDefSiteOfObjVar(self, obj: ObjVar, node: ICFGNode) -> ICFGNode: ... - """Get the definition site of an object variable""" - def getUseSitesOfValVar(self, var: ValVar) -> List[ICFGNode]: ... - """Get the use sites of a value variable""" - def getUseSitesOfObjVar(self, obj: ObjVar, node: ICFGNode) -> List[ICFGNode]: ... - """Get the use sites of an object variable""" + def getDefSiteOfValVar(self, var: ValVar) -> "VFGNode": ... + """Get the SVFG definition site of a value variable""" + def getDefSiteOfObjVar(self, obj: ObjVar, node: "VFGNode") -> List["VFGNode"]: ... + """Get the SVFG definition sites of an object variable reaching this SVFG node""" + def getUseSitesOfValVar(self, var: ValVar) -> List["VFGNode"]: ... + """Get the SVFG use sites of a value variable""" + def getUseSitesOfObjVar(self, obj: ObjVar, node: "VFGNode") -> List["VFGNode"]: ... + """Get the SVFG use sites of an object variable starting from this SVFG def-site node""" def isFunEntrySVFGNode(self, node: VFGNode) -> Optional[FunObjVar]: ... """Check if the SVFG node is a function entry node, returns the function or nullptr""" def isCallSiteRetSVFGNode(self, node: VFGNode) -> Optional[CallICFGNode]: ... @@ -2022,11 +2022,6 @@ class AbstractInterpretation: def __setitem__(self, node: 'ICFGNode', state: AbstractState) -> None: ... def __contains__(self, node: 'ICFGNode') -> bool: ... - def getUseSitesOfObjVar(self, obj: 'ObjVar', node: 'ICFGNode') -> set: ... - def getUseSitesOfValVar(self, var: 'ValVar') -> set: ... - def getDefSiteOfValVar(self, var: 'ValVar') -> 'ICFGNode': ... - def getDefSiteOfObjVar(self, obj: 'ObjVar', node: 'ICFGNode') -> 'ICFGNode': ... - def analyse(self) -> None: ... def analyzeFromAllProgEntries(self) -> None: ... def runOnModule(self) -> None: ...