Coder Social home page Coder Social logo

Comments (20)

ladnir avatar ladnir commented on June 28, 2024 1

Hmm, quite strange. I don't think this is your issue but you need to add cp::sync_wait(chl.flush()); to the end of your functions. The Boost Asio Socket is asynchronous and sends data in the "background", to make sure all data is written you need to await on flush. Once I added this, all your examples worked fine for me. So let's first make sure this isn't your issue. I don't think it is because if it was libOTe would be printing a message telling you to use flush and then calling std::terminate(). However, you see a crash. Moreover, the other example I sent you wouldn't have this issue and you are still crashing.

So there is no "multi-threading" per se, instead, libOTe uses coroutines. Essentially, what libote does is create a new class for each function with a MC_BEGIN. This class saves the state of the function. The advantage of this is that a function can be paused aka suspended, i.e. the MC_AWAIT macros pause the current function until the dependent task has been completed. This allows you to run many protocols all on a single thread/socket or split them across many threads depending on what you want. Not super helpful in your case but it can be. MC_BEGIN simply creates the class where the function's data will be stored. You can see here for more details if you are interested.
https://ladnir.github.io/blog/2022/01/24/macoro.html
https://github.com/Visa-Research/coproto/blob/main/frontend/cpp14Tutorial.cpp

This class that MC_BEGIN defines is a macoro::Frame<T> where T is a lambda function that is the main body of the function. When a function is being resumed, we have a pointer to macoro::Frame<T> which essentially has a method on it called resume. It appears that the program is crashing on this resume call, presumable because the point to the frame has somehow been corrupted. What has me questioning it being an actual problem with the correlated OT code is that your first set of stack traces has a similar crash but in AsmSimplestOT. This happens waayyy before the correlated OT code. Whats more weird is that your second stack trace seems to have crashed in a similar place but in the correlated OT when its returning from IKNP receiver. In particular, it looks like its trying to destroy the macoro::Frame<T> for the IknpOtExtReceiver::receive coroutine/function and is crashing.

To debug this lets make a couple of other changes. So since you are using Boost::Asio networking, there actually are some background threads associated with boost. When debugging this, I suggest we remove these by using a coproto::LocalAsyncSocket. See the code below. Make sure this code is also crashing for you.

So I'm still not sure what's going wrong. It seems likely there is some bug on my side. To get a bit more confidence in this I suggest you paste the code below into libOTe/frontend/main.cpp and check that it still crashes. That way we can be sure it's not some bad interaction between your executable and the library. Given that the unit test passes, this might be the issue.

Assuming that still doesn't work, then I suggest building libOTe with debug symbols and or in debug mode, i.e. python3 build.py -DCMAKE_BUILD_TYPE=RelWithDebInfo or python3 build.py -DCMAKE_BUILD_TYPE=Debug. Then attach gdb to it and see exactly where it is crashing and what the state is. In particular, assuming you add the code below to libOTe/frontend/main.cpp, then you would do

gdb out/build/linux/frontend/libOTe_frontend 
r 

Once it crashes, you can get the stack trace with the bt command.

The example without threads & Boost Asio:

#include "coproto/Socket/AsioSocket.h"
#include "cryptoTools/Common/CLP.h"
#include "libOTe/Base/BaseOT.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtSender.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtSender.h"

using namespace osuCrypto;
using namespace std;

const u64 totalOTs = 1024;
const bool correlated = false; // !!! DOES NOT WORK WHEN TRUE !!!
const bool fake = true;

void senderReceiver() {

    auto chl = cp::LocalAsyncSocket::makePair();
    PRNG sPrng(sysRandomSeed());
    PRNG rPrng(sysRandomSeed());
    IknpOtExtSender sender;
    IknpOtExtReceiver receiver;

    if (fake) {
        PRNG commonPRNG(oc::ZeroBlock);
        std::array<std::array<block, 2>, 128> sendMsgs;
        commonPRNG.get(sendMsgs.data(), sendMsgs.size());

        BitVector bv(128);
        bv.randomize(commonPRNG);
        std::array<block, 128> recvMsgs;
        for (u64 i = 0; i < 128; ++i) recvMsgs[i] = sendMsgs[i][bv[i]];

        receiver.setBaseOts(sendMsgs);
        sender.setBaseOts(recvMsgs, bv);
    }


    if (correlated)
    {

        oc::AlignedUnVector<block> sMsgs(totalOTs);
        sPrng.get(sMsgs.data(), sMsgs.size());

        // construct the choices that we want.
        BitVector choice(totalOTs);
        // in this case pick random messages.
        choice.randomize(rPrng);

        // construct a vector to stored the received messages.
        oc::AlignedUnVector<block> rMsgs(totalOTs);

        auto cor = [](block m0, u64 i) { return m0; };
        cout << "OK" << endl;

        cp::sync_wait(macoro::when_all_ready(
            sender.sendCorrelated(
                sMsgs, cor, sPrng, chl[0]),
            receiver.receiveCorrelated(choice, rMsgs, rPrng, chl[1]))
        );
        cout << "send { " << sMsgs[0] << ", " << cor(sMsgs[0], 0) << "}, recv " << choice[0] << " " << rMsgs[0] << endl;
    }
    else {
        // construct a vector to stored the random send messages.
        oc::AlignedUnVector<array<block, 2>> sMsgs(totalOTs);
        // Populate msgs with something useful...
        sPrng.get(sMsgs.data(), sMsgs.size());

        // construct a vector to stored the received messages.
        oc::AlignedUnVector<block> rMsgs(totalOTs);

        // construct the choices that we want.
        BitVector choice(totalOTs);
        // in this case pick random messages.
        choice.randomize(rPrng);

        // perform the OTs. The receiver will learn one
        // of the messages stored in msgs.
        cp::sync_wait(macoro::when_all_ready(
            sender.sendChosen(sMsgs, sPrng, chl[0]),
            receiver.receiveChosen(choice, rMsgs, sPrng, chl[1])
        ));

        cout << "send {" << sMsgs[0][0] << ", " << sMsgs[0][1] << "}, recv " << choice[0] <<" " << rMsgs[0] << endl;
    }

    std::cout << "done" << std::endl;
}

int main(int argc, char** argv) {

    senderReceiver();
}

from libote.

ladnir avatar ladnir commented on June 28, 2024 1

yeah, so libOTe is somewhat flexible in how it can be found.

Personally i never install anything as that is forcing all projects to use that version. Instead, I always install to some project-specific location, in my case out/install/<config>

But libOTe also allows you to simply point libOTe at where it repo is and it will handle the rest.

Well glad its somewhat working. You can uninstall libOTe by looking at whats in out/install/linux/ and removing those folders from wherever you installed to.

from libote.

ladnir avatar ladnir commented on June 28, 2024

Does the following work for you?

    auto chl = coproto::LocalAsyncSocket::makePair();

    PRNG prng(sysRandomSeed());
    KosOtExtSender sender;
    KosOtExtReceiver receiver;

    vector<block> cMsgs(totalOTs);
    prng.get(cMsgs.data(), cMsgs.size());

    // construct the choices that we want.
    BitVector choice(totalOTs);
    // in this case pick random messages.
    choice.randomize(prng);

    // construct a vector to stored the received messages.
    std::vector<block> rMsgs(totalOTs);

    cp::sync_wait(macoro::when_all_ready(
        sender.sendCorrelated(cMsgs, [](block m0, u64 i) { return m0; }, prng, chl[0]),
        receiver.receiveCorrelated(choice, rMsgs, prng, chl[1])));


    cout << "send" << cMsgs[0] << endl;
    cout << "choice " << choice[0] << endl;
    cout << rMsgs[0] << endl;

from libote.

lzjluzijie avatar lzjluzijie commented on June 28, 2024

Does the following work for you?

    auto chl = coproto::LocalAsyncSocket::makePair();

    PRNG prng(sysRandomSeed());
    KosOtExtSender sender;
    KosOtExtReceiver receiver;

    vector<block> cMsgs(totalOTs);
    prng.get(cMsgs.data(), cMsgs.size());

    // construct the choices that we want.
    BitVector choice(totalOTs);
    // in this case pick random messages.
    choice.randomize(prng);

    // construct a vector to stored the received messages.
    std::vector<block> rMsgs(totalOTs);

    cp::sync_wait(macoro::when_all_ready(
        sender.sendCorrelated(cMsgs, [](block m0, u64 i) { return m0; }, prng, chl[0]),
        receiver.receiveCorrelated(choice, rMsgs, prng, chl[1])));


    cout << "send" << cMsgs[0] << endl;
    cout << "choice " << choice[0] << endl;
    cout << rMsgs[0] << endl;

