[PATCH] Add check_cmn_err

John Levon <[email protected]>
Newsgroups org.kernel.vger.smatch
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.