@@ -24,6 +24,8 @@ This feature allows for use of one of following sanitizers:
24
24
AddressSanitizer, but based on partial hardware assistance.
25
25
* [ LeakSanitizer] ( #leaksanitizer ) a run-time memory leak detector.
26
26
* [ MemorySanitizer] ( #memorysanitizer ) a detector of uninitialized reads.
27
+ * [ RealtimeSanitizer] ( #realtimesanitizer ) a detector of functions with
28
+ non-deterministic execution time in realtime contexts.
27
29
* [ ThreadSanitizer] ( #threadsanitizer ) a fast data race detector.
28
30
29
31
* Those that apart from testing, may be used in production:
@@ -43,11 +45,11 @@ This feature allows for use of one of following sanitizers:
43
45
44
46
To enable a sanitizer compile with ` -Zsanitizer=address ` , ` -Zsanitizer=cfi ` ,
45
47
` -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 ) .
51
53
52
54
Example:
53
55
``` shell
@@ -865,6 +867,58 @@ WARNING: ThreadSanitizer: data race (pid=10574)
865
867
Location is global ' example::A::h43ac149ddf992709' of size 8 at 0x5632dfe3d030 (example+0x000000bd9030)
866
868
` ` `
867
869
870
+ # RealtimeSanitizer
871
+ RealtimeSanitizer detects non-deterministic execution time calls in real-time contexts.
872
+ Function marked with the ` # [sanitize(realtime = "nonblocking")]` attribute are considered real-time functions.
873
+ When RTSan detets a call to a function with 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" marks the function as having a non-deterministic execution time. When reaching such
878
+ a function while in a real-time context a violation will be reported.
879
+ - " caller" is the default if no attribute is present, but can also be set explicitly. These functions
880
+ will be sanitized if called from a function that was being sanitized and will not be sanitized if called
881
+ from a function not sanitized. So a function could be both sanitized and not sanitized in one program execution.
882
+
883
+ The sanitizer can be disabled using the external function `__rtsan_disable()`. It can be enabled again using
884
+ `__rtsan_enable ()` . Entering a real-time context while the sanitizer is enabled is not possible.
885
+
886
+ ` ` ` rust
887
+ unsafe extern " C" {
888
+ fn __rtsan_disable ();
889
+ fn __rtsan_enable ();
890
+ }
891
+ ` ` `
892
+
893
+ See the [Clang RealtimeSanitizer documentation][clang-rtsan] for more details.
894
+
895
+ # # Example
896
+
897
+ ` ` ` rust
898
+ # [sanitize(realtime = "nonblocking")]
899
+ fn main () {
900
+ let vec = vec! [0, 1, 2]; // call to alloc is detected and reported as an error
901
+ }
902
+ ` ` `
903
+
904
+ ` ` ` shell
905
+ ==8670==ERROR: RealtimeSanitizer: unsafe-library-call
906
+ Intercepted call to real-time unsafe function `malloc` in real-time context!
907
+ # 0 0x00010107b0d8 in malloc rtsan_interceptors_posix.cpp:792
908
+ # 1 0x000100d94e70 in alloc::alloc::Global::alloc_impl::h9e1fc3206c868eea+0xa0 (realtime_vec:arm64+0x100000e70)
909
+ # 2 0x000100d94d90 in alloc::alloc::exchange_malloc::hd45b5788339eb5c8+0x48 (realtime_vec:arm64+0x100000d90)
910
+ # 3 0x000100d95020 in realtime_vec::main::hea6bd69b03eb9ca1+0x24 (realtime_vec:arm64+0x100001020)
911
+ # 4 0x000100d94a28 in core::ops::function::FnOnce::call_once::h493b6cb9dd87d87c+0xc (realtime_vec:arm64+0x100000a28)
912
+ # 5 0x000100d949b8 in std::sys::backtrace::__rust_begin_short_backtrace::hfcddb06c73c19eea+0x8 (realtime_vec:arm64+0x1000009b8)
913
+ # 6 0x000100d9499c in std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::h202288c05a2064f0+0xc (realtime_vec:arm64+0x10000099c)
914
+ # 7 0x000100d9fa34 in std::rt::lang_start_internal::h6c763158a05ac05f+0x6c (realtime_vec:arm64+0x10000ba34)
915
+ # 8 0x000100d94980 in std::rt::lang_start::h1c29cc56df0598b4+0x38 (realtime_vec:arm64+0x100000980)
916
+ # 9 0x000100d95118 in main+0x20 (realtime_vec:arm64+0x100001118)
917
+ # 10 0x000183a46b94 in start+0x17b8 (dyld:arm64+0xfffffffffff3ab94)
918
+
919
+ SUMMARY: RealtimeSanitizer: unsafe-library-call rtsan_interceptors_posix.cpp:792 in malloc
920
+ ` ` `
921
+
868
922
# Instrumentation of external dependencies and std
869
923
870
924
The sanitizers to varying degrees work correctly with partially instrumented
@@ -918,6 +972,7 @@ Sanitizers produce symbolized stacktraces when llvm-symbolizer binary is in `PAT
918
972
* [MemorySanitizer in Clang][clang-msan]
919
973
* [MemTagSanitizer in LLVM][llvm-memtag]
920
974
* [ThreadSanitizer in Clang][clang-tsan]
975
+ * [RealtimeSanitizer in Clang][clang-rtsan]
921
976
922
977
[clang-asan]: https://clang.llvm.org/docs/AddressSanitizer.html
923
978
[clang-cfi]: https://clang.llvm.org/docs/ControlFlowIntegrity.html
@@ -926,6 +981,7 @@ Sanitizers produce symbolized stacktraces when llvm-symbolizer binary is in `PAT
926
981
[clang-kcfi]: https://clang.llvm.org/docs/ControlFlowIntegrity.html#fsanitize-kcfi
927
982
[clang-lsan]: https://clang.llvm.org/docs/LeakSanitizer.html
928
983
[clang-msan]: https://clang.llvm.org/docs/MemorySanitizer.html
984
+ [clan-rtsan]: https://clang.llvm.org/docs/RealtimeSanitizer.html
929
985
[clang-safestack]: https://clang.llvm.org/docs/SafeStack.html
930
986
[clang-scs]: https://clang.llvm.org/docs/ShadowCallStack.html
931
987
[clang-tsan]: https://clang.llvm.org/docs/ThreadSanitizer.html
0 commit comments