No, I still got segmentation fault:

vscode ➜ /workspaces/cpp/vole/build $ ./vole
[1]    888 segmentation fault  ./vole
vscode ➜ /workspaces/cpp/vole/build $ valgrind ./vole
==999== Memcheck, a memory error detector
==999== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==999== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==999== Command: ./vole
==999== 
==999== Invalid read of size 8
==999==    at 0x442E80: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x456A4E: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x40C9E5: macoro::coroutine_handle<void>::resume() const [clone .isra.0] (coro_frame.h:821)
==999==    by 0x41CF85: coproto::LocalAsyncSocket::Awaiter::await_suspend(macoro::coroutine_handle<void>) (LocalAsyncSock.h:543)
==999==    by 0x40D0C8: auto macoro::await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::detail::task_promise<void, false> >(coproto::LocalAsyncSocket::Awaiter&, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, std::enable_if<(!macoro::has_void_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value)&&(!macoro::has_bool_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value), macoro::empty_state>::type) [clone .isra.0] (coro_frame.h:152)
==999==    by 0x435998: macoro::task<void, false> coproto::internal::SockScheduler::receiveDataTask<coproto::LocalAsyncSocket::Sock>(coproto::LocalAsyncSocket::Sock*)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, false> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, false> >*) (SocketScheduler.h:799)
==999==    by 0x428B25: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999==    by 0x40AAED: resume (coro_frame.h:850)
==999==    by 0x40AAED: start (sync_wait.h:123)
==999==    by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999==    by 0x40AAED: main (main.cpp:138)
==999==  Address 0x4e6b6f8 is 8 bytes before a block of size 40 alloc'd
==999==    at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==999==    by 0x423416: allocate (new_allocator.h:115)
==999==    by 0x423416: allocate (allocator.h:173)
==999==    by 0x423416: allocate (alloc_traits.h:460)
==999==    by 0x423416: _M_allocate (stl_vector.h:346)
==999==    by 0x423416: _M_allocate (stl_vector.h:343)
==999==    by 0x423416: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==999==    by 0x4440E8: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x442B79: osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x456991: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x428B05: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999==    by 0x40AAED: resume (coro_frame.h:850)
==999==    by 0x40AAED: start (sync_wait.h:123)
==999==    by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999==    by 0x40AAED: main (main.cpp:138)
==999== 
==999== Invalid read of size 8
==999==    at 0x442E84: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x456A4E: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x40C9E5: macoro::coroutine_handle<void>::resume() const [clone .isra.0] (coro_frame.h:821)
==999==    by 0x41CF85: coproto::LocalAsyncSocket::Awaiter::await_suspend(macoro::coroutine_handle<void>) (LocalAsyncSock.h:543)
==999==    by 0x40D0C8: auto macoro::await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::detail::task_promise<void, false> >(coproto::LocalAsyncSocket::Awaiter&, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, std::enable_if<(!macoro::has_void_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value)&&(!macoro::has_bool_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value), macoro::empty_state>::type) [clone .isra.0] (coro_frame.h:152)
==999==    by 0x435998: macoro::task<void, false> coproto::internal::SockScheduler::receiveDataTask<coproto::LocalAsyncSocket::Sock>(coproto::LocalAsyncSocket::Sock*)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, false> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, false> >*) (SocketScheduler.h:799)
==999==    by 0x428B25: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999==    by 0x40AAED: resume (coro_frame.h:850)
==999==    by 0x40AAED: start (sync_wait.h:123)
==999==    by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999==    by 0x40AAED: main (main.cpp:138)
==999==  Address 0x4e6b6f0 is 16 bytes before a block of size 40 alloc'd
==999==    at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==999==    by 0x423416: allocate (new_allocator.h:115)
==999==    by 0x423416: allocate (allocator.h:173)
==999==    by 0x423416: allocate (alloc_traits.h:460)
==999==    by 0x423416: _M_allocate (stl_vector.h:346)
==999==    by 0x423416: _M_allocate (stl_vector.h:343)
==999==    by 0x423416: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==999==    by 0x4440E8: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x442B79: osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x456991: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x428B05: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999==    by 0x40AAED: resume (coro_frame.h:850)
==999==    by 0x40AAED: start (sync_wait.h:123)
==999==    by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999==    by 0x40AAED: main (main.cpp:138)
==999== 
==999== Jump to the invalid address stated on the next line
==999==    at 0x0: ???
==999==    by 0x442E87: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x456A4E: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x40C9E5: macoro::coroutine_handle<void>::resume() const [clone .isra.0] (coro_frame.h:821)
==999==    by 0x41CF85: coproto::LocalAsyncSocket::Awaiter::await_suspend(macoro::coroutine_handle<void>) (LocalAsyncSock.h:543)
==999==    by 0x40D0C8: auto macoro::await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::detail::task_promise<void, false> >(coproto::LocalAsyncSocket::Awaiter&, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, std::enable_if<(!macoro::has_void_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value)&&(!macoro::has_bool_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value), macoro::empty_state>::type) [clone .isra.0] (coro_frame.h:152)
==999==    by 0x435998: macoro::task<void, false> coproto::internal::SockScheduler::receiveDataTask<coproto::LocalAsyncSocket::Sock>(coproto::LocalAsyncSocket::Sock*)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, false> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, false> >*) (SocketScheduler.h:799)
==999==    by 0x428B25: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999==    by 0x40AAED: resume (coro_frame.h:850)
==999==    by 0x40AAED: start (sync_wait.h:123)
==999==    by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999==    by 0x40AAED: main (main.cpp:138)
==999==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==999== 
==999== 
==999== Process terminating with default action of signal 11 (SIGSEGV)
==999==  Bad permissions for mapped region at address 0x0
==999==    at 0x0: ???
==999==    by 0x442E87: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x456A4E: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999==    by 0x40C9E5: macoro::coroutine_handle<void>::resume() const [clone .isra.0] (coro_frame.h:821)
==999==    by 0x41CF85: coproto::LocalAsyncSocket::Awaiter::await_suspend(macoro::coroutine_handle<void>) (LocalAsyncSock.h:543)
==999==    by 0x40D0C8: auto macoro::await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::detail::task_promise<void, false> >(coproto::LocalAsyncSocket::Awaiter&, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, std::enable_if<(!macoro::has_void_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value)&&(!macoro::has_bool_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value), macoro::empty_state>::type) [clone .isra.0] (coro_frame.h:152)
==999==    by 0x435998: macoro::task<void, false> coproto::internal::SockScheduler::receiveDataTask<coproto::LocalAsyncSocket::Sock>(coproto::LocalAsyncSocket::Sock*)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, false> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, false> >*) (SocketScheduler.h:799)
==999==    by 0x428B25: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999==    by 0x40AAED: resume (coro_frame.h:850)
==999==    by 0x40AAED: start (sync_wait.h:123)
==999==    by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999==    by 0x40AAED: main (main.cpp:138)
==999== 
==999== HEAP SUMMARY:
==999==     in use at exit: 9,339,128 bytes in 96 blocks
==999==   total heap usage: 647 allocs, 551 frees, 9,468,872 bytes allocated
==999== 
==999== LEAK SUMMARY:
==999==    definitely lost: 0 bytes in 0 blocks
==999==    indirectly lost: 0 bytes in 0 blocks
==999==      possibly lost: 9,297,856 bytes in 50 blocks
==999==    still reachable: 41,272 bytes in 46 blocks
==999==         suppressed: 0 bytes in 0 blocks
==999== Rerun with --leak-check=full to see details of leaked memory
==999== 
==999== For lists of detected and suppressed errors, rerun with: -s
==999== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
[1]    999 segmentation fault  valgrind ./vole

My g++ version is g++ (Debian 10.2.1-6) 10.2.1 20210110 and compiled with -std=c++20 -mssse3 -maes -pthread -Wall -O2 -g, I tried remove -O2 but still got same segmentation fault.

from libote.

