diff options
| author | DeLesley Hutchins <delesley@google.com> | 2013-11-06 18:40:01 +0000 |
|---|---|---|
| committer | DeLesley Hutchins <delesley@google.com> | 2013-11-06 18:40:01 +0000 |
| commit | 05b7b37021b3601ff890e3697bfb9ba905a765e0 (patch) | |
| tree | 1796ee48b89f2b1f20c0966a841f6da1e3aea34f /clang | |
| parent | f682f5301212c58ca501cb4092a1dd59c43b80ea (diff) | |
| download | bcm5719-llvm-05b7b37021b3601ff890e3697bfb9ba905a765e0.tar.gz bcm5719-llvm-05b7b37021b3601ff890e3697bfb9ba905a765e0.zip | |
Thread safety analysis: minor bugfix to smart pointer handling, and expanded
test case.
llvm-svn: 194157
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Analysis/ThreadSafety.cpp | 9 | ||||
| -rw-r--r-- | clang/test/SemaCXX/warn-thread-safety-analysis.cpp | 42 |
2 files changed, 41 insertions, 10 deletions
diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp index 607526db3e5..df163aaf6d6 100644 --- a/clang/lib/Analysis/ThreadSafety.cpp +++ b/clang/lib/Analysis/ThreadSafety.cpp @@ -2137,14 +2137,15 @@ void BuildLockset::VisitCallExpr(CallExpr *Exp) { case OO_Star: case OO_Arrow: { if (Analyzer->Handler.issueBetaWarnings()) { - const Expr *Target = OE->getArg(0); - checkPtAccess(Target, AK_Read); + const Expr *Obj = OE->getArg(0); + checkAccess(Obj, AK_Read); + checkPtAccess(Obj, AK_Read); } break; } default: { - const Expr *Source = OE->getArg(0); - checkAccess(Source, AK_Read); + const Expr *Obj = OE->getArg(0); + checkAccess(Obj, AK_Read); break; } } diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp index 8ea411325fb..fc99456fdf1 100644 --- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -4213,14 +4213,44 @@ class PtGuardedBySanityTest { class SmartPtr_PtGuardedBy_Test { + Mutex mu1; Mutex mu2; - SmartPtr<int> sp PT_GUARDED_BY(mu2); - SmartPtr<Cell> sq PT_GUARDED_BY(mu2); + SmartPtr<int> sp GUARDED_BY(mu1) PT_GUARDED_BY(mu2); + SmartPtr<Cell> sq GUARDED_BY(mu1) PT_GUARDED_BY(mu2); - void test() { - sp.get(); // OK -- no GUARDED_BY - *sp = 0; // expected-warning {{reading the value pointed to by 'sp' requires locking 'mu2'}} - sq->a = 0; // expected-warning {{reading the value pointed to by 'sq' requires locking 'mu2'}} + void test1() { + mu1.ReaderLock(); + mu2.Lock(); + + sp.get(); + if (*sp == 0) doSomething(); + *sp = 0; + sq->a = 0; + + mu2.Unlock(); + mu1.Unlock(); + } + + void test2() { + mu2.Lock(); + + sp.get(); // expected-warning {{reading variable 'sp' requires locking 'mu1'}} + if (*sp == 0) doSomething(); // expected-warning {{reading variable 'sp' requires locking 'mu1'}} + *sp = 0; // expected-warning {{reading variable 'sp' requires locking 'mu1'}} + sq->a = 0; // expected-warning {{reading variable 'sq' requires locking 'mu1'}} + + mu2.Unlock(); + } + + void test3() { + mu1.Lock(); + + sp.get(); + if (*sp == 0) doSomething(); // expected-warning {{reading the value pointed to by 'sp' requires locking 'mu2'}} + *sp = 0; // expected-warning {{reading the value pointed to by 'sp' requires locking 'mu2'}} + sq->a = 0; // expected-warning {{reading the value pointed to by 'sq' requires locking 'mu2'}} + + mu1.Unlock(); } }; |

