[PATCH] D51187: [RFC] Thread safety analysis: Track status of scoped capability

Aaron Puchert via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 20 17:45:27 PDT 2018


aaronpuchert added a comment.

Thanks for pointing out my error! Ignoring the implementation for a moment, do you think this is a good idea or will it produce to many false positives? Releasable/relockable scoped capabilities that I have seen keep track of the status, so it makes sense, but maybe there are others out there.



================
Comment at: lib/Analysis/ThreadSafety.cpp:929
+      return Handler.handleDoubleLock(DiagKind, entry.toString(), entry.loc());
+    Locked = true;
+
----------------
delesley wrote:
> It's been a while since I last looked at this code, but I don't think you can use mutable fields in a FactEntry.  The analysis creates a FactSet for each program point, but each FactSet simply has pointers (FactIDs) for the underlying FactEntries.  If you change the definition of a FactEntry, it will change that definition for every program point.  So if you do an unlock on one side of a branch, and change the underlying FactEntry to reflect that, then analysis will then think you have also done the unlock on the other side of the branch.  
> 
> Any changes should always be done by adding or removing entries from the FactSet, not by mutating the underlying FactEntries.
> 
That explains why there are problems with back edges. Now that you say it I'm actually aware of how the `FactManager` and `FactSet` work, but apparently I didn't consider that here.

Would you mind if I make a separate change that returns only `const FactEntry*` from the `FactManager`? Maybe that makes it harder to write wrong code in the future.


Repository:
  rC Clang

https://reviews.llvm.org/D51187





More information about the cfe-commits mailing list