ladnir avatar ladnir commented on June 28, 2024

What happens when you run the unit tests of frontend_libOTe? Should be

out/build/linux/frontend_libOTe/frontend_libOTe -u

from libote.

lzjluzijie avatar lzjluzijie commented on June 28, 2024

It skipped a few and passed others.

vscode ➜ .../out/build/linux/frontend (master) $ ./frontend_libOTe  -u
  0 - BtNetwork_SBO_ptr_test                    Passed   0ms
  1 - BtNetwork_Connect1_Test                   Passed   5ms
  2 - BtNetwork_RapidConnect_Test               Passed   95ms
  3 - BtNetwork_shutdown_test                   Passed   4ms
  4 - BtNetwork_SocketInterface_Test            Passed   21ms
  5 - BtNetwork_OneMegabyteSend_Test            Passed   5ms
  6 - BtNetwork_ConnectMany_Test                Passed   44ms
  7 - BtNetwork_CrossConnect_Test               Passed   6ms
  8 - BtNetwork_ManySessions_Test               Passed   41ms
  9 - BtNetwork_bitVector_Test                  Passed   3ms
 10 - BtNetwork_AsyncConnect_Test               Passed   2ms
 11 - BtNetwork_std_Containers_Test             Passed   3ms
 12 - BtNetwork_recvErrorHandler_Test           Passed   4ms
 13 - BtNetwork_closeOnError_Test               Passed   8ms
 14 - BtNetwork_AnonymousMode_Test              Passed   7ms
 15 - BtNetwork_CancelChannel_Test              Passed   128ms
 16 - BtNetwork_useAfterCancel_test             Passed   4ms
 17 - BtNetwork_fastCancel                      Passed   26ms
 18 - BtNetwork_ServerMode_Test                 Passed   72ms
 19 - BtNetwork_clientClose_Test                Passed   93ms
 20 - BtNetwork_BadConnect_Test                 Passed   3ms
 21 - BtNetwork_oneWorker_Test                  Passed   0ms
 22 - BtNetwork_queue_Test                      Passed   0ms
 23 - BtNetwork_socketAdapter_test              Passed   0ms
 24 - BtNetwork_BasicSocket_test                Passed   5ms
 25 - wolfSSL_echoServer_test                   Skipped - ENABLE_WOLFSSL not defined   0ms
 26 - wolfSSL_mutualAuth_test                   Skipped - ENABLE_WOLFSSL not defined   0ms
 27 - wolfSSL_channel_test                      Skipped - ENABLE_WOLFSSL not defined   0ms
 28 - wolfSSL_CancelChannel_Test                Skipped - ENABLE_WOLFSSL not defined   0ms
 29 - block_operation_test                      Passed   0ms
 30 - AES                                       Passed   0ms
 31 - Rijndael256                               Passed   0ms
 32 - BitVector_Indexing_Test                   Passed   0ms
 33 - BitVector_Parity                          Passed   0ms
 34 - BitVector_Append_Test                     Passed   0ms
 35 - BitVector_Copy_Test                       Passed   0ms
 36 - BitVector_Resize_Test                     Passed   0ms
 37 - CuckooIndex_many_Test                     Passed   0ms
 38 - CuckooIndex_paramSweep_Test               Passed   51ms
 39 - CuckooIndex_parallel_Test                 Passed   0ms
 40 - REccpNumber_Test                          Skipped - ENABLE_RELIC not defined.   0ms
 41 - REccpPoint_Test                           Skipped - ENABLE_RELIC not defined.   0ms
 42 - BetaCircuit_SequentialOp_Test             Skipped - ENABLE_CIRCUITS not defined   0ms
 43 - BetaCircuit_int_Adder_Test                Skipped - ENABLE_CIRCUITS not defined   0ms
 44 - BetaCircuit_int_Adder_const_Test          Skipped - ENABLE_CIRCUITS not defined   0ms
 45 - BetaCircuit_int_Subtractor_Test           Skipped - ENABLE_CIRCUITS not defined   0ms
 46 - BetaCircuit_int_Subtractor_const_Test     Skipped - ENABLE_CIRCUITS not defined   0ms
 47 - BetaCircuit_uint_Adder_Test               Skipped - ENABLE_CIRCUITS not defined   0ms
 48 - BetaCircuit_uint_Subtractor_Test          Skipped - ENABLE_CIRCUITS not defined   0ms
 49 - BetaCircuit_int_Multiply_Test             Skipped - ENABLE_CIRCUITS not defined   0ms
 50 - BetaCircuit_uint_Multiply_Test            Skipped - ENABLE_CIRCUITS not defined   0ms
 51 - BetaCircuit_int_LessThan_Test             Skipped - ENABLE_CIRCUITS not defined   0ms
 52 - BetaCircuit_int_GreaterThanEq_Test        Skipped - ENABLE_CIRCUITS not defined   0ms
 53 - BetaCircuit_uint_LessThan_Test            Skipped - ENABLE_CIRCUITS not defined   0ms
 54 - BetaCircuit_uint_GreaterThanEq_Test       Skipped - ENABLE_CIRCUITS not defined   0ms
 55 - BetaCircuit_negate_Test                   Skipped - ENABLE_CIRCUITS not defined   0ms
 56 - BetaCircuit_bitInvert_Test                Skipped - ENABLE_CIRCUITS not defined   0ms
 57 - BetaCircuit_removeSign_Test               Skipped - ENABLE_CIRCUITS not defined   0ms
 58 - BetaCircuit_addSign_Test                  Skipped - ENABLE_CIRCUITS not defined   0ms
 59 - BetaCircuit_int_Divide_Test               Skipped - ENABLE_CIRCUITS not defined   0ms
 60 - BetaCircuit_multiplex_Test                Skipped - ENABLE_CIRCUITS not defined   0ms
 61 - BetaCircuit_json_Tests                    Skipped - ENABLE_CIRCUITS not defined   0ms
 62 - BetaCircuit_bin_Tests                     Skipped - ENABLE_CIRCUITS not defined   0ms
 63 - BetaCircuit_xor_and_lvl_test              Skipped - ENABLE_CIRCUITS not defined   0ms
 64 - BetaCircuit_aes_test                      Skipped - ENABLE_CIRCUITS must be defined.   0ms
 65 - Tools_Transpose_Test                      Passed   0ms
 66 - Tools_Transpose_View_Test                 Passed   0ms
 67 - Tools_Transpose_Bench                     Passed   1ms
 68 - Tools_LinearCode_Test                     Passed   0ms
 69 - Tools_LinearCode_sub_Test                 Passed   0ms
 70 - Tools_LinearCode_rep_Test                 Passed   0ms
 71 - Tools_bitShift_test                       Passed   0ms
 72 - Tools_modp_test                           Passed   0ms
 73 - Tools_bitpolymul_test                     Passed   8ms
 74 - Tools_quasiCyclic_test                    Passed   253ms
 75 - Mtx_make_test                             Passed   2ms
 76 - Mtx_add_test                              Passed   0ms
 77 - Mtx_mult_test                             Passed   0ms
 78 - Mtx_invert_test                           Passed   0ms
 79 - EACode_encode_basic_test                  Passed   1ms
 80 - ExConvCode_encode_basic_test              Passed   0ms
 81 - Tools_Pprf_test                           Passed   0ms
 82 - Tools_Pprf_trans_test                     Passed   0ms
 83 - Tools_Pprf_inter_test                     Passed   0ms
 84 - Tools_Pprf_blockTrans_test                Passed   0ms
 85 - Tools_Pprf_callback_test                  Passed   0ms
 86 - Bot_Simplest_Test                         Passed   8ms
 87 - Bot_Simplest_asm_Test                     Passed   4ms
 88 - Bot_McQuoidRR_Moeller_EKE_Test            Passed   10ms
 89 - Bot_McQuoidRR_Moeller_MR_Test             Passed   11ms
 90 - Bot_McQuoidRR_Moeller_F_Test              Passed   11ms
 91 - Bot_McQuoidRR_Moeller_FM_Test             Passed   11ms
 92 - Bot_McQuoidRR_Ristrestto_F_Test           Passed   16ms
 93 - Bot_McQuoidRR_Ristrestto_FM_Test          Passed   16ms
 94 - Bot_MasnyRindal_Test                      Passed   17ms
 95 - Bot_MasnyRindal_Kyber_Test                Passed   6ms
 96 - Vole_SoftSpokenSmall_Test                 Passed   93ms
 97 - DotExt_Kos_Test                           Passed   2ms
 98 - DotExt_Iknp_Test                          Passed   0ms
 99 - OtExt_genBaseOts_Test                     Passed   7ms
