https://bugs.llvm.org/show_bug.cgi?id=32954
Bug ID: 32954
Summary: -Wthread-safety try_acquire_capability is broken?
Product: clang
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: Frontend
Assignee: unassignedclangb...@nondot.org
Reporter: lebedev...@gmail.com
CC: llvm-bugs@lists.llvm.org
When trying to use -Wthread-safety on darktable (~220KLOC), i have encountered
the following problem (minimized):
To be noted, the problem i encountered is when using this in C, but apparently
it happens with C++ too.
// Enable thread safety attributes only with clang.
// The attributes can be safely erased when compiling with other compilers.
#if defined(__clang__) && (!defined(SWIG))
#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
#else
#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op
#endif
#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
#define CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(capability(x))
#define TRY_ACQUIRE(...)
THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__))
#define RELEASE(...)
THREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__))
struct CAPABILITY("mutex") Mutex {};
// like pthread_mutex_trylock(), which it internally calls, 0 means success.
int trylock(Mutex *mutex) TRY_ACQUIRE(0, mutex);
int unlock(Mutex *mutex) RELEASE(mutex);
Mutex first;
Mutex second;
int main() {
if(trylock(&first) != 0) {
return 0;
}
if(trylock(&second) != 0) {
unlock(&first);
return 0;
}
unlock(&second);
unlock(&first);
return 0;
}
Which results in warnings:
<source>:26:5: warning: releasing mutex 'first' that was not held
[-Wthread-safety-analysis]
unlock(&first);
^
<source>:30:3: warning: releasing mutex 'second' that was not held
[-Wthread-safety-analysis]
unlock(&second);
^
<source>:31:3: warning: releasing mutex 'first' that was not held
[-Wthread-safety-analysis]
unlock(&first);
^
3 warnings generated.
or equivalently (only the main() is different)
int main() {
if(trylock(&first) == 0) {
if(trylock(&second) == 0)
unlock(&second);
unlock(&first);
}
return 0;
}
<source>:23:7: warning: releasing mutex 'second' that was not held
[-Wthread-safety-analysis]
unlock(&second);
^
<source>:25:5: warning: releasing mutex 'first' that was not held
[-Wthread-safety-analysis]
unlock(&first);
^
2 warnings generated.
This only happens with trylock, regardless of the trylock's return type (bool,
int) i try, and regardless of the first parameter i pass to TRY_ACQUIRE
(0/1/true/false).
The original code that does not yet use these annotations is around here:
https://github.com/darktable-org/darktable/blob/715877a/src/views/darkroom.c#L511-L518
Roman.
--
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs