@@ -313,17 +313,32 @@ impl Error for VarError {
313
313
/// Sets the environment variable `key` to the value `value` for the currently running
314
314
/// process.
315
315
///
316
- /// Note that while concurrent access to environment variables is safe in Rust,
317
- /// some platforms only expose inherently unsafe non-threadsafe APIs for
318
- /// inspecting the environment. As a result, extra care needs to be taken when
319
- /// auditing calls to unsafe external FFI functions to ensure that any external
320
- /// environment accesses are properly synchronized with accesses in Rust.
316
+ /// # Safety
317
+ ///
318
+ /// Even though this function is currently not marked as `unsafe`, it needs to
319
+ /// be because invoking it can cause undefined behaviour. The function will be
320
+ /// marked `unsafe` in a future version of Rust. This is tracked in
321
+ /// [rust#27970](https://github.com/rust-lang/rust/issues/27970).
322
+ ///
323
+ /// This function is safe to call in a single-threaded program.
324
+ ///
325
+ /// In multi-threaded programs, you must ensure that are no other threads
326
+ /// concurrently writing or *reading*(!) from the environment through functions
327
+ /// other than the ones in this module. You are responsible for figuring out
328
+ /// how to achieve this, but we strongly suggest not using `set_var` or
329
+ /// `remove_var` in multi-threaded programs at all.
330
+ ///
331
+ /// Most C libraries, including libc itself do not advertise which functions
332
+ /// read from the environment. Even functions from the Rust standard library do
333
+ /// that, e.g. for DNS lookups from [`std::net::ToSocketAddrs`].
321
334
///
322
335
/// Discussion of this unsafety on Unix may be found in:
323
336
///
324
337
/// - [Austin Group Bugzilla](https://austingroupbugs.net/view.php?id=188)
325
338
/// - [GNU C library Bugzilla](https://sourceware.org/bugzilla/show_bug.cgi?id=15607#c2)
326
339
///
340
+ /// [`std::net::ToSocketAddrs`]: crate::net::ToSocketAddrs
341
+ ///
327
342
/// # Panics
328
343
///
329
344
/// This function may panic if `key` is empty, contains an ASCII equals sign `'='`
@@ -351,17 +366,32 @@ fn _set_var(key: &OsStr, value: &OsStr) {
351
366
352
367
/// Removes an environment variable from the environment of the currently running process.
353
368
///
354
- /// Note that while concurrent access to environment variables is safe in Rust,
355
- /// some platforms only expose inherently unsafe non-threadsafe APIs for
356
- /// inspecting the environment. As a result extra care needs to be taken when
357
- /// auditing calls to unsafe external FFI functions to ensure that any external
358
- /// environment accesses are properly synchronized with accesses in Rust.
369
+ /// # Safety
370
+ ///
371
+ /// Even though this function is currently not marked as `unsafe`, it needs to
372
+ /// be because invoking it can cause undefined behaviour. The function will be
373
+ /// marked `unsafe` in a future version of Rust. This is tracked in
374
+ /// [rust#27970](https://github.com/rust-lang/rust/issues/27970).
375
+ ///
376
+ /// This function is safe to call in a single-threaded program.
377
+ ///
378
+ /// In multi-threaded programs, you must ensure that are no other threads
379
+ /// concurrently writing or *reading*(!) from the environment through functions
380
+ /// other than the ones in this module. You are responsible for figuring out
381
+ /// how to achieve this, but we strongly suggest not using `set_var` or
382
+ /// `remove_var` in multi-threaded programs at all.
383
+ ///
384
+ /// Most C libraries, including libc itself do not advertise which functions
385
+ /// read from the environment. Even functions from the Rust standard library do
386
+ /// that, e.g. for DNS lookups from [`std::net::ToSocketAddrs`].
359
387
///
360
388
/// Discussion of this unsafety on Unix may be found in:
361
389
///
362
390
/// - [Austin Group Bugzilla](https://austingroupbugs.net/view.php?id=188)
363
391
/// - [GNU C library Bugzilla](https://sourceware.org/bugzilla/show_bug.cgi?id=15607#c2)
364
392
///
393
+ /// [`std::net::ToSocketAddrs`]: crate::net::ToSocketAddrs
394
+ ///
365
395
/// # Panics
366
396
///
367
397
/// This function may panic if `key` is empty, contains an ASCII equals sign
0 commit comments