Powered by Linux
[PATCH] Add check_cmn_err — Semantic Matching Tool

[PATCH] Add check_cmn_err

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This function, when supplied with a "CE_PANIC" argument, never returns:
let's teach smatch about that.
---
 check_cmn_err.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++
 check_list.h    |  1 +
 2 files changed, 53 insertions(+)
 create mode 100644 check_cmn_err.c

diff --git a/check_cmn_err.c b/check_cmn_err.c
new file mode 100644
index 00000000..1063efeb
--- /dev/null
+++ b/check_cmn_err.c
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2016 Oracle.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt
+ *
+ * Copyright 2019 Joyent, Inc.
+ */
+
+/*
+ * Heavily borrowed from check_wine.c: what we're doing here is teaching smatch
+ * that cmn_err(CE_PANIC, ...) is noreturn.
+ */
+
+#include "scope.h"
+#include "smatch.h"
+#include "smatch_extra.h"
+
+#define	CE_PANIC (3)
+
+void match_cmn_err(const char *fn, struct expression *expr,
+			void *unused)
+{
+	struct expression *arg;
+	sval_t sval;
+
+	arg = get_argument_from_call_expr(expr->args, 0);
+	if (!get_implied_value(arg, &sval))
+		return;
+
+	if (sval.value == CE_PANIC)
+		nullify_path();
+}
+
+
+void check_cmn_err(int id)
+{
+	if (option_project != PROJ_ILLUMOS_KERNEL)
+		return;
+
+	add_function_hook("cmn_err", &match_cmn_err, NULL);
+}
diff --git a/check_list.h b/check_list.h
index cc3ce853..4a9c069a 100644
--- a/check_list.h
+++ b/check_list.h
@@ -200,6 +200,7 @@ CK(check_arm64_tagged)
 
 /* illumos specific */
 CK(check_all_func_returns)
+CK(check_cmn_err)
 
 #include "check_list_local.h"
 
-- 
2.17.1




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux