1*1f5207b7SJohn Levon /* 2*1f5207b7SJohn Levon * Copyright (C) 2012 Oracle. 3*1f5207b7SJohn Levon * 4*1f5207b7SJohn Levon * This program is free software; you can redistribute it and/or 5*1f5207b7SJohn Levon * modify it under the terms of the GNU General Public License 6*1f5207b7SJohn Levon * as published by the Free Software Foundation; either version 2 7*1f5207b7SJohn Levon * of the License, or (at your option) any later version. 8*1f5207b7SJohn Levon * 9*1f5207b7SJohn Levon * This program is distributed in the hope that it will be useful, 10*1f5207b7SJohn Levon * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*1f5207b7SJohn Levon * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*1f5207b7SJohn Levon * GNU General Public License for more details. 13*1f5207b7SJohn Levon * 14*1f5207b7SJohn Levon * You should have received a copy of the GNU General Public License 15*1f5207b7SJohn Levon * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt 16*1f5207b7SJohn Levon */ 17*1f5207b7SJohn Levon 18*1f5207b7SJohn Levon #include "smatch.h" 19*1f5207b7SJohn Levon #include "smatch_extra.h" 20*1f5207b7SJohn Levon 21*1f5207b7SJohn Levon static int my_id; 22*1f5207b7SJohn Levon is_bitshift(struct expression * expr)23*1f5207b7SJohn Levonstatic int is_bitshift(struct expression *expr) 24*1f5207b7SJohn Levon { 25*1f5207b7SJohn Levon expr = strip_expr(expr); 26*1f5207b7SJohn Levon 27*1f5207b7SJohn Levon if (expr->type != EXPR_BINOP) 28*1f5207b7SJohn Levon return 0; 29*1f5207b7SJohn Levon if (expr->op == SPECIAL_LEFTSHIFT) 30*1f5207b7SJohn Levon return 1; 31*1f5207b7SJohn Levon return 0; 32*1f5207b7SJohn Levon } 33*1f5207b7SJohn Levon match_logic(struct expression * expr)34*1f5207b7SJohn Levonstatic void match_logic(struct expression *expr) 35*1f5207b7SJohn Levon { 36*1f5207b7SJohn Levon sval_t sval; 37*1f5207b7SJohn Levon 38*1f5207b7SJohn Levon if (expr->type != EXPR_LOGICAL) 39*1f5207b7SJohn Levon return; 40*1f5207b7SJohn Levon 41*1f5207b7SJohn Levon if (get_macro_name(expr->pos)) 42*1f5207b7SJohn Levon return; 43*1f5207b7SJohn Levon 44*1f5207b7SJohn Levon if (!get_value(expr->right, &sval)) { 45*1f5207b7SJohn Levon if (!get_value(expr->left, &sval)) 46*1f5207b7SJohn Levon return; 47*1f5207b7SJohn Levon } 48*1f5207b7SJohn Levon 49*1f5207b7SJohn Levon if (sval.value == 0 || sval.value == 1) 50*1f5207b7SJohn Levon return; 51*1f5207b7SJohn Levon 52*1f5207b7SJohn Levon sm_warning("should this be a bitwise op?"); 53*1f5207b7SJohn Levon } 54*1f5207b7SJohn Levon match_assign(struct expression * expr)55*1f5207b7SJohn Levonstatic void match_assign(struct expression *expr) 56*1f5207b7SJohn Levon { 57*1f5207b7SJohn Levon struct expression *right; 58*1f5207b7SJohn Levon 59*1f5207b7SJohn Levon right = strip_expr(expr->right); 60*1f5207b7SJohn Levon if (right->type != EXPR_LOGICAL) 61*1f5207b7SJohn Levon return; 62*1f5207b7SJohn Levon if (is_bitshift(right->left) || is_bitshift(right->right)) 63*1f5207b7SJohn Levon sm_warning("should this be a bitwise op?"); 64*1f5207b7SJohn Levon } 65*1f5207b7SJohn Levon check_logical_instead_of_bitwise(int id)66*1f5207b7SJohn Levonvoid check_logical_instead_of_bitwise(int id) 67*1f5207b7SJohn Levon { 68*1f5207b7SJohn Levon my_id = id; 69*1f5207b7SJohn Levon 70*1f5207b7SJohn Levon add_hook(&match_logic, LOGIC_HOOK); 71*1f5207b7SJohn Levon add_hook(&match_assign, ASSIGNMENT_HOOK); 72*1f5207b7SJohn Levon } 73