From ef21d27c6d25bde7e144f94ea62f569cb9a0b5e5 Mon Sep 17 00:00:00 2001 From: Divinesoumyadip Date: Thu, 12 Mar 2026 07:12:18 +0000 Subject: [PATCH 1/2] grt: fix cugr memory crash on out-of-bounds grid access Signed-off-by: Divinesoumyadip --- src/grt/src/cugr/src/GridGraph.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/grt/src/cugr/src/GridGraph.cpp b/src/grt/src/cugr/src/GridGraph.cpp index f24fe59c22a..e874706af7e 100644 --- a/src/grt/src/cugr/src/GridGraph.cpp +++ b/src/grt/src/cugr/src/GridGraph.cpp @@ -250,6 +250,7 @@ GridGraph::GridGraph(const Design* design, IntervalT GridGraph::rangeSearchGridlines(const int dimension, const IntervalT& loc_interval) const { + if (dimension < 0 || dimension > 1) return {0, 0}; IntervalT range; range.Set(lower_bound(gridlines_[dimension].begin(), gridlines_[dimension].end(), @@ -270,13 +271,20 @@ IntervalT GridGraph::rangeSearchGridlines(const int dimension, IntervalT GridGraph::rangeSearchRows(const int dimension, const IntervalT& loc_interval) const { + if (dimension < 0 || dimension > 1) return {0, 0}; const auto& lineRange = rangeSearchGridlines(dimension, loc_interval); - return {gridlines_[dimension][lineRange.low()] == loc_interval.low() - ? lineRange.low() - : std::max(lineRange.low() - 1, 0), - gridlines_[dimension][lineRange.high()] == loc_interval.high() - ? lineRange.high() - 1 - : std::min(lineRange.high(), getSize(dimension) - 1)}; + + // BOUNDARY SHIELD: Safely clamp to array boundaries + const int max_idx = std::max(0, (int)gridlines_[dimension].size() - 1); + const int l = std::min(lineRange.low(), max_idx); + const int h = std::min(lineRange.high(), max_idx); + + return {gridlines_[dimension][l] == loc_interval.low() + ? l + : std::max(l - 1, 0), + gridlines_[dimension][h] == loc_interval.high() + ? h - 1 + : std::min(h, getSize(dimension) - 1)}; } BoxT GridGraph::getCellBox(PointT point) const @@ -908,4 +916,4 @@ void GridGraph::write(const std::string& heatmap_file) const fout.close(); } -} // namespace grt +} // namespace grt \ No newline at end of file From d086195e6b354c74628a455e139e04c7830cd678 Mon Sep 17 00:00:00 2001 From: Divinesoumyadip Date: Thu, 12 Mar 2026 07:22:51 +0000 Subject: [PATCH 2/2] style: run clang-format to fix CI Signed-off-by: Divinesoumyadip --- src/grt/src/cugr/src/GridGraph.cpp | 32 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/grt/src/cugr/src/GridGraph.cpp b/src/grt/src/cugr/src/GridGraph.cpp index e874706af7e..c85a99113e3 100644 --- a/src/grt/src/cugr/src/GridGraph.cpp +++ b/src/grt/src/cugr/src/GridGraph.cpp @@ -250,7 +250,9 @@ GridGraph::GridGraph(const Design* design, IntervalT GridGraph::rangeSearchGridlines(const int dimension, const IntervalT& loc_interval) const { - if (dimension < 0 || dimension > 1) return {0, 0}; + if (dimension < 0 || dimension > 1) { + return {0, 0}; + } IntervalT range; range.Set(lower_bound(gridlines_[dimension].begin(), gridlines_[dimension].end(), @@ -271,20 +273,28 @@ IntervalT GridGraph::rangeSearchGridlines(const int dimension, IntervalT GridGraph::rangeSearchRows(const int dimension, const IntervalT& loc_interval) const { - if (dimension < 0 || dimension > 1) return {0, 0}; + if (dimension < 0 || dimension > 1) { + return {0, 0}; + } + + // 1. Critical Empty Check: If the grid doesn't exist, exit early + if (gridlines_[dimension].empty()) { + return {0, 0}; + } + const auto& lineRange = rangeSearchGridlines(dimension, loc_interval); - - // BOUNDARY SHIELD: Safely clamp to array boundaries - const int max_idx = std::max(0, (int)gridlines_[dimension].size() - 1); + + // 2. BOUNDARY SHIELD: Safely clamp to array boundaries + const int max_idx = (int) gridlines_[dimension].size() - 1; const int l = std::min(lineRange.low(), max_idx); const int h = std::min(lineRange.high(), max_idx); - return {gridlines_[dimension][l] == loc_interval.low() - ? l - : std::max(l - 1, 0), - gridlines_[dimension][h] == loc_interval.high() - ? h - 1 - : std::min(h, getSize(dimension) - 1)}; + // 3. Robust Return: Ensure we never return a negative index for either bound + return { + gridlines_[dimension][l] == loc_interval.low() ? l : std::max(l - 1, 0), + gridlines_[dimension][h] == loc_interval.high() + ? std::max(0, h - 1) + : std::min(h, getSize(dimension) - 1)}; } BoxT GridGraph::getCellBox(PointT point) const