[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