<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>Hm, that does seem like a problem: </div><div><br></div><div><blockquote type="cite">pthread_mutex_lock(&(pNode->pIPCSocket->mutexHandle));<br>PushNodeMsg(pNode, pEvent); //lock + unlock other mutex<br>// send notify<br>pthread_cond_signal(&(pNode->pIPCSocket->condHandle));<br>pthread_mutex_unlock(&(pNode->pIPCSocket->mutexHandle));<br></blockquote><br></div><div>The analyzer is being careful in saying that <i>maybe</i> PushNodeMsg could modify the mutexHandle via pNode, but unfortunately the PthreadLockChecker doesn't react to that. Please file a bug at <a href="http://llvm.org/bugs/">http://llvm.org/bugs/</a> with a self-contained test case (or at least a preprocessed file); alternately, patches welcome. The general idea would be to add a checkDeadSymbols callback and replace any now-invalidated lock symbols with placeholders, or something similar.</div><div><br></div><div>Problems like this this are why it's still marked as an alpha checker. Hopefully someone will have time to clean it up at some point.</div><div><br></div><div>Thanks for tracking this down!</div><div>Jordan</div><div><br></div><br><div><div>On Nov 23, 2013, at 4:37 , Jean Lee <<a href="mailto:xiaoyur347@gmail.com">xiaoyur347@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Platform: ubuntu 12.04 i386 + clang 3.4 rc1(built by myself). Also in clang 3.3<br>Checker:-enable-checker alpha.unix.PthreadLock<br>The checker located in<br>llvm/tools/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp<br><br>I find the checker has false positive for "This was not the most<br>recently acquired lock. Possible lock order reversal".<br>Code is as follows:<br>pthread_mutex_lock(&(pNode->pIPCSocket->mutexHandle));<br>PushNodeMsg(pNode, pEvent); //lock + unlock other mutex<br>// send notify<br>pthread_cond_signal(&(pNode->pIPCSocket->condHandle));<br>pthread_mutex_unlock(&(pNode->pIPCSocket->mutexHandle));<br><br>I debug it myself with my modification listed in attached file and find<br>/opt/evpp/cbb/evideo/commu/ipc/trunk/src/ipc.c:502:9: warning: This<br>was not the most recently acquired lock. Possible lock order reversal<br>208741436 SymRegion{derived_$133{conj_$132{int},SymRegion{reg_$115<SymRegion{reg_$67<SymRegion{reg_$12<g_pNodeHead>}->pNext>}->pNext>}->pIPCSocket}}->mutexHandle<br>208753604 SymRegion{derived_$136{conj_$135{int},SymRegion{reg_$115<SymRegion{reg_$67<SymRegion{reg_$12<g_pNodeHead>}->pNext>}->pNext>}->pIPCSocket}}->mutexHandle<br>[0]SymRegion{derived_$133{conj_$132{int},SymRegion{reg_$115<SymRegion{reg_$67<SymRegion{reg_$12<g_pNodeHead>}->pNext>}->pNext>}->pIPCSocket}}->mutexHandle<br><br>I think maybe it is ugly to use<br>pthread_mutex_lock(&(pNode->pIPCSocket->mutexHandle));<br>...<br>pthread_mutex_unlock(&(pNode->pIPCSocket->mutexHandle));<br>and there is no false positive if I modify to<br>pthread_mutex_lock(&(pIPCSocket->mutexHandle));<br>...<br>pthread_mutex_unlock(&(pIPCSocket->mutexHandle));<br><br>So, I guess the code(PthreadLockChecker.cpp)<br>const MemRegion *firstLockR = LS.getHead();<br>  if (firstLockR != lockR) {<br>    //This was not the most recently acquired lock. Possible lock order reversal<br>  }<br>is insuffient.<br></blockquote></div></body></html>