[clang] [clang] WIP: Warn on mismatched RequiresCapability attributes (PR #67520)

Timm Baeder via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 4 01:43:00 PDT 2024


Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>,
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>,
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>,
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>,
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/67520 at github.com>


tbaederr wrote:

Hmm, so this is causing problems:

```c++

namespace DoubleLockBug {
  class Foo {
  public:
    Mutex mu_;
    int a GUARDED_BY(mu_);
    void foo1() EXCLUSIVE_LOCKS_REQUIRED(mu_);
  };
  void Foo::foo1() EXCLUSIVE_LOCKS_REQUIRED(mu_) {
    a = 0;
  }
}
```

The AST is:
```
CXXMethodDecl 0x7d3d96ebf710 parent 0x7d3d96ebf118 prev 0x7d3d96ebf450 <./array.cpp:57:3, line:59:3> line:57:13 foo1 'void ()'
|-CompoundStmt 0x7d3d96ebfa70 <col:50, line:59:3>
| `-BinaryOperator 0x7d3d96ebfa48 <line:58:5, col:9> 'int' lvalue '='
|   |-MemberExpr 0x7d3d96ebf9e8 <col:5> 'int' lvalue ->a 0x7d3d96ebf398
|   | `-CXXThisExpr 0x7d3d96ebf9d0 <col:5> 'DoubleLockBug::Foo *' implicit this
|   `-IntegerLiteral 0x7d3d96ebfa20 <col:9> 'int' 0
|-RequiresCapabilityAttr 0x7d3d96ebf890 <line:15:56, col:92> Inherited exclusive_locks_required
| `-MemberExpr 0x7d3d96ebf5f8 <line:55:42> 'Mutex' lvalue ->mu_ 0x7d3d96ebf328 non_odr_use_unevaluated
|   `-CXXThisExpr 0x7d3d96ebf5e0 <col:42> 'DoubleLockBug::Foo *' implicit this
`-RequiresCapabilityAttr 0x7d3d96ebf930 <line:15:56, col:92> exclusive_locks_required
  `-MemberExpr 0x7d3d96ebf8f8 <line:57:45> 'Mutex' lvalue ->mu_ 0x7d3d96ebf328 non_odr_use_unevaluated
    `-CXXThisExpr 0x7d3d96ebf8e0 <col:45> 'DoubleLockBug::Foo *' implicit this

CXXMethodDecl 0x7d3d96ebf450 <./array.cpp:55:5, line:15:94> line:55:10 foo1 'void ()'
`-RequiresCapabilityAttr 0x7d3d96ebf630 <line:15:56, col:92> exclusive_locks_required
  `-MemberExpr 0x7d3d96ebf5f8 <line:55:42> 'Mutex' lvalue ->mu_ 0x7d3d96ebf328 non_odr_use_unevaluated
    `-CXXThisExpr 0x7d3d96ebf5e0 <col:42> 'DoubleLockBug::Foo *' implicit this
```

So the definition has `mu_` twice, which causes us to diagnose mismatching attributes. Is there any sort of facility to deduplicate capabilities? Declaring a `std::set` of `CapabilityExpr` doesn't seem to work because there's no `operator<` for those.

https://github.com/llvm/llvm-project/pull/67520


More information about the cfe-commits mailing list