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)


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Valgrind-developers mailing list
Valgrind-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-developers

Reply via email to