From eb1425c27d0a827654427b8f265c6da78fbe8503 Mon Sep 17 00:00:00 2001 From: Sam Yates <halfflat@gmail.com> Date: Tue, 10 Dec 2019 12:53:34 +0100 Subject: [PATCH] Fix for improper vector element access. (#919) Avoid use of empty ranges determined by expressions `&vector[i]` where i equals vector.size(). Replace with expressions using `vector.data()` or subrange views. Fixes #917. --- arbor/backends/gpu/multi_event_stream.hpp | 2 +- arbor/backends/multicore/multi_event_stream.hpp | 2 +- arbor/include/arbor/schedule.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/arbor/backends/gpu/multi_event_stream.hpp b/arbor/backends/gpu/multi_event_stream.hpp index 82842558..929c325d 100644 --- a/arbor/backends/gpu/multi_event_stream.hpp +++ b/arbor/backends/gpu/multi_event_stream.hpp @@ -94,7 +94,7 @@ protected: // Within a subrange of events with the same index, events should // be sorted by time. - arb_assert(std::is_sorted(&tmp_ev_time_[ev_begin_i], &tmp_ev_time_[ev_i])); + arb_assert(util::is_sorted(util::subrange_view(tmp_ev_time_, ev_begin_i, ev_i))); n_nonempty += (tmp_divs_.back()!=ev_i); tmp_divs_.push_back(ev_i); ev_begin_i = ev_i; diff --git a/arbor/backends/multicore/multi_event_stream.hpp b/arbor/backends/multicore/multi_event_stream.hpp index ae189364..18b42aa5 100644 --- a/arbor/backends/multicore/multi_event_stream.hpp +++ b/arbor/backends/multicore/multi_event_stream.hpp @@ -81,7 +81,7 @@ public: // Within a subrange of events with the same index, events should // be sorted by time. - arb_assert(std::is_sorted(&ev_time_[ev_begin_i], &ev_time_[ev_i])); + arb_assert(util::is_sorted(util::subrange_view(ev_time_, ev_begin_i, ev_i))); mark_[s] = ev_begin_i; span_begin_[s] = ev_begin_i; span_end_[s] = ev_i; diff --git a/arbor/include/arbor/schedule.hpp b/arbor/include/arbor/schedule.hpp index 15e8d62b..d0087fa0 100644 --- a/arbor/include/arbor/schedule.hpp +++ b/arbor/include/arbor/schedule.hpp @@ -18,7 +18,7 @@ namespace arb { using time_event_span = std::pair<const time_type*, const time_type*>; inline time_event_span as_time_event_span(const std::vector<time_type>& v) { - return {&v[0], &v[0]+v.size()}; + return {v.data(), v.data()+v.size()}; } // A schedule describes a sequence of time values used for sampling. Schedules -- GitLab