100 - OtExt_Chosen_Test                         Passed   0ms
101 - OtExt_Iknp_Test                           Passed   0ms
102 - OtExt_Kos_Test                            Passed   0ms
103 - OtExt_Kos_fs_Test                         Passed   1ms
104 - OtExt_Kos_ro_Test                         Passed   11ms
105 - OtExt_Silent_random_Test                  Passed   1ms
106 - OtExt_Silent_correlated_Test              Passed   2ms
107 - OtExt_Silent_inplace_Test                 Passed   15ms
108 - OtExt_Silent_paramSweep_Test              Passed   195ms
109 - OtExt_Silent_QuasiCyclic_Test             Passed   22ms
110 - OtExt_Silent_Silver_Test                  Skipped - ENABLE_SILENTOT or ENABLE_INSECURE_SILVER are not defined.   0ms
111 - OtExt_Silent_baseOT_Test                  Passed   7ms
112 - OtExt_Silent_mal_Test                     Passed   10ms
113 - OtExt_SoftSpokenSemiHonest_Test           Passed   20ms
114 - OtExt_SoftSpokenSemiHonest_Split_Test     Passed   0ms
115 - OtExt_SoftSpokenMalicious21_Test          Passed   13ms
116 - OtExt_SoftSpokenMalicious21_Split_Test    Passed   0ms
117 - DotExt_SoftSpokenMaliciousLeaky_Test      Passed   13ms
118 - Vole_Noisy_test                           Passed   0ms
119 - Vole_Silent_QuasiCyclic_test              Passed   75ms
120 - Vole_Silent_Silver_test                   Passed   0ms
121 - Vole_Silent_paramSweep_test               Passed   12ms
122 - Vole_Silent_baseOT_test                   Passed   9ms
123 - Vole_Silent_mal_test                      Passed   10ms
124 - Vole_Silent_Rounds_test                   Passed   1051ms
125 - NcoOt_Kkrt_Test                           Passed   0ms
126 - NcoOt_Oos_Test                            Passed   2ms
127 - NcoOt_genBaseOts_Test                     Passed   8ms

=============================================
            All Passed (98)
            skipped (30)
=============================================

Also I didn't find any code calling sendCorrelated or receiveCorrelated.

from libote.

ladnir avatar ladnir commented on June 28, 2024

so you are crashing in ASM version of SimplestOT. Its my guess that this doesn't have to do with correlated OT. It run normal OT and then sends a few extra values. If it was a problem with correlated OT, then i wouldn't expect it to crash at the very start of the protocol before anything specific to correlated OT has been performed.

Did you purposefully enable the ASM version of simplest OT?

Can you disable it and then retry your test? python3 build.py -DENABLE_SIMPLESTOT_ASM=false

Since the unit tests are passing its my suspicion that there is some bad interaction between your library and the assembly code that simplestOT has.

from libote.

lzjluzijie avatar lzjluzijie commented on June 28, 2024

No, simplest OT is not the problem. I tried McRosRoyTwist and MasnyRindal as well, it was similar error. Also, it worked fine as long as I use the normal send and receive.

from libote.

lzjluzijie avatar lzjluzijie commented on June 28, 2024

I think there might be some issue with multithreading. I don't understand that library for MC_BEGIN and MC_AWAIT, and I am guessing there might be a problem:

        // No extra alignment is required.
        template<typename CorrelationFunc>
        task<> sendCorrelated(span<block> messages, const CorrelationFunc& corFunc, PRNG& prng, Socket& chl)
        {
            MC_BEGIN(task<>,this, messages, &corFunc, &prng, &chl,
                temp = AlignedUnVector<std::array<block, 2>>(messages.size()),
                temp2 = AlignedUnVector<block>(messages.size())
            );
            MC_AWAIT(send(temp, prng, chl));

            for (u64 i = 0; i < static_cast<u64>(messages.size()); ++i)
            {
                messages[i] = temp[i][0];
                temp2[i] = temp[i][1] ^ corFunc(temp[i][0], i);
            }

            MC_AWAIT(chl.send(std::move(temp2)));
            MC_END();
        }

Here is my main.cpp, it has segmentation fault when I set correlated to true and works normally when false, regardless of (fake)base OT and Iknp/Kos. Does this code or the example your sent me work fine on your machine?

#include "coproto/Socket/AsioSocket.h"
#include "cryptoTools/Common/CLP.h"
#include "libOTe/Base/BaseOT.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtSender.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtSender.h"

using namespace osuCrypto;
using namespace std;

const u64 totalOTs = 1024;
const bool correlated = true; // !!! DOES NOT WORK WHEN TRUE !!!
const bool fake = false;

void sender() {
  auto chl = cp::asioConnect("127.0.0.1:7700", true);
  PRNG prng(sysRandomSeed());
  IknpOtExtSender sender;
  // KosOtExtSender sender;

  cout << "OK" << endl;

  if (fake) {
    PRNG commonPRNG(oc::ZeroBlock);
    std::array<std::array<block, 2>, 128> sendMsgs;
    commonPRNG.get(sendMsgs.data(), sendMsgs.size());
    BitVector bv(128);
    bv.randomize(commonPRNG);
    std::array<block, 128> recvMsgs;
    for (u64 i = 0; i < 128; ++i) recvMsgs[i] = sendMsgs[i][bv[i]];
    sender.setBaseOts(recvMsgs, bv);
  } else {
    DefaultBaseOT base;
    BitVector bv(128);
    std::array<block, 128> baseMsg;
    bv.randomize(prng);

    cout << "OK" << endl;

    // perform the base To, call sync_wait to block until they have completed.
    cp::sync_wait(base.receive(bv, baseMsg, prng, chl));
    sender.setBaseOts(baseMsg, bv);

    cout << "OK" << endl;
  }

  if (correlated) {
    vector<block> cMsgs(totalOTs);
    prng.get(cMsgs.data(), cMsgs.size());
    cout << "OK" << endl;
    cp::sync_wait(sender.sendCorrelated(
        cMsgs, [](block m0, u64 i) { return m0; }, prng, chl));
    cout << "send" << cMsgs[0] << endl;
  } else {
    // construct a vector to stored the random send messages.
    vector<array<block, 2>> sMsgs(totalOTs);
    // Populate msgs with something useful...
    prng.get(sMsgs.data(), sMsgs.size());

    // perform the OTs. The receiver will learn one
    // of the messages stored in msgs.
    cp::sync_wait(sender.sendChosen(sMsgs, prng, chl));

    cout << "send 0 " << sMsgs[0][0] << endl;
    cout << "send 1 " << sMsgs[0][1] << endl;
  }
}

void receiver() {
  auto chl = cp::asioConnect("127.0.0.1:7700", false);
  PRNG prng(sysRandomSeed());
  IknpOtExtReceiver receiver;
  // KosOtExtReceiver receiver;

  if (fake) {
    PRNG commonPRNG(oc::ZeroBlock);
    std::array<std::array<block, 2>, 128> sendMsgs;
    commonPRNG.get(sendMsgs.data(), sendMsgs.size());

    receiver.setBaseOts(sendMsgs);
  } else {
    DefaultBaseOT base;
    std::array<std::array<block, 2>, 128> baseMsg;
    // perform the base To, call sync_wait to block until they have completed.
    cp::sync_wait(base.send(baseMsg, prng, chl));
    receiver.setBaseOts(baseMsg);
  }

  // construct the choices that we want.
  BitVector choice(totalOTs);
  // in this case pick random messages.
  choice.randomize(prng);

  // construct a vector to stored the received messages.
  std::vector<block> rMsgs(totalOTs);

  if (correlated) {
    cp::sync_wait(receiver.receiveCorrelated(choice, rMsgs, prng, chl));
  } else {
    // perform  totalOTs chosen message OTs, the results will be written to
    // msgs.
    cp::sync_wait(receiver.receiveChosen(choice, rMsgs, prng, chl));
  }

  cout << "choice " << choice[0] << endl;
  cout << rMsgs[0] << endl;
}

