|
From: <sv...@va...> - 2008-02-28 08:30:41
|
Author: bart
Date: 2008-02-28 08:30:43 +0000 (Thu, 28 Feb 2008)
New Revision: 7497
Log:
Added support for recognizing invalid mutexes.
Modified:
trunk/exp-drd/drd_clientreq.h
trunk/exp-drd/drd_intercepts.c
trunk/exp-drd/drd_mutex.c
trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp
trunk/exp-drd/tests/tc20_verifywrap.stderr.exp
Modified: trunk/exp-drd/drd_clientreq.h
===================================================================
--- trunk/exp-drd/drd_clientreq.h 2008-02-28 07:36:04 UTC (rev 7496)
+++ trunk/exp-drd/drd_clientreq.h 2008-02-28 08:30:43 UTC (rev 7497)
@@ -119,6 +119,7 @@
typedef enum
{
+ mutex_type_invalid_mutex = 0,
mutex_type_recursive_mutex = 1,
mutex_type_errorcheck_mutex = 2,
mutex_type_default_mutex = 3,
Modified: trunk/exp-drd/drd_intercepts.c
===================================================================
--- trunk/exp-drd/drd_intercepts.c 2008-02-28 07:36:04 UTC (rev 7496)
+++ trunk/exp-drd/drd_intercepts.c 2008-02-28 08:30:43 UTC (rev 7497)
@@ -100,18 +100,8 @@
case PTHREAD_MUTEX_DEFAULT:
case PTHREAD_MUTEX_ADAPTIVE_NP:
return mutex_type_default_mutex;
-#if 0
- case -1:
- printf("Warning: changed mutex type from -1 into %d\n",
- mutex_type_default_mutex);
- return mutex_type_default_mutex;
-#endif
}
-#if 0
- printf("mutex->__data.__kind = %d\n", kind);
- assert(0);
-#endif
- return mutex_type_default_mutex;
+ return mutex_type_invalid_mutex;
}
static MutexT mutex_type(pthread_mutex_t* mutex)
Modified: trunk/exp-drd/drd_mutex.c
===================================================================
--- trunk/exp-drd/drd_mutex.c 2008-02-28 07:36:04 UTC (rev 7496)
+++ trunk/exp-drd/drd_mutex.c 2008-02-28 08:30:43 UTC (rev 7497)
@@ -251,12 +251,15 @@
*/
void mutex_pre_lock(const Addr mutex, const SizeT size, MutexT mutex_type)
{
- struct mutex_info* p = mutex_get(mutex);
+ struct mutex_info* p;
+
+ p = mutex_get(mutex);
if (p == 0)
{
mutex_init(mutex, size, mutex_type);
p = mutex_get(mutex);
}
+
tl_assert(p);
if (p->owner == thread_get_running_tid()
@@ -295,6 +298,16 @@
p ? p->owner : VG_INVALID_THREADID);
}
+ if (mutex_type == mutex_type_invalid_mutex)
+ {
+ GenericErrInfo GEI;
+ VG_(maybe_record_error)(VG_(get_running_tid)(),
+ GenericErr,
+ VG_(get_IP)(VG_(get_running_tid)()),
+ "Invalid mutex",
+ &GEI);
+ }
+
if (p == 0)
{
GenericErrInfo GEI;
@@ -368,6 +381,16 @@
p->owner);
}
+ if (mutex_type == mutex_type_invalid_mutex)
+ {
+ GenericErrInfo GEI;
+ VG_(maybe_record_error)(VG_(get_running_tid)(),
+ GenericErr,
+ VG_(get_IP)(VG_(get_running_tid)()),
+ "Invalid mutex",
+ &GEI);
+ }
+
if (p == 0)
{
GenericErrInfo GEI;
@@ -448,6 +471,8 @@
{
switch (mt)
{
+ case mutex_type_invalid_mutex:
+ return "invalid mutex";
case mutex_type_recursive_mutex:
return "recursive mutex";
case mutex_type_errorcheck_mutex:
Modified: trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp
===================================================================
--- trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp 2008-02-28 07:36:04 UTC (rev 7496)
+++ trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp 2008-02-28 08:30:43 UTC (rev 7497)
@@ -13,6 +13,11 @@
by 0x........: clone (in /...libc...)
Thread 1:
+Invalid mutex
+ at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
+ by 0x........: nearly_main (tc09_bad_unlock.c:41)
+ by 0x........: main (tc09_bad_unlock.c:49)
+
Not a mutex
at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
by 0x........: nearly_main (tc09_bad_unlock.c:41)
@@ -32,9 +37,14 @@
by 0x........: clone (in /...libc...)
Thread 1:
+Invalid mutex
+ at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
+ by 0x........: nearly_main (tc09_bad_unlock.c:41)
+ by 0x........: main (tc09_bad_unlock.c:50)
+
Not a mutex
at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
by 0x........: nearly_main (tc09_bad_unlock.c:41)
by 0x........: main (tc09_bad_unlock.c:50)
-ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 0 from 0)
+ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 0 from 0)
Modified: trunk/exp-drd/tests/tc20_verifywrap.stderr.exp
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap.stderr.exp 2008-02-28 07:36:04 UTC (rev 7496)
+++ trunk/exp-drd/tests/tc20_verifywrap.stderr.exp 2008-02-28 08:30:43 UTC (rev 7497)
@@ -24,6 +24,10 @@
at 0x........: pthread_mutex_destroy (drd_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:102)
+Invalid mutex
+ at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:125)
+
Mutex not locked: address 0x........, recursion count 0, owner 0.
at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:125)
@@ -67,4 +71,4 @@
Destroying locked mutex: address 0x........, recursion count 1, owner 1.
at 0x........: main (tc20_verifywrap.c:261)
-ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 0 from 0)
+ERROR SUMMARY: 7 errors from 7 contexts (suppressed: 0 from 0)
|