diff --git a/src/grt/src/cugr/src/GridGraph.cpp b/src/grt/src/cugr/src/GridGraph.cpp index f24fe59c22..c85a99113e 100644 --- a/src/grt/src/cugr/src/GridGraph.cpp +++ b/src/grt/src/cugr/src/GridGraph.cpp @@ -250,6 +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}; + } IntervalT range; range.Set(lower_bound(gridlines_[dimension].begin(), gridlines_[dimension].end(), @@ -270,13 +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}; + } + + // 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); - 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)}; + + // 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); + + // 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 @@ -908,4 +926,4 @@ void GridGraph::write(const std::string& heatmap_file) const fout.close(); } -} // namespace grt +} // namespace grt \ No newline at end of file