From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:3256 "EHLO mx0b-00069f02.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229515AbhGJVMp (ORCPT ); Sat, 10 Jul 2021 17:12:45 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 16AL7w9H020328 for ; Sat, 10 Jul 2021 21:09:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : mime-version : content-transfer-encoding; s=corp-2020-01-29; bh=NqgluNvlFtQmY1IYjOwTiouA5Wq/kfgFdd11DyTf/jg=; b=QILpokdBJqeHWiM73zavkyHE6/eoAJzekvrXWw5EERbNx95lymHDKO1Uo4in5uytUOqb KUjesphsniMbn0z2o8THfoeIVa4VLf00qPy9Bj0fQIlHiAw+RTe26fbNZf8GktbZ3tOv xg8RvDLL+RCBiypRRtVp6eOmhd56QUnDCzJFR00ZF1xKCSI9pFucDsdYx2qhBKrvxNCY e6tiz5dOgs4a/XKCsGJEM7yOjbBSLGJ1jtaY/CdR0iBZpCjsBPSVGNNj0N0xiG7Xnege FjnGphgvCmq1YBTIjEn/pkDotJ0Pyp+CB4O7puiMfPG7J2JHC7e+IAPC9KpG+iwN6Olb Hg== Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by mx0b-00069f02.pphosted.com with ESMTP id 39q2b2gnhb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Sat, 10 Jul 2021 21:09:58 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 16AL6i2x053321 for ; Sat, 10 Jul 2021 21:09:57 GMT Received: from pps.reinject (localhost [127.0.0.1]) by userp3020.oracle.com with ESMTP id 39q2vm146j-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Sat, 10 Jul 2021 21:09:57 +0000 Received: from userp3020.oracle.com (userp3020.oracle.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 16AL9vjJ056571 for ; Sat, 10 Jul 2021 21:09:57 GMT From: Harshvardhan Jha Subject: [PATCH] extra: Fixed handle_bit_test so that null set condition is taken care of Date: Sun, 11 Jul 2021 02:39:49 +0530 Message-Id: <20210710210949.20264-1-harshvardhan.jha@oracle.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-ID: To: smatch@vger.kernel.org Cc: dan.carpenter@oracle.com, Harshvardhan Jha The handle_bit_test condition wasn't setting a false range_list for the false state and hence the implied rl was coming out to be false. The false and true rls have been calculating using rl_intersection and rl_filter commands. Signed-off-by: Harshvardhan Jha --- smatch_extra.c | 17 +++++++++-------- validation/sm_bits2.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 validation/sm_bits2.c diff --git a/smatch_extra.c b/smatch_extra.c index e864646a..27bf5a02 100644 --- a/smatch_extra.c +++ b/smatch_extra.c @@ -2061,7 +2061,7 @@ static void match_comparison(struct expression *expr) static bool handle_bit_test(struct expression *expr) { - struct range_list *orig_rl, *rl; + struct range_list *orig_rl, *rl, *true_rl, *false_rl; struct expression *shift, *mask, *var; struct bit_info *bit_info; sval_t sval; @@ -2083,23 +2083,24 @@ static bool handle_bit_test(struct expression *expr) bit_info = get_bit_info(mask); if (!bit_info) return false; - if (!bit_info->possible) + if (!bit_info->possible){ + set_true_false_states_expr(my_id, var, alloc_estate_empty(), NULL); return false; + } get_absolute_rl(var, &orig_rl); if (sval_is_negative(rl_min(orig_rl)) || rl_max(orig_rl).uvalue > type_bits(get_type(shift->left))) return false; - low.value = ffsll(bit_info->possible); - high.value = sm_fls64(bit_info->possible); + low.value = ffsll(bit_info->possible) - 1; + high.value = sm_fls64(bit_info->possible) - 1; rl = alloc_rl(low, high); rl = cast_rl(get_type(var), rl); - rl = rl_intersection(orig_rl, rl); - if (!rl) - return false; + true_rl = rl_intersection(orig_rl, rl); + false_rl = rl_filter(orig_rl, rl); - set_extra_expr_true_false(shift->right, alloc_estate_rl(rl), NULL); + set_extra_expr_true_false(shift->right, alloc_estate_rl(true_rl), alloc_estate_rl(false_rl)); return true; } diff --git a/validation/sm_bits2.c b/validation/sm_bits2.c new file mode 100644 index 00000000..1a43538a --- /dev/null +++ b/validation/sm_bits2.c @@ -0,0 +1,28 @@ +#include "../check_debug.h" + +unsigned int frob(); + +void test(void) +{ + unsigned int mask = 0xff0; + unsigned int x = frob(); + + if (x < 4 || x > 11) + return; + + if ((1 << x) & mask) { + __smatch_implied(x); + return; + } + __smatch_implied(x); +} + +/* + * check-name: smatch bits 2 + * check-command: smatch sm_bits2.c + * + * check-output-start +sm_bits2.c:14 test() implied: x = '4-11' +sm_bits2.c:17 test() implied: x = '' + * check-output-end + */ -- 2.32.0