Пример #1
0
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));
}
Пример #2
0
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);
}
Пример #3
0
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;
}