olena-2.0-140-g38aa07e Do not read outside images in fill functions with accumulators.

* mln/world/k2/fill_non_primary_from_primary_2_faces.hh, * mln/world/kn/fill_0_from_1_faces.hh, * mln/world/kn/fill_0_from_2_faces.hh, * mln/world/kn/fill_1_from_2_faces.hh, * mln/world/kn/fill_1_from_aux_2_faces.hh, * mln/world/kn/fill_2_from_1_faces.hh: Check if neighbor site is in the domain. --- milena/ChangeLog | 12 +++++++ .../k2/fill_non_primary_from_primary_2_faces.hh | 34 +++++++++++++------- milena/mln/world/kn/fill_0_from_1_faces.hh | 15 ++++++--- milena/mln/world/kn/fill_0_from_2_faces.hh | 15 ++++++--- milena/mln/world/kn/fill_1_from_2_faces.hh | 17 ++++++--- milena/mln/world/kn/fill_1_from_aux_2_faces.hh | 17 ++++++--- milena/mln/world/kn/fill_2_from_1_faces.hh | 15 ++++++--- 7 files changed, 86 insertions(+), 39 deletions(-) diff --git a/milena/ChangeLog b/milena/ChangeLog index 3b898e8..d7d8e1e 100644 --- a/milena/ChangeLog +++ b/milena/ChangeLog @@ -1,5 +1,17 @@ 2012-10-26 Guillaume Lazzara <z@lrde.epita.fr> + Do not read outside images in fill functions with accumulators. + + * mln/world/k2/fill_non_primary_from_primary_2_faces.hh, + * mln/world/kn/fill_0_from_1_faces.hh, + * mln/world/kn/fill_0_from_2_faces.hh, + * mln/world/kn/fill_1_from_2_faces.hh, + * mln/world/kn/fill_1_from_aux_2_faces.hh, + * mln/world/kn/fill_2_from_1_faces.hh: Check if neighbor site is + in the domain. + +2012-10-26 Guillaume Lazzara <z@lrde.epita.fr> + Various fixes. * mln/util/hqueue.hh: Add a precondition. diff --git a/milena/mln/world/k2/fill_non_primary_from_primary_2_faces.hh b/milena/mln/world/k2/fill_non_primary_from_primary_2_faces.hh index b97a645..8bf7f84 100644 --- a/milena/mln/world/k2/fill_non_primary_from_primary_2_faces.hh +++ b/milena/mln/world/k2/fill_non_primary_from_primary_2_faces.hh @@ -155,31 +155,41 @@ namespace mln I& ima = exact(ima_); A accu = exact(accu_); + typedef mln_value(I) VI; typedef mln_argument(A) V; - mln_piter(I) p(ima.domain()); + mln_box(I) b = ima.domain(); + mln_piter(I) p(b); for_all(p) if (is_non_primary_2_face_vertical(p)) { accu.init(); - accu.take(kn::safe_cast_to<V>(ima(p + 2 * left))); - accu.take(kn::safe_cast_to<V>(ima(p + 2 * right))); - ima(p) = kn::safe_cast(accu.to_result()); + if (ima.domain().has(p + 2 * left)) + accu.take(kn::safe_cast_to<V>(ima(p + 2 * left))); + if (ima.domain().has(p + 2 * right)) + accu.take(kn::safe_cast_to<V>(ima(p + 2 * right))); + ima(p) = kn::safe_cast_to<VI>(accu.to_result()); } else if (is_non_primary_2_face_horizontal(p)) { accu.init(); - accu.take(kn::safe_cast_to<V>(ima(p + 2 * up))); - accu.take(kn::safe_cast_to<V>(ima(p + 2 * down))); - ima(p) = kn::safe_cast(accu.to_result()); + if (ima.domain().has(p + 2 * up)) + accu.take(kn::safe_cast_to<V>(ima(p + 2 * up))); + if (ima.domain().has(p + 2 * down)) + accu.take(kn::safe_cast_to<V>(ima(p + 2 * down))); + ima(p) = kn::safe_cast_to<VI>(accu.to_result()); } else if (is_non_primary_2_face_center(p)) { accu.init(); - accu.take(kn::safe_cast_to<V>(ima(p + 2 * up_left))); - accu.take(kn::safe_cast_to<V>(ima(p + 2 * up_right))); - accu.take(kn::safe_cast_to<V>(ima(p + 2 * down_left))); - accu.take(kn::safe_cast_to<V>(ima(p + 2 * down_right))); - ima(p) = kn::safe_cast(accu.to_result()); + if (ima.domain().has(p + 2 * up_left)) + accu.take(kn::safe_cast_to<V>(ima(p + 2 * up_left))); + if (ima.domain().has(p + 2 * up_right)) + accu.take(kn::safe_cast_to<V>(ima(p + 2 * up_right))); + if (ima.domain().has(p + 2 * down_left)) + accu.take(kn::safe_cast_to<V>(ima(p + 2 * down_left))); + if (ima.domain().has(p + 2 * down_right)) + accu.take(kn::safe_cast_to<V>(ima(p + 2 * down_right))); + ima(p) = kn::safe_cast_to<VI>(accu.to_result()); } trace::exiting("mln::world::k2::fill_non_primary_from_primary_2_faces"); diff --git a/milena/mln/world/kn/fill_0_from_1_faces.hh b/milena/mln/world/kn/fill_0_from_1_faces.hh index 43b5096..3d1548d 100644 --- a/milena/mln/world/kn/fill_0_from_1_faces.hh +++ b/milena/mln/world/kn/fill_0_from_1_faces.hh @@ -87,15 +87,20 @@ namespace mln (void) accu_; A accu = A(); - mln_piter(I) p(inout.domain()); + mln_box(I) b = inout.domain(); + mln_piter(I) p(b); for_all(p) if (is_0_face(p)) { accu.init(); - accu.take(inout(p + left)); - accu.take(inout(p + right)); - accu.take(inout(p + up)); - accu.take(inout(p + down)); + if (inout.domain().has(p + left)) + accu.take(inout(p + left)); + if (inout.domain().has(p + right)) + accu.take(inout(p + right)); + if (inout.domain().has(p + up)) + accu.take(inout(p + up)); + if (inout.domain().has(p + down)) + accu.take(inout(p + down)); inout(p) = accu.to_result(); } diff --git a/milena/mln/world/kn/fill_0_from_2_faces.hh b/milena/mln/world/kn/fill_0_from_2_faces.hh index 47fb230..798bed3 100644 --- a/milena/mln/world/kn/fill_0_from_2_faces.hh +++ b/milena/mln/world/kn/fill_0_from_2_faces.hh @@ -100,15 +100,20 @@ namespace mln (void) accu_; A accu = A(); - mln_piter(I) p(inout.domain()); + mln_box(I) b = inout.domain(); + mln_piter(I) p(b); for_all(p) if (kn::is_0_face(p)) { accu.init(); - accu.take(inout(p + up_left)); - accu.take(inout(p + up_right)); - accu.take(inout(p + down_left)); - accu.take(inout(p + down_right)); + if (inout.domain().has(p + up_left)) + accu.take(inout(p + up_left)); + if (inout.domain().has(p + up_right)) + accu.take(inout(p + up_right)); + if (inout.domain().has(p + down_left)) + accu.take(inout(p + down_left)); + if (inout.domain().has(p + down_right)) + accu.take(inout(p + down_right)); inout(p) = accu.to_result(); } diff --git a/milena/mln/world/kn/fill_1_from_2_faces.hh b/milena/mln/world/kn/fill_1_from_2_faces.hh index b638e81..3a8b93c 100644 --- a/milena/mln/world/kn/fill_1_from_2_faces.hh +++ b/milena/mln/world/kn/fill_1_from_2_faces.hh @@ -73,7 +73,7 @@ namespace mln # ifndef MLN_INCLUDE_ONLY - // Facade + // Facades template <typename I, typename A> @@ -86,20 +86,25 @@ namespace mln (void) accu_; A accu = A(); - mln_piter(I) p(inout.domain()); + mln_box(I) b = inout.domain(); + mln_piter(I) p(b); for_all(p) if (kn::is_1_face_vertical(p)) { accu.init(); - accu.take(inout(p + left)); - accu.take(inout(p + right)); + if (inout.domain().has(p + left)) + accu.take(inout(p + left)); + if (inout.domain().has(p + right)) + accu.take(inout(p + right)); inout(p) = accu.to_result(); } else if (is_1_face_horizontal(p)) { accu.init(); - accu.take(inout(p + up)); - accu.take(inout(p + down)); + if (inout.domain().has(p + up)) + accu.take(inout(p + up)); + if (inout.domain().has(p + down)) + accu.take(inout(p + down)); inout(p) = accu.to_result(); } diff --git a/milena/mln/world/kn/fill_1_from_aux_2_faces.hh b/milena/mln/world/kn/fill_1_from_aux_2_faces.hh index eb999cf..b9cbffe 100644 --- a/milena/mln/world/kn/fill_1_from_aux_2_faces.hh +++ b/milena/mln/world/kn/fill_1_from_aux_2_faces.hh @@ -76,7 +76,7 @@ namespace mln /// \overload template <typename I, typename J, typename A> void fill_1_from_aux_2_faces(Image<I>& inout, const Image<J>& aux, - const Accumulator<A>& accu); + const Accumulator<A>& accu); # ifndef MLN_INCLUDE_ONLY @@ -123,20 +123,25 @@ namespace mln (void) accu_; A accu = A(); - mln_piter(I) p(inout.domain()); + mln_box(I) b = inout.domain(); + mln_piter(I) p(b); for_all(p) if (kn::is_1_face_vertical(p)) { accu.init(); - accu.take(aux(p + left)); - accu.take(aux(p + right)); + if (aux.domain().has(p + left)) + accu.take(aux(p + left)); + if (aux.domain().has(p + right)) + accu.take(aux(p + right)); inout(p) = accu.to_result(); } else if (kn::is_1_face_horizontal(p)) { accu.init(); - accu.take(aux(p + up)); - accu.take(aux(p + down)); + if (aux.domain().has(p + up)) + accu.take(aux(p + up)); + if (aux.domain().has(p + down)) + accu.take(aux(p + down)); inout(p) = accu.to_result(); } diff --git a/milena/mln/world/kn/fill_2_from_1_faces.hh b/milena/mln/world/kn/fill_2_from_1_faces.hh index 5887572..f3c7c7e 100644 --- a/milena/mln/world/kn/fill_2_from_1_faces.hh +++ b/milena/mln/world/kn/fill_2_from_1_faces.hh @@ -100,15 +100,20 @@ namespace mln (void) accu_; A accu = A(); - mln_piter(I) p(inout.domain()); + mln_box(I) b = inout.domain(); + mln_piter(I) p(b); for_all(p) if (kn::is_2_face(p)) { accu.init(); - accu.take(inout(p + up)); - accu.take(inout(p + left)); - accu.take(inout(p + right)); - accu.take(inout(p + down)); + if (inout.domain().has(p + up)) + accu.take(inout(p + up)); + if (inout.domain().has(p + left)) + accu.take(inout(p + left)); + if (inout.domain().has(p + right)) + accu.take(inout(p + right)); + if (inout.domain().has(p + down)) + accu.take(inout(p + down)); inout(p) = accu.to_result(); } -- 1.7.2.5
participants (1)
-
Guillaume Lazzara