-
-
Notifications
You must be signed in to change notification settings - Fork 14.9k
Document the runtime environment assumptions of std #133604
Copy link
Copy link
Open
Labels
A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsArea: Documentation for any part of the project, including the compiler, standard library, and toolsA-runtimeArea: std's runtime and "pre-main" init for handling backtraces, unwinds, stack overflowsArea: std's runtime and "pre-main" init for handling backtraces, unwinds, stack overflowsC-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCCategory: An issue tracking the progress of sth. like the implementation of an RFCT-libsRelevant to the library team, which will review and decide on the PR/issue.Relevant to the library team, which will review and decide on the PR/issue.
Metadata
Metadata
Assignees
Labels
A-docsArea: Documentation for any part of the project, including the compiler, standard library, and toolsArea: Documentation for any part of the project, including the compiler, standard library, and toolsA-runtimeArea: std's runtime and "pre-main" init for handling backtraces, unwinds, stack overflowsArea: std's runtime and "pre-main" init for handling backtraces, unwinds, stack overflowsC-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCCategory: An issue tracking the progress of sth. like the implementation of an RFCT-libsRelevant to the library team, which will review and decide on the PR/issue.Relevant to the library team, which will review and decide on the PR/issue.
Type
Fields
Give feedbackNo fields configured for issues without a type.
stdmakes a number of assumptions about the runtime environment that go beyond what is guaranteed by the ABI. They should be documented somewhere. I'm filing this issue to both collect these assumptions and have a discussion about what the best place is to put them.Assumptions
stdmakes:stdis not used when the C platform functions are not available. E.g. usingcloneon Linux and then calling intostdis definitely not sound. (This one is very obvious)stdis not called from an asynchronous signal handler or afterfork.stdmakes no attempt at being async-signal-safe (except forpanic!afteralways_aborthas been called).pthread_exitorpthread_cancel).This is because cancellation does not result in proper unwinding meaning destructors aren't called, but the thread's stack is reused – this is incompatible with
pin!and probably a bunch of library code.STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO) are assumed to be usable as standard input/output/error.sigaltstackis not used by code that does not also install it's own handlers forSIGSEGVandSIGBUS(only applicable whensigaltstackis used in threads not spawned bystd).stduses TLS variables to store the address of the stack guard page. While TLS accesses are not documented to be async-signal-safe, they mostly are – except for the first access to a variable.stdmakes sure to always access the relevant variables before setting up asigaltstack, thereby ensuring that the TLS accesses are safe when the signal handler is successfully called. User code has no access to these variables and therefore cannot initialize them, so it must ensure thatstd's signal handler is not called when they could be uninitialized._tlv_atexit.There was a platform bug that resulted in crashes when
_tlv_atexitis recursively called. It has since been fixed, but our minimum supported version is not high enough to include the fix.