boostorg / gil

Boost.GIL - Generic Image Library | Requires C++14 since Boost 1.80
https://boostorg.github.io/gil
Boost Software License 1.0
178 stars 164 forks source link

Running the convolve_2d.cpp test causes an alignment error on ARM #734

Open dkrejsa opened 1 year ago

dkrejsa commented 1 year ago

Actual behavior

When running the convolve_2d.cpp test module (Boost 1.81.0) on a 32-bit ARM target, there is an alignment exception (fault) in the test_convolve_2d_with_image_using_float32_t() test case. The alignment exception occurs when the convolve_2d_impl() function attempts to access the first pixel in the second row of the src_view. The address computed for src_view(col_boundary, row_boundary)[0] is not a multiple of the size of the gil::float32_t array element.

The apparent cause is that the test case creates the gil::interleaved_view() calls for the source and output images use the number of columns in the row rather than the length in bytes of each row as the last argument to gill::interleaved_view(). Likely

gil::gray32fc_view_t src_view =
        gil::interleaved_view(9, 9, reinterpret_cast<gil::gray32f_pixel_t const*>(img), 9);
gil::gray32fc_view_t exp_out_view =
        gil::interleaved_view(9, 9, reinterpret_cast<gil::gray32f_pixel_t const*>(exp_output), 9);

should be

gil::gray32fc_view_t src_view =
        gil::interleaved_view(9, 9, reinterpret_cast<gil::gray32f_pixel_t const*>(img), 9 * sizeof (gil::float32_t));
gil::gray32fc_view_t exp_out_view =
        gil::interleaved_view(9, 9, reinterpret_cast<gil::gray32f_pixel_t const*>(exp_output), 9 * sizeof (gil::float32_t));

Expected behavior

The test should not cause an alignment exception and should complete successfully.

C++ Minimal Working Example

Use the convolve_2d.cpp test case on a target that gives exceptions for misaligned accesses.

Environment