Asan-poison padding regions in mjModel and mjData buffers.
This allows us to detect reads and writes that are logically out of bounds. PiperOrigin-RevId: 451520772 Change-Id: I614a8062c404d97148166bcd37db399420956d8b
This commit is contained in:
committed by
Copybara-Service
parent
185b79f664
commit
b5a6a725e5
@@ -27,6 +27,13 @@
|
|||||||
#include "engine/engine_util_errmem.h"
|
#include "engine/engine_util_errmem.h"
|
||||||
#include "engine/engine_vfs.h"
|
#include "engine/engine_vfs.h"
|
||||||
|
|
||||||
|
#ifdef ADDRESS_SANITIZER
|
||||||
|
#include <sanitizer/asan_interface.h>
|
||||||
|
#else
|
||||||
|
#define ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
|
||||||
|
#define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MEMORY_SANITIZER
|
#ifdef MEMORY_SANITIZER
|
||||||
#include <sanitizer/msan_interface.h>
|
#include <sanitizer/msan_interface.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -330,6 +337,7 @@ static void mj_setPtrModel(mjModel* m) {
|
|||||||
// assign pointers with padding
|
// assign pointers with padding
|
||||||
#define X(type, name, nr, nc) \
|
#define X(type, name, nr, nc) \
|
||||||
m->name = (type*)(ptr + SKIP((intptr_t)ptr, sizeof(type))); \
|
m->name = (type*)(ptr + SKIP((intptr_t)ptr, sizeof(type))); \
|
||||||
|
ASAN_POISON_MEMORY_REGION(ptr, PTRDIFF(m->name, ptr)); \
|
||||||
ptr += SKIP((intptr_t)ptr, sizeof(type)) + sizeof(type)*(m->nr)*(nc);
|
ptr += SKIP((intptr_t)ptr, sizeof(type)) + sizeof(type)*(m->nr)*(nc);
|
||||||
|
|
||||||
MJMODEL_POINTERS
|
MJMODEL_POINTERS
|
||||||
@@ -754,6 +762,7 @@ static void mj_setPtrData(const mjModel* m, mjData* d) {
|
|||||||
// assign pointers with padding
|
// assign pointers with padding
|
||||||
#define X(type, name, nr, nc) \
|
#define X(type, name, nr, nc) \
|
||||||
d->name = (type*)(ptr + SKIP((intptr_t)ptr, sizeof(type))); \
|
d->name = (type*)(ptr + SKIP((intptr_t)ptr, sizeof(type))); \
|
||||||
|
ASAN_POISON_MEMORY_REGION(ptr, PTRDIFF(d->name, ptr)); \
|
||||||
ptr += SKIP((intptr_t)ptr, sizeof(type)) + sizeof(type)*(m->nr)*(nc);
|
ptr += SKIP((intptr_t)ptr, sizeof(type)) + sizeof(type)*(m->nr)*(nc);
|
||||||
|
|
||||||
MJDATA_POINTERS
|
MJDATA_POINTERS
|
||||||
@@ -919,7 +928,16 @@ static void _resetData(const mjModel* m, mjData* d, unsigned char debug_value) {
|
|||||||
//------------------------------ clear buffer, set defaults
|
//------------------------------ clear buffer, set defaults
|
||||||
|
|
||||||
// fill buffer with debug_value (normally 0)
|
// fill buffer with debug_value (normally 0)
|
||||||
|
#ifdef ADDRESS_SANITIZER
|
||||||
|
{
|
||||||
|
#define X(type, name, nr, nc) memset(d->name, (int)debug_value, sizeof(type)*(m->nr)*(nc));
|
||||||
|
MJDATA_POINTERS_PREAMBLE(m)
|
||||||
|
MJDATA_POINTERS
|
||||||
|
#undef X
|
||||||
|
}
|
||||||
|
#else
|
||||||
memset(d->buffer, (int)debug_value, d->nbuffer);
|
memset(d->buffer, (int)debug_value, d->nbuffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MEMORY_SANITIZER
|
#ifdef MEMORY_SANITIZER
|
||||||
// Tell msan to treat the entire buffer as uninitialized
|
// Tell msan to treat the entire buffer as uninitialized
|
||||||
|
|||||||
Reference in New Issue
Block a user