Print this page
new smatch
*** 128,137 ****
--- 128,155 ----
set_state(my_id, buf, sym, alloc_estate_rl(rl));
free:
free_string(name);
}
+ static char *get_two_dots(const char *name)
+ {
+ static char buf[80];
+ int i, cnt = 0;
+
+ for (i = 0; i < sizeof(buf); i++) {
+ if (name[i] == '.') {
+ cnt++;
+ if (cnt >= 2) {
+ buf[i] = '\0';
+ return buf;
+ }
+ }
+ buf[i] = name[i];
+ }
+ return NULL;
+ }
+
/*
* This relies on the fact that these states are stored so that
* foo->bar is before foo->bar->baz.
*/
static int parent_set(struct string_list *list, const char *name)
*** 152,176 ****
} END_FOR_EACH_PTR(tmp);
return 0;
}
! static void print_return_value_param(int return_id, char *return_ranges, struct expression *expr)
{
struct sm_state *sm;
struct smatch_state *extra;
int param;
struct range_list *rl;
const char *param_name;
struct string_list *set_list = NULL;
char *math_str;
char buf[256];
FOR_EACH_MY_SM(my_id, __get_cur_stree(), sm) {
if (!estate_rl(sm->state))
continue;
! extra = get_state(SMATCH_EXTRA, sm->name, sm->sym);
if (extra) {
rl = rl_intersection(estate_rl(sm->state), estate_rl(extra));
if (!rl)
continue;
} else {
--- 170,196 ----
} END_FOR_EACH_PTR(tmp);
return 0;
}
! static void print_return_value_param_helper(int return_id, char *return_ranges, struct expression *expr, int limit)
{
struct sm_state *sm;
struct smatch_state *extra;
int param;
struct range_list *rl;
const char *param_name;
struct string_list *set_list = NULL;
char *math_str;
char buf[256];
+ char two_dot[80] = "";
+ int count = 0;
FOR_EACH_MY_SM(my_id, __get_cur_stree(), sm) {
if (!estate_rl(sm->state))
continue;
! extra = __get_state(SMATCH_EXTRA, sm->name, sm->sym);
if (extra) {
rl = rl_intersection(estate_rl(sm->state), estate_rl(extra));
if (!rl)
continue;
} else {
*** 194,204 ****
--- 214,236 ----
if (is_ignored_kernel_data(param_name)) {
insert_string(&set_list, (char *)sm->name);
continue;
}
+ if (limit) {
+ char *new = get_two_dots(param_name);
+ if (new) {
+ if (strcmp(new, two_dot) == 0)
+ continue;
+ strncpy(two_dot, new, sizeof(two_dot));
+ sql_insert_return_states(return_id, return_ranges,
+ PARAM_SET, param, new, "s64min-s64max");
+ continue;
+ }
+ }
+
math_str = get_value_in_terms_of_parameter_math_var_sym(sm->name, sm->sym);
if (math_str) {
snprintf(buf, sizeof(buf), "%s[%s]", show_rl(rl), math_str);
insert_string(&set_list, (char *)sm->name);
sql_insert_return_states(return_id, return_ranges,
*** 213,244 ****
insert_string(&set_list, (char *)sm->name);
sql_insert_return_states(return_id, return_ranges,
param_has_filter_data(sm) ? PARAM_ADD : PARAM_SET,
param, param_name, show_rl(rl));
} END_FOR_EACH_SM(sm);
free_ptr_list((struct ptr_list **)&set_list);
}
int param_was_set_var_sym(const char *name, struct symbol *sym)
{
struct sm_state *sm;
! int len;
! FOR_EACH_MY_SM(my_id, __get_cur_stree(), sm) {
! if (sm->sym != sym)
continue;
! len = strlen(sm->name);
! if (strncmp(sm->name, name, len) != 0)
continue;
! if (name[len] == '\0' ||
! name[len] == '-')
return 1;
! } END_FOR_EACH_SM(sm);
return 0;
}
int param_was_set(struct expression *expr)
{
--- 245,314 ----
insert_string(&set_list, (char *)sm->name);
sql_insert_return_states(return_id, return_ranges,
param_has_filter_data(sm) ? PARAM_ADD : PARAM_SET,
param, param_name, show_rl(rl));
+ if (limit && ++count > limit)
+ break;
} END_FOR_EACH_SM(sm);
free_ptr_list((struct ptr_list **)&set_list);
}
+ static void print_return_value_param(int return_id, char *return_ranges, struct expression *expr)
+ {
+ print_return_value_param_helper(return_id, return_ranges, expr, 0);
+ }
+
+ void print_limited_param_set(int return_id, char *return_ranges, struct expression *expr)
+ {
+ print_return_value_param_helper(return_id, return_ranges, expr, 1000);
+ }
+
+ static int possibly_empty(struct sm_state *sm)
+ {
+ struct sm_state *tmp;
+
+ FOR_EACH_PTR(sm->possible, tmp) {
+ if (strcmp(tmp->name, "") == 0)
+ return 1;
+ } END_FOR_EACH_PTR(tmp);
+ return 0;
+ }
+
int param_was_set_var_sym(const char *name, struct symbol *sym)
{
struct sm_state *sm;
! char buf[80];
! int len, i;
! if (!name)
! return 0;
!
! len = strlen(name);
! if (len >= sizeof(buf))
! len = sizeof(buf) - 1;
!
! for (i = 0; i <= len; i++) {
! if (name[i] != '-' && name[i] != '\0')
continue;
!
! memcpy(buf, name, i);
! buf[i] = '\0';
!
! sm = get_sm_state(my_id, buf, sym);
! if (!sm)
continue;
! if (possibly_empty(sm))
! continue;
return 1;
! }
+ if (name[0] == '*')
+ return param_was_set_var_sym(name + 1, sym);
+
return 0;
}
int param_was_set(struct expression *expr)
{