int main(int argc, char** argv) {
  if (argc == 1) {
    std::cout << "Usage: " << argv[0] << "0|1" << std::endl;
    return 0;
  }
  if (argv[1][0] == '0') {
    sender();
  } else {
    receiver();
  }
}

from libote.

ladnir avatar ladnir commented on June 28, 2024

Can you give a stack trace of the crash with fake base OTs?

from libote.

ladnir avatar ladnir commented on June 28, 2024

And maybe try changing your vectors to oc::AlignedVector<... >

from libote.

lzjluzijie avatar lzjluzijie commented on June 28, 2024

Sure, here is the output and the code:

vscode ➜ /workspaces/cpp/vole/build $ valgrind ./vole 0
==2268== Memcheck, a memory error detector
==2268== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2268== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==2268== Command: ./vole 0
==2268== 
OK
OK
==2268== Thread 2:
==2268== Invalid read of size 8
==2268==    at 0x40709A: macoro::Frame<osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) [clone .cold] (in /workspaces/cpp/vole/build/vole)
==2268==    by 0x425C22: resume (coro_frame.h:821)
==2268==    by 0x425C22: coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::callback(boost::system::error_code, unsigned long, coproto::detail::AsioLifetime::Lock, coproto::detail::AsioLifetime::Lock) (AsioSocket.h:446)
==2268==    by 0x42633A: operator() (AsioSocket.h:506)
==2268==    by 0x42633A: std::result_of<boost::system::error_code (boost::system const&, unsigned long const&)>::type boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot>::operator()<boost::system const&, unsigned long const&>((unsigned long const&)...) (bind_cancellation_slot.hpp:377)
==2268==    by 0x426233: boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >::operator()(boost::system, unsigned long, int) (read.hpp:398)
==2268==    by 0x426EFA: operator() (bind_handler.hpp:289)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_hook.hpp:88)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (read.hpp:466)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> (bind_handler.hpp:344)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: void boost::asio::detail::executor_function::complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, std::allocator<void> >(boost::asio::detail::executor_function::impl_base*, bool) (executor_function.hpp:116)
==2268==    by 0x413017: operator() (executor_function.hpp:64)
==2268==    by 0x413017: asio_handler_invoke<boost::asio::detail::executor_function> (handler_invoke_hook.hpp:88)
==2268==    by 0x413017: invoke<boost::asio::detail::executor_function, boost::asio::detail::executor_function> (handler_invoke_helpers.hpp:54)
==2268==    by 0x413017: boost::asio::detail::executor_op<boost::asio::detail::executor_function, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:70)
==2268==    by 0x415C91: complete (scheduler_operation.hpp:40)
==2268==    by 0x415C91: run_ready_handlers (strand_executor_service.ipp:150)
==2268==    by 0x415C91: operator() (strand_executor_service.hpp:127)
==2268==    by 0x415C91: asio_handler_invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_hook.hpp:88)
==2268==    by 0x415C91: invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void>, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x415C91: void boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u>::execute<boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void>&&) const (io_context.hpp:290)
==2268==    by 0x4159EE: operator()<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> &, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (execute.hpp:208)
==2268==    by 0x4159EE: void boost::asio::detail::strand_executor_service::do_execute<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, boost::asio::detail::executor_function, std::allocator<void> >(std::shared_ptr<boost::asio::detail::strand_executor_service::strand_impl> const&, boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const&, boost::asio::detail::executor_function&&, std::allocator<void> const&) (strand_executor_service.hpp:258)
==2268==    by 0x415823: execute<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, boost::asio::detail::executor_function> (strand_executor_service.hpp:209)
==2268==    by 0x415823: execute<boost::asio::detail::executor_function> (strand.hpp:287)
==2268==    by 0x415823: operator()<const boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> > &, boost::asio::detail::executor_function> (execute.hpp:208)
==2268==    by 0x415823: void boost::asio::execution::detail::any_executor_base::execute_ex<boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> > >(boost::asio::execution::detail::any_executor_base const&, boost::asio::detail::executor_function&&) (any_executor.hpp:889)
==2268==    by 0x426D3A: void boost::asio::execution::detail::any_executor_base::execute<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long> >(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&&) const (any_executor.hpp:606)
==2268==    by 0x426B92: operator()<boost::asio::any_io_executor, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (execute.hpp:208)
==2268==    by 0x426B92: void boost::asio::detail::handler_work_base<boost::asio::any_io_executor, boost::asio::any_io_executor, boost::asio::io_context, boost::asio::executor, void>::dispatch<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, boost::asio::cancellation_slot>(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&, boost::asio::cancellation_slot&) (handler_work.hpp:439)
==2268==    by 0x42680C: complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_work.hpp:480)
==2268==    by 0x42680C: boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system const&, unsigned long) (reactive_socket_recv_op.hpp:145)
==2268==  Address 0x4e9fd08 is 8 bytes before a block of size 40 alloc'd
==2268==    at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2268==    by 0x437035: allocate (new_allocator.h:115)
==2268==    by 0x437035: allocate (allocator.h:173)
==2268==    by 0x437035: allocate (alloc_traits.h:460)
==2268==    by 0x437035: _M_allocate (stl_vector.h:346)
==2268==    by 0x437035: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==2268==    by 0x43C6E1: macoro::Frame<osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2268==    by 0x43B861: osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==2268==    by 0x40AF31: operator() (OTExtInterface.h:88)
==2268==    by 0x40AF31: macoro::Frame<macoro::task<void, true> osuCrypto::OtSender::sendCorrelated<sender()::$_0>(nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, sender()::$_0 const&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (coro_frame.h:612)
==2268==    by 0x40BE15: resume (coro_frame.h:850)
==2268==    by 0x40BE15: start (sync_wait.h:123)
==2268==    by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2268==    by 0x40A2E5: sender() (src/main.cpp:52)
==2268==    by 0x40ACEC: main (src/main.cpp:116)
==2268== 
==2268== Invalid read of size 8
==2268==    at 0x40709E: macoro::Frame<osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) [clone .cold] (in /workspaces/cpp/vole/build/vole)
==2268==    by 0x425C22: resume (coro_frame.h:821)
==2268==    by 0x425C22: coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::callback(boost::system::error_code, unsigned long, coproto::detail::AsioLifetime::Lock, coproto::detail::AsioLifetime::Lock) (AsioSocket.h:446)
==2268==    by 0x42633A: operator() (AsioSocket.h:506)
==2268==    by 0x42633A: std::result_of<boost::system::error_code (boost::system const&, unsigned long const&)>::type boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot>::operator()<boost::system const&, unsigned long const&>((unsigned long const&)...) (bind_cancellation_slot.hpp:377)
==2268==    by 0x426233: boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >::operator()(boost::system, unsigned long, int) (read.hpp:398)
==2268==    by 0x426EFA: operator() (bind_handler.hpp:289)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_hook.hpp:88)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (read.hpp:466)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> (bind_handler.hpp:344)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: void boost::asio::detail::executor_function::complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, std::allocator<void> >(boost::asio::detail::executor_function::impl_base*, bool) (executor_function.hpp:116)
==2268==    by 0x413017: operator() (executor_function.hpp:64)
==2268==    by 0x413017: asio_handler_invoke<boost::asio::detail::executor_function> (handler_invoke_hook.hpp:88)
==2268==    by 0x413017: invoke<boost::asio::detail::executor_function, boost::asio::detail::executor_function> (handler_invoke_helpers.hpp:54)
==2268==    by 0x413017: boost::asio::detail::executor_op<boost::asio::detail::executor_function, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:70)
==2268==    by 0x415C91: complete (scheduler_operation.hpp:40)
==2268==    by 0x415C91: run_ready_handlers (strand_executor_service.ipp:150)
==2268==    by 0x415C91: operator() (strand_executor_service.hpp:127)
==2268==    by 0x415C91: asio_handler_invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_hook.hpp:88)
==2268==    by 0x415C91: invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void>, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x415C91: void boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u>::execute<boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void>&&) const (io_context.hpp:290)
==2268==    by 0x4159EE: operator()<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> &, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (execute.hpp:208)
==2268==    by 0x4159EE: void boost::asio::detail::strand_executor_service::do_execute<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, boost::asio::detail::executor_function, std::allocator<void> >(std::shared_ptr<boost::asio::detail::strand_executor_service::strand_impl> const&, boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const&, boost::asio::detail::executor_function&&, std::allocator<void> const&) (strand_executor_service.hpp:258)
==2268==    by 0x415823: execute<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, boost::asio::detail::executor_function> (strand_executor_service.hpp:209)
==2268==    by 0x415823: execute<boost::asio::detail::executor_function> (strand.hpp:287)
==2268==    by 0x415823: operator()<const boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> > &, boost::asio::detail::executor_function> (execute.hpp:208)
==2268==    by 0x415823: void boost::asio::execution::detail::any_executor_base::execute_ex<boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> > >(boost::asio::execution::detail::any_executor_base const&, boost::asio::detail::executor_function&&) (any_executor.hpp:889)
==2268==    by 0x426D3A: void boost::asio::execution::detail::any_executor_base::execute<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long> >(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&&) const (any_executor.hpp:606)
==2268==    by 0x426B92: operator()<boost::asio::any_io_executor, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (execute.hpp:208)
==2268==    by 0x426B92: void boost::asio::detail::handler_work_base<boost::asio::any_io_executor, boost::asio::any_io_executor, boost::asio::io_context, boost::asio::executor, void>::dispatch<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, boost::asio::cancellation_slot>(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&, boost::asio::cancellation_slot&) (handler_work.hpp:439)
==2268==    by 0x42680C: complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_work.hpp:480)
==2268==    by 0x42680C: boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system const&, unsigned long) (reactive_socket_recv_op.hpp:145)
==2268==  Address 0x4e9fd00 is 16 bytes before a block of size 40 alloc'd
==2268==    at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2268==    by 0x437035: allocate (new_allocator.h:115)
==2268==    by 0x437035: allocate (allocator.h:173)
==2268==    by 0x437035: allocate (alloc_traits.h:460)
==2268==    by 0x437035: _M_allocate (stl_vector.h:346)
==2268==    by 0x437035: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==2268==    by 0x43C6E1: macoro::Frame<osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2268==    by 0x43B861: osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==2268==    by 0x40AF31: operator() (OTExtInterface.h:88)
==2268==    by 0x40AF31: macoro::Frame<macoro::task<void, true> osuCrypto::OtSender::sendCorrelated<sender()::$_0>(nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, sender()::$_0 const&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (coro_frame.h:612)
==2268==    by 0x40BE15: resume (coro_frame.h:850)
==2268==    by 0x40BE15: start (sync_wait.h:123)
==2268==    by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2268==    by 0x40A2E5: sender() (src/main.cpp:52)
==2268==    by 0x40ACEC: main (src/main.cpp:116)
==2268== 
==2268== Jump to the invalid address stated on the next line
==2268==    at 0x0: ???
==2268==    by 0x425C22: resume (coro_frame.h:821)
==2268==    by 0x425C22: coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::callback(boost::system::error_code, unsigned long, coproto::detail::AsioLifetime::Lock, coproto::detail::AsioLifetime::Lock) (AsioSocket.h:446)
==2268==    by 0x42633A: operator() (AsioSocket.h:506)
==2268==    by 0x42633A: std::result_of<boost::system::error_code (boost::system const&, unsigned long const&)>::type boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot>::operator()<boost::system const&, unsigned long const&>((unsigned long const&)...) (bind_cancellation_slot.hpp:377)
==2268==    by 0x426233: boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >::operator()(boost::system, unsigned long, int) (read.hpp:398)
==2268==    by 0x426EFA: operator() (bind_handler.hpp:289)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_hook.hpp:88)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (read.hpp:466)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> (bind_handler.hpp:344)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: void boost::asio::detail::executor_function::complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, std::allocator<void> >(boost::asio::detail::executor_function::impl_base*, bool) (executor_function.hpp:116)
==2268==    by 0x413017: operator() (executor_function.hpp:64)
==2268==    by 0x413017: asio_handler_invoke<boost::asio::detail::executor_function> (handler_invoke_hook.hpp:88)
==2268==    by 0x413017: invoke<boost::asio::detail::executor_function, boost::asio::detail::executor_function> (handler_invoke_helpers.hpp:54)
==2268==    by 0x413017: boost::asio::detail::executor_op<boost::asio::detail::executor_function, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:70)
==2268==    by 0x415C91: complete (scheduler_operation.hpp:40)
==2268==    by 0x415C91: run_ready_handlers (strand_executor_service.ipp:150)
==2268==    by 0x415C91: operator() (strand_executor_service.hpp:127)
==2268==    by 0x415C91: asio_handler_invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_hook.hpp:88)
==2268==    by 0x415C91: invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void>, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x415C91: void boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u>::execute<boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void>&&) const (io_context.hpp:290)
==2268==    by 0x4159EE: operator()<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> &, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (execute.hpp:208)
==2268==    by 0x4159EE: void boost::asio::detail::strand_executor_service::do_execute<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, boost::asio::detail::executor_function, std::allocator<void> >(std::shared_ptr<boost::asio::detail::strand_executor_service::strand_impl> const&, boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const&, boost::asio::detail::executor_function&&, std::allocator<void> const&) (strand_executor_service.hpp:258)
==2268==    by 0x415823: execute<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, boost::asio::detail::executor_function> (strand_executor_service.hpp:209)
==2268==    by 0x415823: execute<boost::asio::detail::executor_function> (strand.hpp:287)
==2268==    by 0x415823: operator()<const boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> > &, boost::asio::detail::executor_function> (execute.hpp:208)
==2268==    by 0x415823: void boost::asio::execution::detail::any_executor_base::execute_ex<boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> > >(boost::asio::execution::detail::any_executor_base const&, boost::asio::detail::executor_function&&) (any_executor.hpp:889)
==2268==    by 0x426D3A: void boost::asio::execution::detail::any_executor_base::execute<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long> >(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&&) const (any_executor.hpp:606)
==2268==    by 0x426B92: operator()<boost::asio::any_io_executor, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (execute.hpp:208)
==2268==    by 0x426B92: void boost::asio::detail::handler_work_base<boost::asio::any_io_executor, boost::asio::any_io_executor, boost::asio::io_context, boost::asio::executor, void>::dispatch<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, boost::asio::cancellation_slot>(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&, boost::asio::cancellation_slot&) (handler_work.hpp:439)
==2268==    by 0x42680C: complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_work.hpp:480)
==2268==    by 0x42680C: boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system const&, unsigned long) (reactive_socket_recv_op.hpp:145)
==2268==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==2268== 
==2268== 
==2268== Process terminating with default action of signal 11 (SIGSEGV)
==2268==  Bad permissions for mapped region at address 0x0
==2268==    at 0x0: ???
==2268==    by 0x425C22: resume (coro_frame.h:821)
==2268==    by 0x425C22: coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::callback(boost::system::error_code, unsigned long, coproto::detail::AsioLifetime::Lock, coproto::detail::AsioLifetime::Lock) (AsioSocket.h:446)
==2268==    by 0x42633A: operator() (AsioSocket.h:506)
==2268==    by 0x42633A: std::result_of<boost::system::error_code (boost::system const&, unsigned long const&)>::type boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot>::operator()<boost::system const&, unsigned long const&>((unsigned long const&)...) (bind_cancellation_slot.hpp:377)
==2268==    by 0x426233: boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >::operator()(boost::system, unsigned long, int) (read.hpp:398)
==2268==    by 0x426EFA: operator() (bind_handler.hpp:289)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_hook.hpp:88)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (read.hpp:466)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> (bind_handler.hpp:344)
==2268==    by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x426EFA: void boost::asio::detail::executor_function::complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, std::allocator<void> >(boost::asio::detail::executor_function::impl_base*, bool) (executor_function.hpp:116)
==2268==    by 0x413017: operator() (executor_function.hpp:64)
==2268==    by 0x413017: asio_handler_invoke<boost::asio::detail::executor_function> (handler_invoke_hook.hpp:88)
==2268==    by 0x413017: invoke<boost::asio::detail::executor_function, boost::asio::detail::executor_function> (handler_invoke_helpers.hpp:54)
==2268==    by 0x413017: boost::asio::detail::executor_op<boost::asio::detail::executor_function, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:70)
==2268==    by 0x415C91: complete (scheduler_operation.hpp:40)
==2268==    by 0x415C91: run_ready_handlers (strand_executor_service.ipp:150)
==2268==    by 0x415C91: operator() (strand_executor_service.hpp:127)
==2268==    by 0x415C91: asio_handler_invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_hook.hpp:88)
==2268==    by 0x415C91: invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void>, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_helpers.hpp:54)
==2268==    by 0x415C91: void boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u>::execute<boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void>&&) const (io_context.hpp:290)
==2268==    by 0x4159EE: operator()<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> &, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (execute.hpp:208)
==2268==    by 0x4159EE: void boost::asio::detail::strand_executor_service::do_execute<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, boost::asio::detail::executor_function, std::allocator<void> >(std::shared_ptr<boost::asio::detail::strand_executor_service::strand_impl> const&, boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const&, boost::asio::detail::executor_function&&, std::allocator<void> const&) (strand_executor_service.hpp:258)
==2268==    by 0x415823: execute<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, boost::asio::detail::executor_function> (strand_executor_service.hpp:209)
==2268==    by 0x415823: execute<boost::asio::detail::executor_function> (strand.hpp:287)
==2268==    by 0x415823: operator()<const boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> > &, boost::asio::detail::executor_function> (execute.hpp:208)
==2268==    by 0x415823: void boost::asio::execution::detail::any_executor_base::execute_ex<boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> > >(boost::asio::execution::detail::any_executor_base const&, boost::asio::detail::executor_function&&) (any_executor.hpp:889)
==2268==    by 0x426D3A: void boost::asio::execution::detail::any_executor_base::execute<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long> >(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&&) const (any_executor.hpp:606)
==2268==    by 0x426B92: operator()<boost::asio::any_io_executor, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (execute.hpp:208)
==2268==    by 0x426B92: void boost::asio::detail::handler_work_base<boost::asio::any_io_executor, boost::asio::any_io_executor, boost::asio::io_context, boost::asio::executor, void>::dispatch<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, boost::asio::cancellation_slot>(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&, boost::asio::cancellation_slot&) (handler_work.hpp:439)
==2268==    by 0x42680C: complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_work.hpp:480)
==2268==    by 0x42680C: boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system const&, unsigned long) (reactive_socket_recv_op.hpp:145)
==2268== 
==2268== HEAP SUMMARY:
==2268==     in use at exit: 1,131,692 bytes in 75 blocks
==2268==   total heap usage: 138 allocs, 63 frees, 1,212,996 bytes allocated
==2268== 
==2268== LEAK SUMMARY:
==2268==    definitely lost: 0 bytes in 0 blocks
==2268==    indirectly lost: 0 bytes in 0 blocks
==2268==      possibly lost: 1,124,302 bytes in 18 blocks
==2268==    still reachable: 7,390 bytes in 57 blocks
==2268==                       of which reachable via heuristic:
==2268==                         stdstring          : 36 bytes in 1 blocks
==2268==         suppressed: 0 bytes in 0 blocks
==2268== Rerun with --leak-check=full to see details of leaked memory
==2268== 
==2268== For lists of detected and suppressed errors, rerun with: -s
==2268== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
[1]    2268 segmentation fault  valgrind ./vole 0


vscode ➜ /workspaces/cpp/vole/build $ valgrind ./vole 1
==2427== Memcheck, a memory error detector
==2427== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2427== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==2427== Command: ./vole 1
==2427== 
==2427== Invalid read of size 8
==2427==    at 0x437838: macoro::Frame<osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x44030E: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x40BE15: resume (coro_frame.h:850)
==2427==    by 0x40BE15: start (sync_wait.h:123)
==2427==    by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427==    by 0x40A8EB: receiver() (src/main.cpp:99)
==2427==    by 0x40ACF6: main (src/main.cpp:118)
==2427==  Address 0x4d96f68 is 8 bytes before a block of size 40 alloc'd
==2427==    at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2427==    by 0x437035: allocate (new_allocator.h:115)
==2427==    by 0x437035: allocate (allocator.h:173)
==2427==    by 0x437035: allocate (alloc_traits.h:460)
==2427==    by 0x437035: _M_allocate (stl_vector.h:346)
==2427==    by 0x437035: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==2427==    by 0x438B93: osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, true> >*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x437AA1: osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x440256: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x40BE15: resume (coro_frame.h:850)
==2427==    by 0x40BE15: start (sync_wait.h:123)
==2427==    by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427==    by 0x40A8EB: receiver() (src/main.cpp:99)
==2427==    by 0x40ACF6: main (src/main.cpp:118)
==2427== 
==2427== Invalid read of size 8
==2427==    at 0x43783C: macoro::Frame<osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x44030E: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x40BE15: resume (coro_frame.h:850)
==2427==    by 0x40BE15: start (sync_wait.h:123)
==2427==    by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427==    by 0x40A8EB: receiver() (src/main.cpp:99)
==2427==    by 0x40ACF6: main (src/main.cpp:118)
==2427==  Address 0x4d96f60 is 16 bytes before a block of size 40 alloc'd
==2427==    at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2427==    by 0x437035: allocate (new_allocator.h:115)
==2427==    by 0x437035: allocate (allocator.h:173)
==2427==    by 0x437035: allocate (alloc_traits.h:460)
==2427==    by 0x437035: _M_allocate (stl_vector.h:346)
==2427==    by 0x437035: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==2427==    by 0x438B93: osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, true> >*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x437AA1: osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x440256: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x40BE15: resume (coro_frame.h:850)
==2427==    by 0x40BE15: start (sync_wait.h:123)
==2427==    by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427==    by 0x40A8EB: receiver() (src/main.cpp:99)
==2427==    by 0x40ACF6: main (src/main.cpp:118)
==2427== 
==2427== Jump to the invalid address stated on the next line
==2427==    at 0x0: ???
==2427==    by 0x43783F: macoro::Frame<osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x44030E: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x40BE15: resume (coro_frame.h:850)
==2427==    by 0x40BE15: start (sync_wait.h:123)
==2427==    by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427==    by 0x40A8EB: receiver() (src/main.cpp:99)
==2427==    by 0x40ACF6: main (src/main.cpp:118)
==2427==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==2427== 
==2427== 
==2427== Process terminating with default action of signal 11 (SIGSEGV)
==2427==  Bad permissions for mapped region at address 0x0
==2427==    at 0x0: ???
==2427==    by 0x43783F: macoro::Frame<osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x44030E: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427==    by 0x40BE15: resume (coro_frame.h:850)
==2427==    by 0x40BE15: start (sync_wait.h:123)
==2427==    by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427==    by 0x40A8EB: receiver() (src/main.cpp:99)
==2427==    by 0x40ACF6: main (src/main.cpp:118)
==2427== 
==2427== HEAP SUMMARY:
==2427==     in use at exit: 63,770 bytes in 68 blocks
==2427==   total heap usage: 110 allocs, 42 frees, 143,048 bytes allocated
==2427== 
==2427== LEAK SUMMARY:
==2427==    definitely lost: 0 bytes in 0 blocks
==2427==    indirectly lost: 0 bytes in 0 blocks
==2427==      possibly lost: 56,860 bytes in 15 blocks
==2427==    still reachable: 6,910 bytes in 53 blocks
==2427==         suppressed: 0 bytes in 0 blocks
==2427== Rerun with --leak-check=full to see details of leaked memory
==2427== 
==2427== For lists of detected and suppressed errors, rerun with: -s
==2427== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
[1]    2427 segmentation fault  valgrind ./vole 1
#include "coproto/Socket/AsioSocket.h"
#include "cryptoTools/Common/CLP.h"
#include "libOTe/Base/BaseOT.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtSender.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtSender.h"

