Commit e8d1e730 authored by Rusty Russell's avatar Rusty Russell

mem: add memcheck() for valgrind.

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 1b7100ad
...@@ -227,4 +227,39 @@ static inline bool memoverlaps(const void *a_, size_t al, ...@@ -227,4 +227,39 @@ static inline bool memoverlaps(const void *a_, size_t al,
*/ */
void memswap(void *a, void *b, size_t n); void memswap(void *a, void *b, size_t n);
#if HAVE_VALGRIND_MEMCHECK_H
#include <valgrind/memcheck.h>
static inline void *memcheck_(const void *data, size_t len)
{
VALGRIND_CHECK_MEM_IS_DEFINED(data, len);
return (void *)data;
}
#else
static inline void *memcheck_(const void *data, size_t len)
{
return (void *)data;
}
#endif
#if HAVE_TYPEOF
/**
* memcheck - check that a memory region is initialized
* @data: start of region
* @len: length in bytes
*
* When running under valgrind, this causes an error to be printed
* if the entire region is not defined. Otherwise valgrind only
* reports an error when an undefined value is used for a branch, or
* written out.
*
* Example:
* // Search for space, but make sure it's all initialized.
* if (memchr(memcheck(somebytes, bytes_len), ' ', bytes_len)) {
* printf("space was found!\n");
* }
*/
#define memcheck(data, len) ((__typeof__((data)+0))memcheck_((data), (len)))
#else
#define memcheck(data, len) memcheck_((data), (len))
#endif
#endif /* CCAN_MEM_H */ #endif /* CCAN_MEM_H */
#include "config.h"
#include <assert.h>
#include <ccan/mem/mem.h>
#include <ccan/tap/tap.h>
int main(void)
{
char haystack[] = "abcd\0efgh";
char *p;
const char *pc;
/* This is how many tests you plan to run */
plan_tests(4);
p = memcheck(haystack, sizeof(haystack));
ok1(p == haystack);
pc = memcheck(haystack, sizeof(haystack));
ok1(pc == haystack);
p = memcheck(p, sizeof(haystack));
ok1(p == haystack);
pc = memcheck(pc, sizeof(haystack));
ok1(pc == haystack);
/* This exits depending on whether all tests passed */
return exit_status();
}
#include "config.h"
#include <assert.h>
#include <ccan/mem/mem.h>
int main(void)
{
const char *haystack = "abcd\0efgh";
char *p;
#ifdef FAIL
#if !HAVE_TYPEOF
#error "Can't fail without typeof"
#else
/* Should catch const discard errors. */
p = memcheck(haystack, sizeof(haystack));
#endif
#else
p = memcheck((char *)haystack, sizeof(haystack));
#endif
return p == haystack ? 0 : 1;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment