Thank you.

On Saturday, July 17, 2021 at 10:04:01 AM UTC-5 [email protected] wrote:

> Ideally, you'd update the implementation of `getBuff()` so that it 
> allocates an aligned buffer. Note that malloc() always returns aligned 
> buffers, so if you can make it so that the pointer returned by getBuff() is 
> one that was allocated directly by malloc(), then it should work. Probably, 
> though, getBuff() is returning a pointer into some larger buffer that was 
> read off the wire, including some framing bytes that are pushing the data 
> out of alignment. In this case it may be impractical to get the data to 
> come out aligned, so you may have no choice but to make a copy. You can do 
> something like:
>
> auto copy = kj::heapArray<capnp::word>(size / sizeof(capnp::word));
> memcpy(copy.begin(), buff, size);
>
> The copy will then be aligned.
>
> -Kenton
>
> On Fri, Jul 16, 2021 at 2:39 PM SR D <[email protected]> wrote:
>
>> I am trying to reconstruct received data using Capnproto, but am getting 
>> the following error.
>>
>>     terminate called after throwing an instance of 'kj::ExceptionImpl'
>>       what():  capnp/arena.c++:76: failed: expected 
>> reinterpret_cast<uintptr_t>(segment.begin()) % sizeof(void*) == 0 [4 == 0]; 
>> Detected unaligned data in Cap'n Proto message. Messages must be aligned to 
>> the architecture's word size. Yes, even on x86: Unaligned access is 
>> undefined behavior under the C/C++ language standard, and compilers can and 
>> do assume alignment for the purpose of optimizations. Unaligned access may 
>> lead to crashes or subtle corruption. For example, GCC will use SIMD 
>> instructions in optimizations, and those instrsuctions require alignment. 
>> If you really insist on taking your changes with unaligned data, compile 
>> the Cap'n Proto library with -DCAPNP_ALLOW_UNALIGNED to remove this check.
>>     stack: 7f4233c40ca5 7f423bbc40cf6 7f42bbccaa27 55f370c02321 
>> 55f770cc18e3 55f77ac01331 55f77a0b12da 55f7a0cb127b 55fc70c0d1ed 
>> 55fe70c01137 7f42bffa7de3 7f42b5cc7608 7f42b5aa6292
>>
>> It is from this snippet where I am receiving the buffer and trying to 
>> rebuild the data structure.
>>
>>     const void* buff = getBuff();
>>     
>>     auto arr = kj::ArrayPtr<const capnp::word>(
>>         reinterpret_cast<const capnp::word*>(buff),
>>         size / sizeof(capnp::word));
>>
>>     capnp::FlatArrayMessageReader msgReader(arr);
>>
>>     auto msg = msgReader.getRoot<MyStuff>(); // error occurs at this line
>>     auto fieldA = msg.getFieldA();
>>     auto fieldB = msg.getFieldB();
>>     
>>
>> The buffer was constructed and sent using:
>>
>>     capnp::MallocMessageBuilder message;
>>     auto stuff = message.initRoot<MyStuff>();
>>     stuff.setFieldA("A");
>>     stuff.setFieldB("B");
>>     
>>     const auto msgToSend = capnp::messageToFlatArray(message);
>>     const auto msgAsChars = msgToSend.asChars();
>>
>>     // make const void* and send
>>
>> How do I align the data to the architectures word size as the error says?
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Cap'n Proto" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/capnproto/c6755765-f1f3-4de6-af29-dfdb2bb83881n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/capnproto/c6755765-f1f3-4de6-af29-dfdb2bb83881n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/capnproto/692e403e-0297-460f-b6df-35520a4d939bn%40googlegroups.com.

Reply via email to