using namespace osuCrypto;
using namespace std;

const u64 totalOTs = 1024;
const bool correlated = true; // !!! DOES NOT WORK WHEN TRUE !!!
const bool fake = true;

void sender() {
  auto chl = cp::asioConnect("127.0.0.1:7700", true);
  PRNG prng(sysRandomSeed());
  IknpOtExtSender sender;
  // KosOtExtSender sender;

  cout << "OK" << endl;

  if (fake) {
    PRNG commonPRNG(oc::ZeroBlock);
    std::array<std::array<block, 2>, 128> sendMsgs;
    commonPRNG.get(sendMsgs.data(), sendMsgs.size());
    BitVector bv(128);
    bv.randomize(commonPRNG);
    std::array<block, 128> recvMsgs;
    for (u64 i = 0; i < 128; ++i) recvMsgs[i] = sendMsgs[i][bv[i]];
    sender.setBaseOts(recvMsgs, bv);
  } else {
    DefaultBaseOT base;
    BitVector bv(128);
    std::array<block, 128> baseMsg;
    bv.randomize(prng);

    cout << "OK" << endl;

    // perform the base To, call sync_wait to block until they have completed.
    cp::sync_wait(base.receive(bv, baseMsg, prng, chl));
    sender.setBaseOts(baseMsg, bv);

    cout << "OK" << endl;
  }

  if (correlated) {
    oc::AlignedUnVector<block> cMsgs(totalOTs);
    prng.get(cMsgs.data(), cMsgs.size());
    cout << "OK" << endl;
    cp::sync_wait(sender.sendCorrelated(
        cMsgs, [](block m0, u64 i) { return m0; }, prng, chl));
    cout << "send" << cMsgs[0] << endl;
  } else {
    // construct a vector to stored the random send messages.
    vector<array<block, 2>> sMsgs(totalOTs);
    // Populate msgs with something useful...
    prng.get(sMsgs.data(), sMsgs.size());

    // perform the OTs. The receiver will learn one
    // of the messages stored in msgs.
    cp::sync_wait(sender.sendChosen(sMsgs, prng, chl));

    cout << "send 0 " << sMsgs[0][0] << endl;
    cout << "send 1 " << sMsgs[0][1] << endl;
  }
}

