@@ -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,47 @@ 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 realtime contexts.
872
+ Usafe of RTSan is on a function-by-function basis. The sanitizer only inspects code that
873
+ is marked as being real-time sensitive. This is done with the ` sanitize` attribute.
874
+ Any function that is subject to real-time contraints should be marked with ` # [sanitize(realtime = "on")]` .
875
+
876
+ Besides " on" the attribute can also be used with " off" and " blocking" . " off" disables the sanitizer for
877
+ this function. Not real-time sensitive operations in this function aren't detected anymore.
878
+ " blocking" marks the function as having a non-deterministic execution time. When reaching such a function
879
+ while in a real-time context a violation will be reported.
880
+
881
+ See the [Clang RealtimeSanitizer documentation][clang-rtsan] for more details.
882
+
883
+ # # Example
884
+
885
+ ` ` ` rust
886
+ # [sanitize(realtime = "on")]
887
+ fn main () {
888
+ let vec = vec! [0, 1, 2];
889
+ println! (" alloc not detected" )
890
+ }
891
+ ` ` `
892
+
893
+ ` ` ` shell
894
+ ==8670==ERROR: RealtimeSanitizer: unsafe-library-call
895
+ Intercepted call to real-time unsafe function `malloc` in real-time context!
896
+ # 0 0x00010107b0d8 in malloc rtsan_interceptors_posix.cpp:792
897
+ # 1 0x000100d94e70 in alloc::alloc::Global::alloc_impl::h9e1fc3206c868eea+0xa0 (realtime_vec:arm64+0x100000e70)
898
+ # 2 0x000100d94d90 in alloc::alloc::exchange_malloc::hd45b5788339eb5c8+0x48 (realtime_vec:arm64+0x100000d90)
899
+ # 3 0x000100d95020 in realtime_vec::main::hea6bd69b03eb9ca1+0x24 (realtime_vec:arm64+0x100001020)
900
+ # 4 0x000100d94a28 in core::ops::function::FnOnce::call_once::h493b6cb9dd87d87c+0xc (realtime_vec:arm64+0x100000a28)
901
+ # 5 0x000100d949b8 in std::sys::backtrace::__rust_begin_short_backtrace::hfcddb06c73c19eea+0x8 (realtime_vec:arm64+0x1000009b8)
902
+ # 6 0x000100d9499c in std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::h202288c05a2064f0+0xc (realtime_vec:arm64+0x10000099c)
903
+ # 7 0x000100d9fa34 in std::rt::lang_start_internal::h6c763158a05ac05f+0x6c (realtime_vec:arm64+0x10000ba34)
904
+ # 8 0x000100d94980 in std::rt::lang_start::h1c29cc56df0598b4+0x38 (realtime_vec:arm64+0x100000980)
905
+ # 9 0x000100d95118 in main+0x20 (realtime_vec:arm64+0x100001118)
906
+ # 10 0x000183a46b94 in start+0x17b8 (dyld:arm64+0xfffffffffff3ab94)
907
+
908
+ SUMMARY: RealtimeSanitizer: unsafe-library-call rtsan_interceptors_posix.cpp:792 in malloc
909
+ ` ` `
910
+
868
911
# Instrumentation of external dependencies and std
869
912
870
913
The sanitizers to varying degrees work correctly with partially instrumented
@@ -918,6 +961,7 @@ Sanitizers produce symbolized stacktraces when llvm-symbolizer binary is in `PAT
918
961
* [MemorySanitizer in Clang][clang-msan]
919
962
* [MemTagSanitizer in LLVM][llvm-memtag]
920
963
* [ThreadSanitizer in Clang][clang-tsan]
964
+ * [RealtimeSanitizer in Clang][clang-rtsan]
921
965
922
966
[clang-asan]: https://clang.llvm.org/docs/AddressSanitizer.html
923
967
[clang-cfi]: https://clang.llvm.org/docs/ControlFlowIntegrity.html
@@ -926,6 +970,7 @@ Sanitizers produce symbolized stacktraces when llvm-symbolizer binary is in `PAT
926
970
[clang-kcfi]: https://clang.llvm.org/docs/ControlFlowIntegrity.html#fsanitize-kcfi
927
971
[clang-lsan]: https://clang.llvm.org/docs/LeakSanitizer.html
928
972
[clang-msan]: https://clang.llvm.org/docs/MemorySanitizer.html
973
+ [clan-rtsan]: https://clang.llvm.org/docs/RealtimeSanitizer.html
929
974
[clang-safestack]: https://clang.llvm.org/docs/SafeStack.html
930
975
[clang-scs]: https://clang.llvm.org/docs/ShadowCallStack.html
931
976
[clang-tsan]: https://clang.llvm.org/docs/ThreadSanitizer.html
0 commit comments