Print this page
11506 smatch resync
@@ -112,11 +112,11 @@
pop_op();
while (rl_stack)
pop_rl(&rl_stack);
}
-static int read_rl_from_var(struct expression *call, char *p, char **end, struct range_list **rl)
+static int read_rl_from_var(struct expression *call, const char *p, const char **end, struct range_list **rl)
{
struct expression *arg;
struct smatch_state *state;
long param;
char *name;
@@ -123,11 +123,11 @@
struct symbol *sym;
char buf[256];
int star;
p++;
- param = strtol(p, &p, 10);
+ param = strtol(p, (char **)&p, 10);
arg = get_argument_from_call_expr(call->args, param);
if (!arg)
return 0;
@@ -163,11 +163,11 @@
return 0;
*rl = estate_rl(state);
return 1;
}
-static int read_var_num(struct expression *call, char *p, char **end, struct range_list **rl)
+static int read_var_num(struct expression *call, const char *p, const char **end, struct range_list **rl)
{
sval_t sval;
while (*p == ' ')
p++;
@@ -174,18 +174,18 @@
if (*p == '$')
return read_rl_from_var(call, p, end, rl);
sval.type = &llong_ctype;
- sval.value = strtoll(p, end, 10);
+ sval.value = strtoll(p, (char **)end, 10);
if (*end == p)
return 0;
*rl = alloc_rl(sval, sval);
return 1;
}
-static char *read_op(char *p)
+static const char *read_op(const char *p)
{
while (*p == ' ')
p++;
switch (*p) {
@@ -197,18 +197,18 @@
default:
return NULL;
}
}
-int parse_call_math_rl(struct expression *call, char *math, struct range_list **rl)
+int parse_call_math_rl(struct expression *call, const char *math, struct range_list **rl)
{
struct range_list *tmp;
- char *c;
+ const char *c;
/* try to implement shunting yard algorithm. */
- c = (char *)math;
+ c = math;
while (1) {
if (option_debug)
sm_msg("parsing %s", c);
/* read a number and push it onto the number stack */
@@ -342,10 +342,20 @@
if (param_was_set_var_sym(name, sym))
return 0;
return format_name_sym_helper(buf, remaining, name, sym);
}
+static int is_mtag_sval(sval_t sval)
+{
+ if (!is_ptr_type(sval.type))
+ return 0;
+ if (sval_cmp(sval, valid_ptr_min_sval) >= 0 &&
+ sval_cmp(sval, valid_ptr_max_sval) <= 0)
+ return 1;
+ return 0;
+}
+
static int format_expr_helper(char *buf, int remaining, struct expression *expr)
{
sval_t sval;
int ret;
char *cur;
@@ -378,11 +388,11 @@
return 0;
cur += ret;
return cur - buf;
}
- if (get_implied_value(expr, &sval)) {
+ if (!param_was_set(expr) && get_implied_value(expr, &sval) && !is_mtag_sval(sval)) {
ret = snprintf(cur, remaining, "%s", sval_to_str(sval));
remaining -= ret;
if (remaining <= 0)
return 0;
return ret;
@@ -433,10 +443,11 @@
{
struct expression *tmp, *expr;
char buf[256] = "";
int ret;
int cnt = 0;
+ sval_t sval;
expr = get_assigned_expr_name_sym(name, sym);
if (!expr)
return NULL;
while ((tmp = get_assigned_expr(expr))) {
@@ -443,10 +454,13 @@
expr = strip_expr(tmp);
if (++cnt > 3)
break;
}
+ if (get_implied_value(expr, &sval))
+ return NULL;
+
ret = format_expr_helper(buf, sizeof(buf), expr);
if (ret == 0)
return NULL;
return alloc_sname(buf);
@@ -491,11 +505,11 @@
p = format;
out = buf;
while (*p) {
if (*p == '$') {
p++;
- param = strtol(p, &p, 10);
+ param = strtol(p, (char **)&p, 10);
arg = get_argument_from_call_expr(call->args, param);
if (!arg)
return NULL;
param = get_arg_number(arg);
if (param >= 0) {
@@ -641,10 +655,12 @@
{
int i;
my_id = id;
+ set_dynamic_states(my_id);
+
for (i = 0; i < ARRAY_SIZE(alloc_functions); i++)
add_function_assign_hook(alloc_functions[i].func, &match_alloc,
INT_PTR(alloc_functions[i].param));
add_hook(&match_call_assignment, CALL_ASSIGNMENT_HOOK);
add_split_return_callback(print_returned_allocations);