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

Delesley Hutchins delesley at google.com
Fri Oct 21 08:17:22 PDT 2011

Thanks for the review!

> 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.

The purpose of buildMutexID is to construct an object that uniquely
identifies a mutex expression, but is easier to compare for equality
than an Expr*.   This should really be a larger case statement which
handles most kinds of Expr; I  just haven't added the full set of
cases yet.

The question of which expressions should be considered valid mutex
expressions is a separate issue.  Ideally mutex expressions should
have no side effects, but full side-effect analysis is well beyond the
scope of the current implementation; merely eliminating UO_PostInc and
friends is not going to accomplish much.  A more pressing concern is
tracking which variables have changed between lock and unlock, because
the mutex expressions should no longer be equal if they've changed; I
will probably want to move this into the static analyzer proper in
order to get that functionality.

I'll add a comment to clarify.

> The prevalent style in clang is to omit the braces for these ifs.


> 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.

Thanks -- I've got a new patch going out today which looks at DeclStmts.  :-)

DeLesley Hutchins | Software Engineer | delesley at google.com | 505-206-0315

More information about the cfe-commits mailing list