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) {