Print this page
11506 smatch resync


 163         if (param_was_set_var_sym(right_name, right_sym))
 164                 return;
 165 
 166         set_true_false_states(compare_id, state_name, NULL, true_state, false_state);
 167         save_link_var_sym(left_name, left_sym, state_name);
 168         save_link_var_sym(right_name, right_sym, state_name);
 169 free:
 170         free_string(left_name);
 171         free_string(right_name);
 172 }
 173 
 174 static void print_return_comparison(int return_id, char *return_ranges, struct expression *expr)
 175 {
 176         struct sm_state *tmp;
 177         struct string_list *links;
 178         char *link;
 179         struct sm_state *sm;
 180         struct compare_data *data;
 181         struct var_sym *left, *right;
 182         int left_param, right_param;
 183         static char left_buf[256];
 184         static char right_buf[256];
 185         static char info_buf[256];
 186         const char *tmp_name;
 187 
 188         FOR_EACH_MY_SM(link_id, __get_cur_stree(), tmp) {
 189                 links = tmp->state->data;
 190                 FOR_EACH_PTR(links, link) {
 191                         sm = get_sm_state(compare_id, link, NULL);
 192                         if (!sm)
 193                                 continue;
 194                         data = sm->state->data;
 195                         if (!data || !data->comparison)
 196                                 continue;
 197                         if (ptr_list_size((struct ptr_list *)data->left_vsl) != 1 ||
 198                             ptr_list_size((struct ptr_list *)data->right_vsl) != 1)
 199                                 continue;
 200                         left = first_ptr_list((struct ptr_list *)data->left_vsl);
 201                         right = first_ptr_list((struct ptr_list *)data->right_vsl);
 202                         if (left->sym == right->sym &&
 203                             strcmp(left->var, right->var) == 0)
 204                                 continue;


 267                 return 0;
 268         }
 269 
 270         if (**value != ' ') {
 271                 sm_perror("parsing comparison.  %s", *value);
 272                 return 0;
 273         }
 274 
 275         (*value)++;
 276         return 1;
 277 }
 278 
 279 static int split_op_param_key(char *value, int *op, int *param, char **key)
 280 {
 281         static char buf[256];
 282         char *p;
 283 
 284         if (!parse_comparison(&value, op))
 285                 return 0;
 286 
 287         snprintf(buf, sizeof(buf), value);
 288 
 289         p = buf;
 290         if (*p++ != '$')
 291                 return 0;
 292 
 293         *param = atoi(p);
 294         if (*param < 0 || *param > 99)
 295                 return 0;
 296         p++;
 297         if (*param > 9)
 298                 p++;
 299         p--;
 300         *p = '$';
 301         *key = p;
 302 
 303         return 1;
 304 }
 305 
 306 static void db_return_comparison(struct expression *expr, int left_param, char *key, char *value)
 307 {


 340         right_name = get_variable_from_key(right_arg, right_key, &right_sym);
 341         if (!right_name || !right_sym)
 342                 goto free;
 343         if (get_param_num_from_sym(right_sym) < 0)
 344                 goto free;
 345 
 346         add_var_sym(&left_vsl, left_name, left_sym);
 347         add_var_sym(&right_vsl, right_name, right_sym);
 348 
 349         add_comparison_var_sym(left_name, left_vsl, op, right_name, right_vsl);
 350 
 351 free:
 352         free_string(left_name);
 353         free_string(right_name);
 354 }
 355 
 356 void register_param_compare_limit(int id)
 357 {
 358         compare_id = id;
 359 

 360         add_merge_hook(compare_id, &merge_compare_states);
 361         add_split_return_callback(&print_return_comparison);
 362 
 363         select_return_states_hook(COMPARE_LIMIT, &db_return_comparison);
 364 }
 365 
 366 void register_param_compare_limit_links(int id)
 367 {
 368         link_id = id;
 369 

 370         add_merge_hook(link_id, &merge_links);
 371 
 372 }
 373 


 163         if (param_was_set_var_sym(right_name, right_sym))
 164                 return;
 165 
 166         set_true_false_states(compare_id, state_name, NULL, true_state, false_state);
 167         save_link_var_sym(left_name, left_sym, state_name);
 168         save_link_var_sym(right_name, right_sym, state_name);
 169 free:
 170         free_string(left_name);
 171         free_string(right_name);
 172 }
 173 
 174 static void print_return_comparison(int return_id, char *return_ranges, struct expression *expr)
 175 {
 176         struct sm_state *tmp;
 177         struct string_list *links;
 178         char *link;
 179         struct sm_state *sm;
 180         struct compare_data *data;
 181         struct var_sym *left, *right;
 182         int left_param, right_param;
 183         static char left_buf[248];
 184         static char right_buf[248];
 185         static char info_buf[256];
 186         const char *tmp_name;
 187 
 188         FOR_EACH_MY_SM(link_id, __get_cur_stree(), tmp) {
 189                 links = tmp->state->data;
 190                 FOR_EACH_PTR(links, link) {
 191                         sm = get_sm_state(compare_id, link, NULL);
 192                         if (!sm)
 193                                 continue;
 194                         data = sm->state->data;
 195                         if (!data || !data->comparison)
 196                                 continue;
 197                         if (ptr_list_size((struct ptr_list *)data->left_vsl) != 1 ||
 198                             ptr_list_size((struct ptr_list *)data->right_vsl) != 1)
 199                                 continue;
 200                         left = first_ptr_list((struct ptr_list *)data->left_vsl);
 201                         right = first_ptr_list((struct ptr_list *)data->right_vsl);
 202                         if (left->sym == right->sym &&
 203                             strcmp(left->var, right->var) == 0)
 204                                 continue;


 267                 return 0;
 268         }
 269 
 270         if (**value != ' ') {
 271                 sm_perror("parsing comparison.  %s", *value);
 272                 return 0;
 273         }
 274 
 275         (*value)++;
 276         return 1;
 277 }
 278 
 279 static int split_op_param_key(char *value, int *op, int *param, char **key)
 280 {
 281         static char buf[256];
 282         char *p;
 283 
 284         if (!parse_comparison(&value, op))
 285                 return 0;
 286 
 287         snprintf(buf, sizeof(buf), "%s", value);
 288 
 289         p = buf;
 290         if (*p++ != '$')
 291                 return 0;
 292 
 293         *param = atoi(p);
 294         if (*param < 0 || *param > 99)
 295                 return 0;
 296         p++;
 297         if (*param > 9)
 298                 p++;
 299         p--;
 300         *p = '$';
 301         *key = p;
 302 
 303         return 1;
 304 }
 305 
 306 static void db_return_comparison(struct expression *expr, int left_param, char *key, char *value)
 307 {


 340         right_name = get_variable_from_key(right_arg, right_key, &right_sym);
 341         if (!right_name || !right_sym)
 342                 goto free;
 343         if (get_param_num_from_sym(right_sym) < 0)
 344                 goto free;
 345 
 346         add_var_sym(&left_vsl, left_name, left_sym);
 347         add_var_sym(&right_vsl, right_name, right_sym);
 348 
 349         add_comparison_var_sym(left_name, left_vsl, op, right_name, right_vsl);
 350 
 351 free:
 352         free_string(left_name);
 353         free_string(right_name);
 354 }
 355 
 356 void register_param_compare_limit(int id)
 357 {
 358         compare_id = id;
 359 
 360         set_dynamic_states(compare_id);
 361         add_merge_hook(compare_id, &merge_compare_states);
 362         add_split_return_callback(&print_return_comparison);
 363 
 364         select_return_states_hook(COMPARE_LIMIT, &db_return_comparison);
 365 }
 366 
 367 void register_param_compare_limit_links(int id)
 368 {
 369         link_id = id;
 370 
 371         set_dynamic_states(link_id);
 372         add_merge_hook(link_id, &merge_links);

 373 }
 374