diff options
author | Michael Cree <mcree@orcon.net.nz> | 2016-04-28 22:22:50 +1200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2016-04-28 13:29:41 +0200 |
commit | 72637d00e88a310ad7b7bca92dbeef6b55872f9b (patch) | |
tree | c875606c2f60c3cafb935f704b6d0597e7e45c1b /test | |
parent | 27d4b159253dc9912f5186e4825780f82af89c32 (diff) |
Bug#822848: mpd FTBFS on Alpha; misaligned arrays in the test suite
Source: mpd
Version: 0.19.14-2
Severity: important
Justification: fails to build form source (but built in the past)
Tags: patch
User: debian-alpha@lists.debian.org
Usertags: alpha
mpd FTBFS on Alpha with a failure in the test suite [1]:
FAIL: test/test_byte_reverse
============================
.F...
!!!FAILURES!!!
Test Results:
Run: 4 Failures: 1 Errors: 0
1) test: ByteReverseTest::TestByteReverse2 (F) line: 58 test/test_byte_reverse.cxx
assertion failed
- Expression: strcmp(result, (const char *)dest) == 0
This occurs because the test suite (in test/test_byte_reversal.cxx)
allocates static char arrays and passes the char arrays to functions
whose respective arguments were declared to be uint16_t *, etc., in
the main code.
This is in the realm of undefined behaviour on architectures with
strict memory alignment requirements. Although the test only fails
on Alpha (because Alpha has a particular CPU load instruction that
gcc likes to use to add bugs ..., ahem, optimise the code on the
assumption of alignment) it is potentially a latent bug for other
architectures with strict alignment requirements.
Since the code is compiled with the c++11 standard I attach a patch
that modifies the test suite to align the non-compliant strings with
the alignas() attribute. The test suite now passes on Alpha with
that patch.
Cheers
Michael
[1] https://buildd.debian.org/status/fetch.php?pkg=mpd&arch=alpha&ver=0.19.14-2&stamp=1461542099
Diffstat (limited to 'test')
-rw-r--r-- | test/test_byte_reverse.cxx | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/test/test_byte_reverse.cxx b/test/test_byte_reverse.cxx index 0ab97e4d1..321cc2e6c 100644 --- a/test/test_byte_reverse.cxx +++ b/test/test_byte_reverse.cxx @@ -49,9 +49,9 @@ CPPUNIT_TEST_SUITE_REGISTRATION(ByteReverseTest); void ByteReverseTest::TestByteReverse2() { - static const char src[] = "123456"; + static const char src[] alignas(uint16_t) = "123456"; static const char result[] = "214365"; - static uint8_t dest[ARRAY_SIZE(src)]; + static uint8_t dest[ARRAY_SIZE(src)] alignas(uint16_t); reverse_bytes(dest, (const uint8_t *)src, (const uint8_t *)(src + ARRAY_SIZE(src) - 1), 2); @@ -73,9 +73,9 @@ ByteReverseTest::TestByteReverse3() void ByteReverseTest::TestByteReverse4() { - static const char src[] = "12345678"; + static const char src[] alignas(uint32_t) = "12345678"; static const char result[] = "43218765"; - static uint8_t dest[ARRAY_SIZE(src)]; + static uint8_t dest[ARRAY_SIZE(src)] alignas(uint32_t); reverse_bytes(dest, (const uint8_t *)src, (const uint8_t *)(src + ARRAY_SIZE(src) - 1), 4); |