Git Product home page Git Product logo

Comments (9)

foonathan avatar foonathan commented on May 23, 2024

Stupid oversight on my part, now fixed.

Moreover, in release build the unit tests hangs at the very end unless I forcefully terminate with exit(.); might be unrelated though.

I can't reproduce that, could you provide more information?

from memory.

twiggler avatar twiggler commented on May 23, 2024

Thanks for the fix 👍

I cannot reproduce the test hanging in release build, because it now SEGFAULTS when copying a custom container which uses an iteration_allocator wrapped in an any_std_allocator. I already observed this in the "release with debug information" build before and dismissed it as a fluke, so this new behavior is most likely not caused by your most recent commit.

I will try to isolate the problem.

from memory.

twiggler avatar twiggler commented on May 23, 2024

I've isolated the problem to the following case (with -O2):

auto entityAllocator = iteration_allocator<2, fixed_block_allocator<>>(16 * 1024 * 1024);
std::vector<int, foonathan::memory::any_std_allocator<int, foonathan::memory::no_mutex>> v(10, make_any_std_allocator<char, no_mutex>(entityAllocator));
auto v2(v);
auto v3 = v;

Note that the passed std_allocator needs to be converted from char to int.
If i write this, it runs fine:

auto entityAllocator = iteration_allocator<2, fixed_block_allocator<>>(16 * 1024 * 1024);
std::vector<int, foonathan::memory::any_std_allocator<int, foonathan::memory::no_mutex>> v(10, make_any_std_allocator<int, no_mutex>(entityAllocator));
auto v2(v);
auto v3 = v;

In the second code fragment, the passed std_allocator does not need to be converted. I cannot figure out yet why this is a problem, although perhaps something is referencing the temporary std_allocator that is created when converting.

from memory.

foonathan avatar foonathan commented on May 23, 2024

Thank you I will investigate.

from memory.

twiggler avatar twiggler commented on May 23, 2024

from memory.

foonathan avatar foonathan commented on May 23, 2024

Should be fixed now.

from memory.

twiggler avatar twiggler commented on May 23, 2024

Sweet, the test now runs fine.

Apart from the failure to properly destruct the basic_allocator, I gather from your changes to std_allocator that this constructor did not win the overload resolution; if so, do you know why? Because it takes base_allocator as a const reference?

What techniques did you employ to debug this issue, if I may ask?

from memory.

foonathan avatar foonathan commented on May 23, 2024

I gather from your changes to std_allocator that this constructor did not win the overload resolution; if so, do you know why?

Because that constructor isn't forwarded to the allocator_reference class, so it is not available outside the reference_storage.

What techniques did you employ to debug this issue, if I may ask?

I first did trial and error (which lead to the insertion of destructor calls, because without them the code is technically UB). This actually fixed an even more simplified example, but not yours.

Because it worked fine in debug mode, I used clang's sanitizers there.

The undefined behavior sanitizer discovered the alignment issues in small free list which were completely unrelated but had to be fixed. Then the address sanitizer reported a stack-use-after-scope. With that I could simplify everything to something like this:

any_std_allocator<int> alloc = make_any_std_allocator<char>(heap_allocator{});
alloc.allocate(1);

Because it worked fine with int at both calls, I looked at the converting constructors of std_allocator and realized that they were broken.

from memory.

twiggler avatar twiggler commented on May 23, 2024

Because that constructor isn't forwarded to the allocator_reference class, so it is not available outside the reference_storage.

Ah, that was the piece of the puzzle I was missing.

Thanks for the write-up!

from memory.

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.