diff --git a/docs/xml/manual-core-adv.xml b/docs/xml/manual-core-adv.xml
index 9263c5db3..fcbe03768 100644
--- a/docs/xml/manual-core-adv.xml
+++ b/docs/xml/manual-core-adv.xml
@@ -200,7 +200,14 @@ tool-specific macros).
client programs.
Warning: Only use these if you
- really know what you are doing.
+ really know what you are doing. They aren't
+ entirely reliable, and can cause Valgrind to crash.
+ Generally, your prospects of these working are made higher if the called
+ function does not refer to any global variables, and does not refer to any
+ libc or other functions (printf et al). Any kind of entanglement with libc
+ or dynamic linking is likely to have a bad outcome, for tricky reasons
+ which we've grappled with a lot in the past.
+
diff --git a/include/valgrind.h b/include/valgrind.h
index f18cc97e3..47f369b11 100644
--- a/include/valgrind.h
+++ b/include/valgrind.h
@@ -3715,6 +3715,15 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
Word f(Word tid, Word arg1, Word arg2)
where "Word" is a word-sized type.
+
+ Note that these client requests are not entirely reliable. For example,
+ if you call a function with them that subsequently calls printf(),
+ there's a high chance Valgrind will crash. Generally, your prospects of
+ these working are made higher if the called function does not refer to
+ any global variables, and does not refer to any libc or other functions
+ (printf et al). Any kind of entanglement with libc or dynamic linking is
+ likely to have a bad outcome, for tricky reasons which we've grappled
+ with a lot in the past.
*/
#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
__extension__ \