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