summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2021-08-27 09:02:03 -0500
committerDamien George <damien@micropython.org>2022-12-08 14:29:22 +1100
commit84071590b3d76a647fe9cd9055a089605fedc219 (patch)
treef76c2c4aa4a3f8acfc7c28a669ae0ad762001888 /py
parent2283b6d68fe77b72e7beeb1bf24778834231b190 (diff)
py/gc: Avoid valgrind false positives.
When you want to use the valgrind memory analysis tool on MicroPython, you can arrange to define MICROPY_DEBUG_VALGRIND to enable use of special valgrind macros. For now, this only fixes `gc_get_ptr` so that it never emits the diagnostic "Conditional jump or move depends on uninitialised value(s)". Signed-off-by: Jeff Epler <jepler@gmail.com>
Diffstat (limited to 'py')
-rw-r--r--py/gc.c9
-rw-r--r--py/mpconfig.h5
2 files changed, 14 insertions, 0 deletions
diff --git a/py/gc.c b/py/gc.c
index 120213783..7ed60fe2c 100644
--- a/py/gc.c
+++ b/py/gc.c
@@ -32,6 +32,10 @@
#include "py/gc.h"
#include "py/runtime.h"
+#if MICROPY_DEBUG_VALGRIND
+#include <valgrind/memcheck.h>
+#endif
+
#if MICROPY_ENABLE_GC
#if MICROPY_DEBUG_VERBOSE // print debugging info
@@ -449,6 +453,11 @@ void gc_collect_start(void) {
__attribute__((no_sanitize_address))
#endif
static void *gc_get_ptr(void **ptrs, int i) {
+ #if MICROPY_DEBUG_VALGRIND
+ if (!VALGRIND_CHECK_MEM_IS_ADDRESSABLE(&ptrs[i], sizeof(*ptrs))) {
+ return NULL;
+ }
+ #endif
return ptrs[i];
}
diff --git a/py/mpconfig.h b/py/mpconfig.h
index 765a8f45c..564580c02 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -510,6 +510,11 @@
#define MICROPY_DEBUG_VM_STACK_OVERFLOW (0)
#endif
+// Whether to enable extra instrumentation for valgrind
+#ifndef MICROPY_DEBUG_VALGRIND
+#define MICROPY_DEBUG_VALGRIND (0)
+#endif
+
/*****************************************************************************/
/* Optimisations */