[cfe-commits] [PATCH] Thread-safety analysis: handle attributes on constructors

Richard Smith richard at metafoo.co.uk
Fri Oct 21 10:34:25 PDT 2011


On Fri, October 21, 2011 17:42, Delesley Hutchins wrote:
> Updated patch now at:
>
>
> http://codereview.appspot.com/5310043/

Thanks! Please add some tests. The patch itself looks fine.

Richard

> On Thu, Oct 20, 2011 at 7:07 PM, Richard Smith <richard at metafoo.co.uk> wrote:
>> Hi,
>>
>> On Wed, October 19, 2011 00:15, Delesley Hutchins wrote:
>>
>>> This patch adds support for handling thread safety attributes on
>>> constructors as well as ordinary methods.
>>>
>>> http://codereview.appspot.com/5310043/
>>>
>>>
>>> Note to reviewers: the patch file is a bit misleading.  The main
>>> change is that I moved implementation of VisitCXXMemberCallExpr into a
>>> separate function (handleCall), that is invoked from both
>>> VisitCXXMemberCallExpr and
>>> VisitCXXConstructExpr.  However, diff
>>> thinks I moved around other things instead.
>>
>> --- a/lib/Analysis/ThreadSafety.cpp
>> +++ b/lib/Analysis/ThreadSafety.cpp
>> @@ -182,10 +182,13 @@ class MutexID {
>>         buildMutexID(Parent, 0, 0, 0, 0);
>>       else
>>         return;  // mutexID is still valid in this case
>> -    } else if (CastExpr *CE = dyn_cast<CastExpr>(Exp))
>> +    } else if (UnaryOperator *UOE = dyn_cast<UnaryOperator>(Exp)) {
>> +      buildMutexID(UOE->getSubExpr(), Parent, NumArgs, FunArgDecls,
>> FunArgs);
>>
>>
>> Do you want to be this liberal? UO_AddrOf and UO_Deref seem like good
>> things to handle (and UO_Plus and UO_Extension seem harmless), but
>> increment/decrement in a mutex expression seems like something that should
>> be blacklisted.
>>
>> +    } else if (CastExpr *CE = dyn_cast<CastExpr>(Exp)) {
>>       buildMutexID(CE->getSubExpr(), Parent, NumArgs, FunArgDecls, FunArgs);
>>  -    else
>> +    } else {
>>       DeclSeq.clear(); // Mark as invalid lock expression.
>> +    }
>>
>>
>> The prevalent style in clang is to omit the braces for these ifs.
>>
>>
>>   }
>>
>>
>>   /// \brief Construct a MutexID from an expression.
>> @@ -210,6 +213,10 @@ class MutexID {
>>       Parent = CE->getImplicitObjectArgument();
>>       NumArgs = CE->getNumArgs();
>>       FunArgs = CE->getArgs();
>> +    } else if (CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(DeclExp))
>> {
>> +      Parent = 0;  // FIXME -- is there a way to get the parent?
>>
>>
>> CXXConstructExpr doesn't know which Decl (if any) it's initializing. If you
>>  want to be able to handle things like:
>>
>> struct C { Mutex Mu; C() EXCLUSIVE_LOCK_FUNCTION(this->Mu); /*...*/ }; C c;
>> // c.Mu is known to be acquired
>>
>>
>> ... then I think you'll need to visit DeclStmts, trawl their declaration
>> group looking for initialized VarDecls, and build up some sort of mapping
>> yourself.
>>
>> +      NumArgs = CE->getNumArgs();
>> +      FunArgs = CE->getArgs();
>>     }
>>
>>
>>     // If the attribute has no arguments, then assume the argument is
>> "this".
>>
>>
>> The rest of the patch looks fine.
>>
>>
>> Thanks!
>> Richard
>>
>>
>>
>
>
>
> --
> DeLesley Hutchins | Software Engineer | delesley at google.com | 505-206-0315
>
>




More information about the cfe-commits mailing list