static void check_size_matches(int data_size, struct expression *size_expr) { sval_t sval; if (data_size == 1) /* this is generic a buffer */ return; if (!get_implied_value(size_expr, &sval)) return; if (sval_cmp_val(sval, data_size) != 0) sm_msg("warn: double check that we're allocating correct size: %d vs %s", data_size, sval_to_str(sval)); }
static void check_expr(struct expression *expr) { struct sm_state *sm; sval_t max; sval_t sval; char *name; int overflow = 0; int underflow = 0; sm = get_sm_state_expr(my_max_id, expr); if (sm && slist_has_state(sm->possible, &user_data)) { if (!get_absolute_max(expr, &max) || sval_cmp_val(max, 20000) > 0) overflow = 1; } sm = get_sm_state_expr(my_min_id, expr); if (sm && slist_has_state(sm->possible, &user_data)) { if (!get_absolute_min(expr, &sval) || (sval_is_negative(sval) && sval_cmp_val(sval, -20000) < 0)) underflow = 1; } if (!overflow && !underflow) return; name = expr_to_var_sym(expr, NULL); if (overflow && underflow) sm_msg("warn: check for integer over/underflow '%s'", name); else if (underflow) sm_msg("warn: check for integer underflow '%s'", name); else sm_msg("warn: check for integer overflow '%s'", name); free_string(name); set_state_expr(my_max_id, expr, &capped); set_state_expr(my_min_id, expr, &capped); }
static const char *get_shifter(struct expression *expr) { const char *name; sval_t expr_value; const int *shifter_value; expr = strip_expr(expr); if (expr->type != EXPR_VALUE) return NULL; if (!get_value(expr, &expr_value)) return NULL; name = pos_ident(expr->pos); if (!name) return NULL; shifter_value = search_struct(shifters, (char *)name); if (!shifter_value) return NULL; if (sval_cmp_val(expr_value, *shifter_value) != 0) return NULL; return name; }