<div dir="ltr"><div class="gmail_extra">It looks like you are running into the limits of what has been implemented for thread safety analysis.  It doesn't look like SCOPED_CAPABILITY supports unlocking and relocking the mutex.  In these cases, the usual way to use a locking class is to do something like:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">int main(int argc, char const *argv[]) {</div><div class="gmail_extra">  {</div><div class="gmail_extra">    unique_lock lock(mtx);</div><div class="gmail_extra">    any_number = 42;</div><div class="gmail_extra">  }</div><div class="gmail_extra">  int i = increment();</div><div class="gmail_extra">  </div><div class="gmail_extra">  unique_lock lock(mtx);</div><div class="gmail_extra">  return i;</div><div class="gmail_extra">}</div><div><br></div><div>The limitations section also says that it doesn't track pointer aliases:</div><div><a href="http://clang.llvm.org/docs/ThreadSafetyAnalysis.html#no-alias-analysis" target="_blank">http://clang.llvm.org/docs/<wbr>ThreadSafetyAnalysis.html#no-<wbr>alias-analysis</a><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 9, 2016 at 8:03 AM, christoph@ruediger.engineering <span dir="ltr"><<a href="mailto:christoph@ruediger.engineering" target="_blank">christoph@ruediger.engineerin<wbr>g</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Am 09.11.16, 01:32 schrieb "Richard Trieu" <<a href="mailto:rtrieu@google.com" target="_blank">rtrieu@google.com</a>>:<br>
<span><br>
><br>
><br>
>On Tue, Nov 8, 2016 at 10:54 AM, christoph@ruediger.engineering via cfe-dev<br>
><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>> wrote:<br>
><br>
>Sorry for the incomplete mail; hit the wrong shortcut. The mail continues down below.<br>
><br>
>Am 08.11.16, 19:38 schrieb "cfe-dev im Auftrag von<br>
</span>><a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a> <mailto:<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><wbr>>" <<a href="mailto:cfe-dev-bounces@lists.llvm.org" target="_blank">cfe-dev-bounces@lists.llvm.or<wbr>g</a> im Auftrag von<br>
<span>><a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>>:<br>
><br>
>>Hi everyone,<br>
>><br>
>>this is my first post to this list, so please remind me if I’m violating your netiquette in some way.<br>
>><br>
>>I’m trying to introduce the thread safety analysis to one of our projects and stumble upon the missing thread safety annotations for unique_lock. I thought this might be easy, so let’s provide a patch. But now I’m stuck with correctly annotating the move constructor<br>
> and the lock() and unlock() methods of unique_lock.<br>
>><br>
>>Here is a very basic implementation of my annotated unique_lock:<br>
>><br>
>>class SCOPED_CAPABILITY unique_lock {<br>
>>  ::bluebox::mutex *mu;<br>
>>  bool lock_held;<br>
>>public:<br>
>>  unique_lock() = delete;<br>
>>  unique_lock(unique_lock &&) = delete;   // We cannot annotate move semantics<br>
>><br>
>>  explicit unique_lock(::bluebox::mutex &m) ACQUIRE(m) : mu(&m), lock_held(true) { m.lock(); }<br>
>>  explicit unique_lock(::bluebox::mutex *m) ACQUIRE(m) : mu(m), lock_held(true) { m->lock(); }<br>
><br>
><br>
> Change this to ACQUIRE(mu) instead of ACQUIRE(m).  The ACQUIRE and RELEASE annotations need<br>
> to refer to the same variable for the thread safety analysis to work.<br>
<br>
</span>This doesn’t work either. When putting ACQUIRE(mu) in the constructor annotation, I get this error:<br>
<br>
$ clang++-3.8 -Wthread-safety -O0 -std=c++11 mutex.cpp<br>
mutex.cpp:65:12: warning: writing variable 'any_number' requires holding mutex 'mtx' exclusively [-Wthread-safety-analysis]<br>
  return ++any_number;<br>
           ^<br>
mutex.cpp:70:3: warning: writing variable 'any_number' requires holding mutex 'mtx' exclusively [-Wthread-safety-analysis]<br>
  any_number = 42;<br>
  ^<br>
2 warnings generated.<br>
<br>
I’ve put together a very minimalistic example which can be found at <a href="https://dl.dropboxusercontent.com/u/13595729/mutex.cpp" rel="noreferrer" target="_blank">https://dl.dropboxusercontent.<wbr>com/u/13595729/mutex.cpp</a><br>
<br>
The basic code fragment from the example is (with the mutex and unique locker as described in my previous mail):<br>
mutex mtx;<br>
int any_number GUARDED_BY(mtx) = 0;<br>
<br>
<br>
int increment() EXCLUDES(mtx) {<br>
  unique_lock lock(mtx);<br>
  return ++any_number;   // <- First warning here<br>
}<br>
<br>
int main(int argc, char const *argv[]) {<br>
  unique_lock lock(mtx);<br>
  any_number = 42;  // <- Second warning here<br>
  lock.unlock();<br>
  int i = increment();<br>
  lock.lock();<br>
  return i;<br>
}<br>
<br>
<br>
To me it looks like the analyzer does not get it that unique_lock::mu is essentially the same mutex as mtx.<br>
<br>
Just for reference, the warnings are exactly the same when using pointers instead of references in unique_lock.<br>
<span><br>
<br>
<br>
<br>
><br>
><br>
>><br>
>>  void unlock() RELEASE(mu) NO_THREAD_SAFETY_ANALYSIS {<br>
>>    if (lock_held) {<br>
>>      lock_held = false;<br>
>>      mu->unlock();<br>
>>    }<br>
>>  }<br>
>><br>
>>  void lock() ACQUIRE(mu) NO_THREAD_SAFETY_ANALYSIS {<br>
>>    if (!lock_held) {<br>
>>      mu->lock();<br>
>>      lock_held = true;<br>
>>    }<br>
>>  }<br>
>><br>
>>  ~unique_lock() RELEASE() NO_THREAD_SAFETY_ANALYSIS {<br>
>>    if (lock_held)<br>
>>      mu->unlock();<br>
>>  }<br>
>>};<br>
>><br>
>><br>
>>And this is my test case:<br>
>><br>
>>static std::mutex mtx;<br>
>>void someFunction() {<br>
>>  my::unique_lock lock(mtx);<br>
>>  // … Here you would normally do something meaningful<br>
>>  lock.unlock();<br>
>>  // … Call a method that might modify your protected data<br>
>>  lock.lock();<br>
>>  // … Continue with super important work<br>
>>}<br>
>><br>
>>And here is my list of issues I can’t get around with:<br>
>>1. How can I correctly annotate the unlock and lock methods? When using unlock() in the above example, clang throws this error: fatal error: releasing mutex<br>
</span>>>      '<a href="http://lock.mu" rel="noreferrer" target="_blank">lock.mu</a> <<a href="http://lock.mu" rel="noreferrer" target="_blank">http://lock.mu</a>>' that was not held [-Wthread-safety-analysis]<br>
<span>>>2. How can I correctly annotate the move constructor of unique_lock?<br>
><br>
><br>
><br>
>3. I couldn’t find really that much valuable information about the annotations except for the one page in the clang documentation and a talk from DeLesly Hutchins. Plus the information, that the guys at Google are making heavy use of the thread safety analyzer.<br>
> But are you really limiting yourself to std::mutex and std::lock_guard? You can’t even use std::condition_variable. Maybe one of the Google engineers on this list can shade some light without revealing confidential information.<br>
><br>
>With these first tests in mind, I’m having troubles to use this really helpful feature in my projects. Anybody who wants to share some experience is appreciated. I will try to update the documentation accordingly or provide any other help.<br>
><br>
>Thanks and regards,<br>
>Christoph<br>
><br>
>--<br>
>rüdiger.engineering<br>
>Christoph Rüdiger<br>
>Düsseldorfer Str. 12<br>
>45145 Essen<br>
>Germany<br>
><br>
</span>>phone: <a href="tel:%2B49%20201%20458%20478%2058" value="+4920145847858" target="_blank">+49 201 458 478 58</a> <tel:%2B49%20201%20458%20478%2<wbr>058><br>
<div class="m_-750788161315104643gmail-m_8898814563230886150HOEnZb"><div class="m_-750788161315104643gmail-m_8898814563230886150h5">>VAT ID/Ust. ID: DE304572498<br>
><br>
><br>
>_____________________________<wbr>__________________<br>
>cfe-dev mailing list<br>
><a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin<wbr>/mailman/listinfo/cfe-dev</a><br>
><br>
>_____________________________<wbr>__________________<br>
>cfe-dev mailing list<br>
><a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin<wbr>/mailman/listinfo/cfe-dev</a><br>
><br>
><br>
><br>
><br>
><br>
><br>
><br>
><br>
<br>
</div></div></blockquote></div><br></div></div>