ryantimwilson / rpms / systemd

Forked from rpms/systemd a month ago
Clone
3d3dc8
From 42123e9614ea73c7f64c684c90e4dbb049ef67ef Mon Sep 17 00:00:00 2001
3d3dc8
From: Frantisek Sumsal <frantisek@sumsal.cz>
3d3dc8
Date: Sun, 5 Dec 2021 10:25:28 +0100
3d3dc8
Subject: [PATCH] lgtm: ignore certain cleanup functions
3d3dc8
3d3dc8
as they don't do any illegal stuff even when used with an uninitialized
3d3dc8
variable.
3d3dc8
3d3dc8
(cherry picked from commit af1868213657b38b8d4008608976eb81546cfb8e)
3d3dc8
3d3dc8
Related: #2017033
3d3dc8
---
3d3dc8
 .lgtm/cpp-queries/UninitializedVariableWithCleanup.ql | 9 +++++++++
3d3dc8
 1 file changed, 9 insertions(+)
3d3dc8
3d3dc8
diff --git a/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql b/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
3d3dc8
index 6bf0ae01eb..8c24b6d8f1 100644
3d3dc8
--- a/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
3d3dc8
+++ b/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
3d3dc8
@@ -34,6 +34,13 @@ predicate allocatedType(Type t) {
3d3dc8
   allocatedType(t.getUnspecifiedType())
3d3dc8
 }
3d3dc8
 
3d3dc8
+/** Auxiliary predicate: List cleanup functions we want to explicitly ignore
3d3dc8
+  * since they don't do anything illegal even when the variable is uninitialized
3d3dc8
+  */
3d3dc8
+predicate cleanupFunctionDenyList(string fun) {
3d3dc8
+  fun = "erase_char"
3d3dc8
+}
3d3dc8
+
3d3dc8
 /**
3d3dc8
  * A declaration of a local variable using __attribute__((__cleanup__(x)))
3d3dc8
  * that leaves the variable uninitialized.
3d3dc8
@@ -43,6 +50,8 @@ DeclStmt declWithNoInit(LocalVariable v) {
3d3dc8
   not exists(v.getInitializer()) and
3d3dc8
   /* The variable has __attribute__((__cleanup__(...))) set */
3d3dc8
   v.getAnAttribute().hasName("cleanup") and
3d3dc8
+  /* Check if the cleanup function is not on a deny list */
3d3dc8
+  not exists(Attribute a | a = v.getAnAttribute() and a.getName() = "cleanup" | cleanupFunctionDenyList(a.getAnArgument().getValueText())) and
3d3dc8
   /* The type of the variable is not stack-allocated. */
3d3dc8
   exists(Type t | t = v.getType() | not allocatedType(t))
3d3dc8
 }