From 17585a92918b16340d57b5746e0a50d8e114b2d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Ag=C3=BCero?= Date: Fri, 12 Jul 2024 19:29:12 +0200 Subject: [PATCH] Fix potential unsafe initialization in the Graph class (#606) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Avoid constructor/destructor fiascos in graph class * Deprecations and migration guide. Signed-off-by: Carlos Agüero Signed-off-by: Carlos Agüero Co-authored-by: Steve Peters --- Migration.md | 14 ++++++++++++++ include/gz/math/graph/Edge.hh | 18 ++++++++++++++++-- include/gz/math/graph/Graph.hh | 20 ++++++++++---------- include/gz/math/graph/Vertex.hh | 15 +++++++++++++-- 4 files changed, 53 insertions(+), 14 deletions(-) diff --git a/Migration.md b/Migration.md index e5444ebd5..8bd35f880 100644 --- a/Migration.md +++ b/Migration.md @@ -5,6 +5,20 @@ Deprecated code produces compile-time warnings. These warning serve as notification to users that their code should be upgraded. The next major release will remove the deprecated code. +## Gazebo Math 8.X to 9.X + +### Deprecations + +1. **graph/Vertex.hh** + + The `Vertex::NullVertex` static member is deprecated. Please use + `Vertex::NullVertex()` instead. + E.g.: https://github.com/gazebosim/gz-math/pull/606/files#diff-0c0220a7e72be70337975433eeddc3f5e072ade5cd80dfb1ac03da233c39c983L153-R153 + +1. **graph/Edge.hh** + + The `Edge::NullEdge` static member is deprecated. Please use + `Vertex::NullEdge()` instead. + E.g.: https://github.com/gazebosim/gz-math/pull/606/files#diff-0c0220a7e72be70337975433eeddc3f5e072ade5cd80dfb1ac03da233c39c983L222-R222 + ## Gazebo Math 7.X to 8.X ### Breaking Changes diff --git a/include/gz/math/graph/Edge.hh b/include/gz/math/graph/Edge.hh index 92f4b937c..61e4e1bec 100644 --- a/include/gz/math/graph/Edge.hh +++ b/include/gz/math/graph/Edge.hh @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -205,7 +206,8 @@ namespace graph class UndirectedEdge : public Edge { /// \brief An invalid undirected edge. - public: static UndirectedEdge NullEdge; + // Deprecated in favor of NullEdge(). + public: static UndirectedEdge GZ_DEPRECATED(8) NullEdge; /// \brief Constructor. /// \param[in] _vertices The vertices of the edge. @@ -257,6 +259,7 @@ namespace graph }; /// \brief An invalid undirected edge. + // Deprecated in favor of NullEdge(). template UndirectedEdge UndirectedEdge::NullEdge( VertexId_P(kNullId, kNullId), E(), 1.0, kNullId); @@ -268,7 +271,8 @@ namespace graph class DirectedEdge : public Edge { /// \brief An invalid directed edge. - public: static DirectedEdge NullEdge; + // Deprecated in favor of NullEdge(). + public: static DirectedEdge GZ_DEPRECATED(8) NullEdge; /// \brief Constructor. /// \param[in] _vertices The vertices of the edge. @@ -332,9 +336,19 @@ namespace graph }; /// \brief An invalid directed edge. + // Deprecated in favor of NullEdge(). template DirectedEdge DirectedEdge::NullEdge( VertexId_P(kNullId, kNullId), E(), 1.0, kNullId); + + /// \brief An invalid edge. + template + EdgeType &NullEdge() + { + static auto e = std::make_unique( + VertexId_P(kNullId, kNullId), E(), 1.0, kNullId); + return *e; + } } } } diff --git a/include/gz/math/graph/Graph.hh b/include/gz/math/graph/Graph.hh index 0b48ea2dc..ec61cb078 100644 --- a/include/gz/math/graph/Graph.hh +++ b/include/gz/math/graph/Graph.hh @@ -150,7 +150,7 @@ namespace graph { std::cerr << "[Graph::AddVertex()] The limit of vertices has been " << "reached. Ignoring vertex." << std::endl; - return Vertex::NullVertex; + return NullVertex(); } } @@ -163,7 +163,7 @@ namespace graph { std::cerr << "[Graph::AddVertex()] Repeated vertex [" << id << "]" << std::endl; - return Vertex::NullVertex; + return NullVertex(); } // Link the vertex with an empty list of edges. @@ -219,7 +219,7 @@ namespace graph { std::cerr << "[Graph::AddEdge()] The limit of edges has been reached. " << "Ignoring edge." << std::endl; - return EdgeType::NullEdge; + return NullEdge(); } EdgeType newEdge(_vertices, _data, _weight, id); @@ -240,7 +240,7 @@ namespace graph for (auto const &v : {edgeVertices.first, edgeVertices.second}) { if (this->vertices.find(v) == this->vertices.end()) - return EdgeType::NullEdge; + return NullEdge(); } // Link the new edge. @@ -611,7 +611,7 @@ namespace graph { auto iter = this->vertices.find(_id); if (iter == this->vertices.end()) - return Vertex::NullVertex; + return NullVertex(); return iter->second; } @@ -624,7 +624,7 @@ namespace graph { auto iter = this->vertices.find(_id); if (iter == this->vertices.end()) - return Vertex::NullVertex; + return NullVertex(); return iter->second; } @@ -646,7 +646,7 @@ namespace graph // Quit early if there is no adjacency entry if (adjIt == this->adjList.end()) - return EdgeType::NullEdge; + return NullEdge(); // Loop over the edges in the source vertex's adjacency list for (std::set::const_iterator edgIt = adjIt->second.begin(); @@ -665,7 +665,7 @@ namespace graph } } - return EdgeType::NullEdge; + return NullEdge(); } /// \brief Get a reference to an edge using its Id. @@ -676,7 +676,7 @@ namespace graph { auto iter = this->edges.find(_id); if (iter == this->edges.end()) - return EdgeType::NullEdge; + return NullEdge(); return iter->second; } @@ -689,7 +689,7 @@ namespace graph { auto iter = this->edges.find(_id); if (iter == this->edges.end()) - return EdgeType::NullEdge; + return NullEdge(); return iter->second; } diff --git a/include/gz/math/graph/Vertex.hh b/include/gz/math/graph/Vertex.hh index e61fa22df..db0092ed0 100644 --- a/include/gz/math/graph/Vertex.hh +++ b/include/gz/math/graph/Vertex.hh @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -45,7 +46,7 @@ namespace graph using VertexId_P = std::pair; /// \brief Represents an invalid Id. - static const VertexId kNullId = MAX_UI64; + constexpr VertexId kNullId = MAX_UI64; /// \brief A vertex of a graph. It stores user information, an optional name, /// and keeps an internal unique Id. This class does not enforce to choose a @@ -54,7 +55,8 @@ namespace graph class Vertex { /// \brief An invalid vertex. - public: static Vertex NullVertex; + // Deprecated in favor of NullVertex(). + public: static Vertex GZ_DEPRECATED(8) NullVertex; /// \brief Constructor. /// \param[in] _name Non-unique vertex name. @@ -136,9 +138,18 @@ namespace graph }; /// \brief An invalid vertex. + // Deprecated in favor of NullVertex(). template Vertex Vertex::NullVertex("__null__", V(), kNullId); + /// \brief An invalid vertex. + template + Vertex &NullVertex() + { + static auto v = std::make_unique>("__null__", V(), kNullId); + return *v; + } + /// \def VertexRef_M /// \brief Map of vertices. The key is the vertex Id. The value is a /// reference to the vertex.