void receiver() {
  auto chl = cp::asioConnect("127.0.0.1:7700", false);
  PRNG prng(sysRandomSeed());
  IknpOtExtReceiver receiver;
  // KosOtExtReceiver receiver;

  if (fake) {
    PRNG commonPRNG(oc::ZeroBlock);
    std::array<std::array<block, 2>, 128> sendMsgs;
    commonPRNG.get(sendMsgs.data(), sendMsgs.size());

    receiver.setBaseOts(sendMsgs);
  } else {
    DefaultBaseOT base;
    std::array<std::array<block, 2>, 128> baseMsg;
    // perform the base To, call sync_wait to block until they have completed.
    cp::sync_wait(base.send(baseMsg, prng, chl));
    receiver.setBaseOts(baseMsg);
  }

  // construct the choices that we want.
  BitVector choice(totalOTs);
  // in this case pick random messages.
  choice.randomize(prng);

  // construct a vector to stored the received messages.
  oc::AlignedUnVector<block> rMsgs(totalOTs);

  if (correlated) {
    cp::sync_wait(receiver.receiveCorrelated(choice, rMsgs, prng, chl));
  } else {
    // perform  totalOTs chosen message OTs, the results will be written to
    // msgs.
    cp::sync_wait(receiver.receiveChosen(choice, rMsgs, prng, chl));
  }

  cout << "choice " << choice[0] << endl;
  cout << rMsgs[0] << endl;
}

int main(int argc, char** argv) {
  if (argc == 1) {
    std::cout << "Usage: " << argv[0] << "0|1" << std::endl;
    return 0;
  }
  if (argv[1][0] == '0') {
    sender();
  } else {
    receiver();
  }
}

from libote.

lzjluzijie avatar lzjluzijie commented on June 28, 2024

Thank you very much for your reply. I tried to copy and paste your code to libOTe/frontend/main.cpp and complied using python3 build.py, and it surprisingly worked! Then I tried my old code in that file and worked again. But both my old code and your code still got segmentation fault in my old project, so I am guessing I had some mistake in my CMake configuration.

I am new to CMake and tried to import libOTe by python build.py --all --boost --sodium and then python build.py --install, and here is my CMakeLists.txt.

cmake_minimum_required(VERSION 3.18)

project(vole)

# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20 -mssse3 -maes -pthread -Wall")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g")

file(GLOB SOURCES "src/*.cpp")

include_directories(${CMAKE_SOURCE_DIR})

add_executable(vole ${SOURCES})

find_package(libOTe REQUIRED)
target_link_libraries(vole oc::libOTe)

target_link_libraries(vole oc::libOTe_Tests oc::tests_cryptoTools)
target_compile_options(vole PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-std=c++${LIBOTE_STD_VER}>)

I guess this is not the best way to link libOTe since I installed it on OS level, I also tried the HINTS method but it didn't work. What's the best practice to link libOTe? Thank you.

from libote.

ladnir avatar ladnir commented on June 28, 2024

ahh, ok bet it is that you're on cpp 20. This should work but I have not tested it well enough. macoro (my coroutine library) has support for cpp20 and my guess is that somehow when macoro see that you have cpp20 enables this support and then there is a bug in the interaction between legacy support and cpp20.

Switch to 17. If that works then I'll work on reproducing this and push a fix.

from libote.

lzjluzijie avatar lzjluzijie commented on June 28, 2024

No, I tried cpp 17 but still got segmentation fault.

from libote.

ladnir avatar ladnir commented on June 28, 2024

hmmm, maybe try

find_package(libOTe REQUIRED
        PATHS /path/to/libOTe/repo
        NO_DEFAULT_PATH
        NO_CMAKE_ENVIRONMENT PATH
        NO_CMAKE_PATH
        NO_SYSTEM_ENVIRONMENT_PATH
        NO_CMAKE_SYSTEM_PATH
        NO_CMAKE_FIND_ROOT_PATH)

where path/to/libOTe/repo is replace with whatever it is. Then delete your build and try again.

from libote.

lzjluzijie avatar lzjluzijie commented on June 28, 2024

Still got segmentation fault. I am trying to build from scratch in another environment, but got this weird error when I tried to build libOTe...

 file included from /home/halulu/bimsa-gshade/libOTe/out/macoro/tests/channel_spsc_tests.cpp:3:
In file included from /home/halulu/bimsa-gshade/libOTe/out/macoro/macoro/../macoro/channel_spsc.h:2:
/home/halulu/bimsa-gshade/libOTe/out/macoro/macoro/../macoro/channel.h:47:56: error: no member named 'exchange' in namespace 'std'; did you mean '__exchange'?
            wrapper_base(wrapper_base&& o) : mChl(std::exchange(o.mChl, nullptr)), mIndex(o.mIndex), mPop(o.mPop) {};
                                                  ~~~~~^~~~~~~~
                                                       __exchange
/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/move.h:157:5: note: '__exchange' declared here
    __exchange(_Tp& __obj, _Up&& __new_val)
 

from libote.

ladnir avatar ladnir commented on June 28, 2024

Dang, yeah im really at a loss about what it could be. You could remove all of your compile arguments. libOTe will already include those for you...

For the compile issue, add #include <utility> to the top of /home/halulu/bimsa-gshade/libOTe/out/macoro/macoro/../macoro/channel.h. I'll work on pushing a fix for this as well.

from libote.

lzjluzijie avatar lzjluzijie commented on June 28, 2024

Here is my CMakeLists.txt, I have to set it to cpp 17 otherwise it won't compile, and I still got segmentation fault. I am trying to compile this in the new environment.

cmake_minimum_required(VERSION 3.18)

project(vole)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")

file(GLOB SOURCES "src/*.cpp")

add_executable(vole ${SOURCES})

find_package(libOTe REQUIRED
        PATHS libOTe
        NO_DEFAULT_PATH
        NO_CMAKE_ENVIRONMENT_PATH
        NO_CMAKE_PATH
        NO_SYSTEM_ENVIRONMENT_PATH
        NO_CMAKE_SYSTEM_PATH
        NO_CMAKE_FIND_ROOT_PATH)
target_link_libraries(vole oc::libOTe)

from libote.

lzjluzijie avatar lzjluzijie commented on June 28, 2024

Strange... It worked in my new environment without installing libOTe, I guess my previous environment might be contaminated by multiple install of libOTe. Thank you so much for your help.

Btw I got the std::exchange when building cryptoTools for libOTe, I added #include <utility> to cryptoTools/Common/Defines.h, not sure if this needs to be fixed.

from libote.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.