[clang] [analyzer] [MallocChecker] suspect all release functions as candite for supression (PR #104599)
Pavel Skripkin via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 16 07:55:09 PDT 2024
================
@@ -0,0 +1,80 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Malloc -verify %s
+//
+
+typedef unsigned long size_t;
+
+typedef enum memory_order {
+ memory_order_relaxed = __ATOMIC_RELAXED,
+} memory_order;
+
+void *calloc(size_t, size_t);
+void free(void *);
+
+struct SomeData {
+ int i;
+ _Atomic int ref;
+};
+
+static struct SomeData *alloc_data(void)
+{
+ struct SomeData *data = calloc(sizeof(*data), 1);
+
+ __c11_atomic_store(&data->ref, 2, memory_order_relaxed);
+ return data;
+}
+
+static void put_data(struct SomeData *data)
+{
+ if (__c11_atomic_fetch_sub(&data->ref, 1, memory_order_relaxed) == 1)
+ free(data);
+}
+
+static int dec_refcounter(struct SomeData *data)
+{
+ return __c11_atomic_fetch_sub(&data->ref, 1, memory_order_relaxed) == 1;
+}
+
+static void put_data_nested(struct SomeData *data)
+{
+ if (dec_refcounter(data))
+ free(data);
+}
+
+static void put_data_uncond(struct SomeData *data)
+{
+ free(data);
+}
+
+static void put_data_unrelated_atomic(struct SomeData *data)
+{
+ free(data);
+ __c11_atomic_fetch_sub(&data->ref, 1, memory_order_relaxed);
----------------
pskrgag wrote:
One thing that bothers me a bit is:
```c
static void put_data_unrelated_atomic(struct SomeData *data)
{
__c11_atomic_fetch_sub(&data->ref, 1, memory_order_relaxed);
free(data);
}
```
following will be suppressed, but atomic operation is unrelated to `free()`. I think, it's caused by `LocationContext::isParentOf` call.
https://github.com/llvm/llvm-project/pull/104599
More information about the cfe-commits
mailing list