Print this page
11506 smatch resync

*** 14,26 **** --- 14,57 ---- * 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 */ #include "smatch.h" + #include "smatch_extra.h" static int my_id; + static void match_shift_mask(struct expression *expr) + { + struct expression *right, *shifter; + struct range_list *rl; + char *str; + + expr = strip_expr(expr); + if (expr->type != EXPR_BINOP || expr->op != '&') + return; + + if (get_type(expr->left) != &ullong_ctype) + return; + + if (type_bits(get_type(expr->right)) == 64) + return; + + right = strip_expr(expr->right); + if (right->type != EXPR_BINOP || right->op != SPECIAL_LEFTSHIFT) + return; + + shifter = strip_expr(right->right); + get_real_absolute_rl(shifter, &rl); + if (rl_max(rl).uvalue < 32) + return; + + str = expr_to_str(expr->right); + sm_warning("should '%s' be a 64 bit type?", str); + free_string(str); + } + static void match_shift_assignment(struct expression *expr) { struct symbol *left_type, *right_type; struct expression *right; sval_t sval;
*** 61,66 **** --- 92,98 ---- void check_64bit_shift(int id) { my_id = id; add_hook(&match_shift_assignment, ASSIGNMENT_HOOK); + add_hook(&match_shift_mask, BINOP_HOOK); }