A simple question about C...
Michael Tuexen
tuexen at FreeBSD.org
Tue Sep 3 13:37:30 UTC 2013
On Sep 3, 2013, at 2:51 PM, Ian Lepore <ian at FreeBSD.org> wrote:
> On Tue, 2013-09-03 at 14:31 +0200, Michael Tuexen wrote:
>> Dear all,
>>
>> I'm trying to get a C program (packetdrill) running FreeBSD r254973
>> on a Raspberry Pi.
>> Since tests are failing, I wrote the little C program:
>>
>> #include <stdint.h>
>> #include <stdio.h>
>> #include <string.h>
>>
>> int
>> main(void)
>> {
>> uint8_t byte[] = {0x00, 0x01, 0x02, 0x03,
>> 0x04, 0x05, 0x06, 0x07,
>> 0x08, 0x09, 0x0a, 0x0b};
>> uint32_t i, n, *p;
>>
>> for (i = 0; i <= 8; i++) {
>> p = (uint32_t *)(byte + i);
>> memcpy(&n, byte + i, sizeof(uint32_t));
>> printf("p = %p, *p = %08x, n = %08x.\n", (void *)p, *p, n);
>> }
>> return (0);
>> }
>>
>> It produces the following output:
>>
>> p = 0xbfffec48, *p = 03020100, n = 03020100.
>> p = 0xbfffec49, *p = 00030201, n = 04030201.
>> p = 0xbfffec4a, *p = 01000302, n = 05040302.
>> p = 0xbfffec4b, *p = 02010003, n = 06050403.
>> p = 0xbfffec4c, *p = 07060504, n = 07060504.
>> p = 0xbfffec4d, *p = 04070605, n = 08070605.
>> p = 0xbfffec4e, *p = 05040706, n = 09080706.
>> p = 0xbfffec4f, *p = 06050407, n = 0a090807.
>> p = 0xbfffec50, *p = 0b0a0908, n = 0b0a0908.
>>
>> So everything is fine when reading the 4 byte long uint32_t on a 4-byte aligned
>> address. Results are strange (at least for me), when the address is not 4-byte
>> aligned. There is no difference between clang and gcc. Can I only dereference
>> properly aligned pointers? Is the above expected or is it a bug in the compiler?
>>
>> Best regards
>> Michael
>
> Yes, you can only safely dereference pointers aligned to the size of the
> dereference (2, 4, 8 bytes). On some ARM platforms a misaligned
> reference leads to alignment fault, on others the data is rotated in
> some predefined way, and on some it's just "undefined behavior."
>
> There are functions in endian.h to help with the alignment, in
> particular the leNNdec() and leNNenc() functions are designed to be
> alignment-agnostic.
OK. Thanks for the information. This means the packetdrill source code
has to be patched to work correctly on ARM... Need to find all the places
where they access stuff in a non-aligned way.
Best regards
Michael
>
> -- Ian
>
>
>
More information about the freebsd-arm
mailing list