|
From: <sv...@va...> - 2011-03-13 09:08:18
|
Author: bart
Date: 2011-03-13 09:08:10 +0000 (Sun, 13 Mar 2011)
New Revision: 11640
Log:
DRD: Report an error if --free-is-write=yes is used on a program invoking custom memory allocator client requests.
Modified:
trunk/drd/drd_clientreq.c
trunk/drd/drd_clientreq.h
trunk/drd/drd_main.c
Modified: trunk/drd/drd_clientreq.c
===================================================================
--- trunk/drd/drd_clientreq.c 2011-03-13 09:04:21 UTC (rev 11639)
+++ trunk/drd/drd_clientreq.c 2011-03-13 09:08:10 UTC (rev 11640)
@@ -45,6 +45,11 @@
#include "pub_tool_tooliface.h" // VG_(needs_...)()
+/* Global variables. */
+
+Bool DRD_(g_free_is_write);
+
+
/* Local function declarations. */
static Bool handle_client_request(ThreadId vg_tid, UWord* arg, UWord* ret);
@@ -76,6 +81,18 @@
switch (arg[0])
{
case VG_USERREQ__MALLOCLIKE_BLOCK:
+ if (DRD_(g_free_is_write)) {
+ GenericErrInfo GEI = {
+ .tid = DRD_(thread_get_running_tid)(),
+ .addr = 0,
+ };
+ VG_(maybe_record_error)(vg_tid,
+ GenericErr,
+ VG_(get_IP)(vg_tid),
+ "--free-is-write=yes is incompatible with"
+ " custom memory allocator client requests",
+ &GEI);
+ }
if (arg[1])
DRD_(malloclike_block)(vg_tid, arg[1]/*addr*/, arg[2]/*size*/);
break;
Modified: trunk/drd/drd_clientreq.h
===================================================================
--- trunk/drd/drd_clientreq.h 2011-03-13 09:04:21 UTC (rev 11639)
+++ trunk/drd/drd_clientreq.h 2011-03-13 09:08:10 UTC (rev 11640)
@@ -258,6 +258,8 @@
} BarrierT;
+extern Bool DRD_(g_free_is_write);
+
void DRD_(clientreq_init)(void);
Modified: trunk/drd/drd_main.c
===================================================================
--- trunk/drd/drd_main.c 2011-03-13 09:04:21 UTC (rev 11639)
+++ trunk/drd/drd_main.c 2011-03-13 09:08:10 UTC (rev 11640)
@@ -57,11 +57,10 @@
/* Local variables. */
-static Bool s_free_is_write = False;
-static Bool s_print_stats = False;
-static Bool s_var_info = False;
-static Bool s_show_stack_usage = False;
-static Bool s_trace_alloc = False;
+static Bool s_print_stats;
+static Bool s_var_info;
+static Bool s_show_stack_usage;
+static Bool s_trace_alloc;
/**
@@ -95,7 +94,7 @@
if VG_BOOL_CLO(arg, "--check-stack-var", check_stack_accesses) {}
else if VG_BOOL_CLO(arg, "--drd-stats", s_print_stats) {}
else if VG_BOOL_CLO(arg, "--first-race-only", first_race_only) {}
- else if VG_BOOL_CLO(arg, "--free-is-write", s_free_is_write) {}
+ else if VG_BOOL_CLO(arg, "--free-is-write", DRD_(g_free_is_write)) {}
else if VG_BOOL_CLO(arg,"--report-signal-unlocked",report_signal_unlocked)
{}
else if VG_BOOL_CLO(arg, "--segment-merging", segment_merging) {}
@@ -312,7 +311,7 @@
a1, len, DRD_(running_thread_inside_pthread_create)()
? " (inside pthread_create())" : "");
- if (!is_stack_mem && s_free_is_write)
+ if (!is_stack_mem && DRD_(g_free_is_write))
DRD_(thread_stop_using_mem)(a1, a2);
if (UNLIKELY(DRD_(any_address_is_traced)()))
@@ -357,9 +356,9 @@
if (!is_stack_mem || DRD_(get_check_stack_accesses)())
{
- if (is_stack_mem || !s_free_is_write)
+ if (is_stack_mem || !DRD_(g_free_is_write))
DRD_(thread_stop_using_mem)(a1, a2);
- else if (s_free_is_write)
+ else if (DRD_(g_free_is_write))
DRD_(trace_store)(a1, len);
DRD_(clientobj_stop_using_mem)(a1, a2);
DRD_(suppression_stop_using_mem)(a1, a2);
|