rust/src
bors d565c74887 Auto merge of #81858 - ijackson:fork-no-unwind, r=m-ou-se
Do not allocate or unwind after fork

### Objective scenarios

 * Make (simple) panics safe in `Command::pre_exec_hook`, including most `panic!` calls, `Option::unwrap`, and array bounds check failures.
 * Make it possible to `libc::fork` and then safely panic in the child (needed for the above, but this requirement means exposing the new raw hook API which the `Command` implementation needs).
 * In singlethreaded programs, where panic in `pre_exec_hook` is already memory-safe, prevent the double-unwinding malfunction #79740.

I think we want to make panic after fork safe even though the post-fork child environment is only experienced by users of `unsafe`, beause the subset of Rust in which any panic is UB is really far too hazardous and unnatural.

#### Approach

 * Provide a way for a program to, at runtime, switch to having panics abort.  This makes it possible to panic without making *any* heap allocations, which is needed because on some platforms malloc is UB in a child forked from a multithreaded program (see https://github.com/rust-lang/rust/pull/80263#issuecomment-774272370, and maybe also the SuS [spec](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fork.html)).
 * Make that change in the child spawned by `Command`.
 * Document the rules comprehensively enough that a programmer has a fighting chance of writing correct code.
 * Test that this all works as expected (and in particular, that there aren't any heap allocations we missed)

Fixes #79740

#### Rejected (or previously attempted) approaches

 * Change the panic machinery to be able to unwind without allocating, at least when the payload and message are both `'static`.  This seems like it would be even more subtle.  Also that is a potentially-hot path which I don't want to mess with.
 * Change the existing panic hook mechanism to not convert the message to a `String` before calling the hook.  This would be a surprising change for existing code and would not be detected by the type system.
 * Provide a `raw_panic_hook` function to intercept panics in a way that doesn't allocate.  (That was an earlier version of this MR.)

### History

This MR could be considered a v2 of #80263.  Thanks to everyone who commented there.  In particular, thanks to `@m-ou-se,` `@Mark-Simulacrum` and `@hyd-dev.`  (Tagging you since I think you might be interested in this new MR.)  Compared to #80263, this MR has very substantial changes and additions.

Additionally, I have recently (2021-04-20) completely revised this series following very helpful comments from `@m-ou-se.`

r? `@m-ou-se`
2021-05-15 22:27:09 +00:00
..
bootstrap Auto merge of #85335 - GuillaumeGomez:rollup-0tvc14g, r=GuillaumeGomez 2021-05-15 17:37:18 +00:00
build_helper
ci Auto merge of #85335 - GuillaumeGomez:rollup-0tvc14g, r=GuillaumeGomez 2021-05-15 17:37:18 +00:00
doc Update global_asm! documentation 2021-05-13 22:31:58 +01:00
etc Fix HashMap/HashSet LLDB pretty-printer after hashbrown 0.11.0 2021-04-06 12:44:17 +03:00
librustdoc Rollup merge of #85323 - GuillaumeGomez:fix-eslint-errors, r=jsha 2021-05-15 13:29:57 +02:00
llvm-project@5f67a57157 Update LLVM submodule 2021-05-12 21:15:39 +02:00
rustdoc-json-types rustdoc-json: Rename Import.span to Import.source 2021-03-21 19:47:12 -07:00
test Auto merge of #81858 - ijackson:fork-no-unwind, r=m-ou-se 2021-05-15 22:27:09 +00:00
tools Auto merge of #82208 - jyn514:rustfmt-subtree, r=Mark-Simulacrum 2021-05-15 14:55:56 +00:00
README.md
stage0.txt Bump bootstrap compiler 2021-04-06 18:24:09 -07:00
version bump version to 1.54.0 2021-04-30 15:24:00 +02:00

This directory contains the source code of the rust project, including:

  • The test suite
  • The bootstrapping build system
  • Various submodules for tools, like rustdoc, rls, etc.

For more information on how various parts of the compiler work, see the rustc dev guide.