diff --git a/releasenotes/notes/fix-segfault-is_dag_fn-8335e900ffca6af9.yaml b/releasenotes/notes/fix-segfault-is_dag_fn-8335e900ffca6af9.yaml new file mode 100644 index 0000000000..dcd626de7a --- /dev/null +++ b/releasenotes/notes/fix-segfault-is_dag_fn-8335e900ffca6af9.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - | + Fixed a potential segfault that could occur when calling + :func:`~retworkx.is_directed_acyclic_graph` with a a very deep + :class:`~retworkx.PyDiGraph` object as reported in + `Qiskit/qiskit-terra#5502 `__. + diff --git a/src/lib.rs b/src/lib.rs index 4c8e654543..7b60359c92 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -231,8 +231,10 @@ pub fn is_weakly_connected(graph: &digraph::PyDiGraph) -> PyResult { #[pyfunction] #[text_signature = "(graph, /)"] fn is_directed_acyclic_graph(graph: &digraph::PyDiGraph) -> bool { - let cycle_detected = algo::is_cyclic_directed(graph); - !cycle_detected + match algo::toposort(graph, None) { + Ok(_nodes) => true, + Err(_err) => false, + } } /// Determine if 2 graphs are structurally isomorphic diff --git a/tests/test_edges.py b/tests/test_edges.py index 8fd4fa3e1b..0ee51c4e6b 100644 --- a/tests/test_edges.py +++ b/tests/test_edges.py @@ -209,6 +209,15 @@ def test_cycle_checking_at_init_nodes_from(self): with self.assertRaises(retworkx.DAGWouldCycle): dag.add_edges_from([(node_a, node_c, {}), (node_c, node_b, {})]) + def test_is_directed_acyclic_graph(self): + dag = retworkx.generators.directed_path_graph(1000) + res = retworkx.is_directed_acyclic_graph(dag) + self.assertTrue(res) + + def test_is_directed_acyclic_graph_false(self): + digraph = retworkx.generators.directed_cycle_graph(1000) + self.assertFalse(retworkx.is_directed_acyclic_graph(digraph)) + def test_add_edge_from_no_data(self): dag = retworkx.PyDAG() nodes = list(range(4))