Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

map_reduce: prevent mapper exception from poisoning state #2684

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

avikivity
Copy link
Member

In map_reduce, if the mapper throws, we can end up with poisoned state. This is because the compiler can choose to move s->result before evaluating f.get(), so s->result gets broken (if the mapped type becomes invalid after move).

Fix by triggering the exception before the moving s->result, with a sequence point to force the ordering.

A unit test is added (which does fail with clang before the patch, though if the arguments are evaluated in reverse order, it can pass with a different compiler).

In map_reduce, if the mapper throws, we can end up with poisoned
state. This is because the compiler can choose to move s->result
before evaluating f.get(), so s->result gets broken (if the mapped
type becomes invalid after move).

Fix by triggering the exception before the moving s->result, with
a sequence point to force the ordering.

A unit test is added (which does fail with clang before the patch,
though if the arguments are evaluated in reverse order, it can pass
with a different compiler).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant