@@ -24,6 +24,8 @@ This feature allows for use of one of following sanitizers:
2424 AddressSanitizer, but based on partial hardware assistance.
2525 * [ LeakSanitizer] ( #leaksanitizer ) a run-time memory leak detector.
2626 * [ MemorySanitizer] ( #memorysanitizer ) a detector of uninitialized reads.
27+ * [ RealtimeSanitizer] ( #realtimesanitizer ) a detector of calls to function with
28+ non-deterministic execution time in realtime contexts.
2729 * [ ThreadSanitizer] ( #threadsanitizer ) a fast data race detector.
2830
2931* Those that apart from testing, may be used in production:
@@ -43,11 +45,11 @@ This feature allows for use of one of following sanitizers:
4345
4446To enable a sanitizer compile with ` -Zsanitizer=address ` , ` -Zsanitizer=cfi ` ,
4547` -Zsanitizer=dataflow ` ,` -Zsanitizer=hwaddress ` , ` -Zsanitizer=leak ` ,
46- ` -Zsanitizer=memory ` , ` -Zsanitizer=memtag ` , ` -Zsanitizer=shadow-call-stack ` , or
47- ` -Zsanitizer=thread ` . You might also need the ` --target ` and ` build-std ` flags.
48- If you're working with other languages that are also instrumented with sanitizers,
49- you might need the ` external-clangrt ` flag. See the section on
50- [ working with other languages] ( #working-with-other-languages ) .
48+ ` -Zsanitizer=memory ` , ` -Zsanitizer=memtag ` , ` -Zsanitizer=realtime ` ,
49+ ` -Zsanitizer=shadow-call-stack ` or ` -Zsanitizer= thread` . You might also need the
50+ ` --target ` and ` build-std ` flags. If you're working with other languages that are also
51+ instrumented with sanitizers, you might need the ` external-clangrt ` flag. See
52+ the section on [ working with other languages] ( #working-with-other-languages ) .
5153
5254Example:
5355``` shell
@@ -865,6 +867,70 @@ WARNING: ThreadSanitizer: data race (pid=10574)
865867 Location is global ' example::A::h43ac149ddf992709' of size 8 at 0x5632dfe3d030 (example+0x000000bd9030)
866868` ` `
867869
870+ # RealtimeSanitizer
871+ RealtimeSanitizer detects non-deterministic execution time calls in real-time contexts.
872+ Functions marked with the ` # [sanitize(realtime = "nonblocking")]` attribute are considered real-time functions.
873+ When RTSan detects a call to a function with a non-deterministic execution time, like ` malloc` or ` free`
874+ while in a real-time context, it reports an error.
875+
876+ Besides " nonblocking" the attribute can also be used with " blocking" and " caller" .
877+ - " blocking" allows the programmer to mark their own functions as having a non-deterministic execution time.
878+ When reaching such a function while in a real-time context a violation will be reported. A typical use
879+ case is a userland spinlock.
880+ - functions marked with " caller" will be sanitized if they were called from a real-time context.
881+ If no attribute is set, this is the default. Between entering a " nonblocking" function and exiting that
882+ function again the program will get sanitized.
883+
884+ The santizer checks can be disabled using the external functions `__rtsan_disable ()` and ` __rtsan_enable()` .
885+ Each call to ` __rtsan_disable()` must be paired with one following call to ` __rtsan_enable()` , otherwise the behaviour is undefined.
886+
887+ ` ` ` rust
888+ unsafe extern " C" {
889+ fn __rtsan_disable ();
890+ fn __rtsan_enable ();
891+ }
892+ ` ` `
893+
894+ ` ` ` rust,ignore (log is just a example and doesn' t exist)
895+ // in a real-time context
896+ #[cfg(debug_assertions)]
897+ {
898+ unsafe { __rtsan_disable() };
899+ log!("logging xyz");
900+ unsafe { __rtsan_enable() };
901+ }
902+ ```
903+
904+ See the [Clang RealtimeSanitizer documentation][clang-rtsan] for more details.
905+
906+ ## Example
907+
908+ ```rust,no_run
909+ #![feature(sanitize)]
910+ #[sanitize(realtime = "nonblocking")]
911+ fn real_time() {
912+ let vec = vec![0, 1, 2]; // call to malloc is detected and reported as an error
913+ }
914+ ```
915+
916+ ```shell
917+ ==8670==ERROR: RealtimeSanitizer: unsafe-library-call
918+ Intercepted call to real-time unsafe function `malloc` in real-time context!
919+ #0 0x00010107b0d8 in malloc rtsan_interceptors_posix.cpp:792
920+ #1 0x000100d94e70 in alloc::alloc::Global::alloc_impl::h9e1fc3206c868eea+0xa0 (realtime_vec:arm64+0x100000e70)
921+ #2 0x000100d94d90 in alloc::alloc::exchange_malloc::hd45b5788339eb5c8+0x48 (realtime_vec:arm64+0x100000d90)
922+ #3 0x000100d95020 in realtime_vec::main::hea6bd69b03eb9ca1+0x24 (realtime_vec:arm64+0x100001020)
923+ #4 0x000100d94a28 in core::ops::function::FnOnce::call_once::h493b6cb9dd87d87c+0xc (realtime_vec:arm64+0x100000a28)
924+ #5 0x000100d949b8 in std::sys::backtrace::__rust_begin_short_backtrace::hfcddb06c73c19eea+0x8 (realtime_vec:arm64+0x1000009b8)
925+ #6 0x000100d9499c in std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::h202288c05a2064f0+0xc (realtime_vec:arm64+0x10000099c)
926+ #7 0x000100d9fa34 in std::rt::lang_start_internal::h6c763158a05ac05f+0x6c (realtime_vec:arm64+0x10000ba34)
927+ #8 0x000100d94980 in std::rt::lang_start::h1c29cc56df0598b4+0x38 (realtime_vec:arm64+0x100000980)
928+ #9 0x000100d95118 in main+0x20 (realtime_vec:arm64+0x100001118)
929+ #10 0x000183a46b94 in start+0x17b8 (dyld:arm64+0xfffffffffff3ab94)
930+
931+ SUMMARY: RealtimeSanitizer: unsafe-library-call rtsan_interceptors_posix.cpp:792 in malloc
932+ ```
933+
868934# Instrumentation of external dependencies and std
869935
870936The sanitizers to varying degrees work correctly with partially instrumented
@@ -918,6 +984,7 @@ Sanitizers produce symbolized stacktraces when llvm-symbolizer binary is in `PAT
918984* [MemorySanitizer in Clang][clang-msan]
919985* [MemTagSanitizer in LLVM][llvm-memtag]
920986* [ThreadSanitizer in Clang][clang-tsan]
987+ * [RealtimeSanitizer in Clang][clang-rtsan]
921988
922989[clang-asan]: https://clang.llvm.org/docs/AddressSanitizer.html
923990[clang-cfi]: https://clang.llvm.org/docs/ControlFlowIntegrity.html
@@ -926,6 +993,7 @@ Sanitizers produce symbolized stacktraces when llvm-symbolizer binary is in `PAT
926993[clang-kcfi]: https://clang.llvm.org/docs/ControlFlowIntegrity.html#fsanitize-kcfi
927994[clang-lsan]: https://clang.llvm.org/docs/LeakSanitizer.html
928995[clang-msan]: https://clang.llvm.org/docs/MemorySanitizer.html
996+ [clan-rtsan]: https://clang.llvm.org/docs/RealtimeSanitizer.html
929997[clang-safestack]: https://clang.llvm.org/docs/SafeStack.html
930998[clang-scs]: https://clang.llvm.org/docs/ShadowCallStack.html
931999[clang-tsan]: https://clang.llvm.org/docs/ThreadSanitizer.html
0 commit comments