Lines Matching refs:expr

106 struct smatch_state *alloc_state_expr(struct expression *expr)  in alloc_state_expr()  argument
111 expr = strip_expr(expr); in alloc_state_expr()
112 name = expr_to_str(expr); in alloc_state_expr()
119 state->data = expr; in alloc_state_expr()
136 struct expression *expr; in get_argument_from_call_expr() local
142 FOR_EACH_PTR(args, expr) { in get_argument_from_call_expr()
144 return expr; in get_argument_from_call_expr()
146 } END_FOR_EACH_PTR(expr); in get_argument_from_call_expr()
150 struct expression *get_array_expr(struct expression *expr) in get_array_expr() argument
155 if (expr->type != EXPR_BINOP || expr->op != '+') in get_array_expr()
158 type = get_type(expr->left); in get_array_expr()
162 return expr->left; in get_array_expr()
166 parent = expr_get_parent_expr(expr); in get_array_expr()
168 return expr->left; in get_array_expr()
170 return expr->left; in get_array_expr()
176 struct expression *expr, int len, in __get_variable_from_expr() argument
179 if (!expr) { in __get_variable_from_expr()
185 switch (expr->type) { in __get_variable_from_expr()
190 deref = expr->deref; in __get_variable_from_expr()
212 if (expr->member) in __get_variable_from_expr()
213 append(buf, expr->member->name, len); in __get_variable_from_expr()
220 if (expr->symbol_name) in __get_variable_from_expr()
221 append(buf, expr->symbol_name->name, len); in __get_variable_from_expr()
225 *sym_ptr = expr->symbol; in __get_variable_from_expr()
231 if (get_expression_statement(expr)) { in __get_variable_from_expr()
236 if (expr->op == '(') { in __get_variable_from_expr()
237 if (expr->unop->type != EXPR_SYMBOL) in __get_variable_from_expr()
239 } else if (expr->op != '*' || !get_array_expr(expr->unop)) { in __get_variable_from_expr()
240 tmp = show_special(expr->op); in __get_variable_from_expr()
243 __get_variable_from_expr(sym_ptr, buf, expr->unop, in __get_variable_from_expr()
246 if (expr->op == '(' && expr->unop->type != EXPR_SYMBOL) in __get_variable_from_expr()
249 if (expr->op == SPECIAL_DECREMENT || in __get_variable_from_expr()
250 expr->op == SPECIAL_INCREMENT) in __get_variable_from_expr()
258 __get_variable_from_expr(sym_ptr, buf, expr->unop, in __get_variable_from_expr()
260 tmp = show_special(expr->op); in __get_variable_from_expr()
263 if (expr->op == SPECIAL_DECREMENT || expr->op == SPECIAL_INCREMENT) in __get_variable_from_expr()
275 array_expr = get_array_expr(expr); in __get_variable_from_expr()
280 __get_variable_from_expr(sym_ptr, buf, expr->left, len, complicated); in __get_variable_from_expr()
281 snprintf(tmp, sizeof(tmp), " %s ", show_special(expr->op)); in __get_variable_from_expr()
284 __get_variable_from_expr(NULL, buf, expr->right, len, complicated); in __get_variable_from_expr()
294 if (!get_value(expr, &sval)) in __get_variable_from_expr()
305 if (!get_value(expr, &sval)) in __get_variable_from_expr()
313 if (expr->string) in __get_variable_from_expr()
314 append(buf, expr->string->data, len); in __get_variable_from_expr()
322 __get_variable_from_expr(NULL, buf, expr->fn, len, complicated); in __get_variable_from_expr()
325 FOR_EACH_PTR(expr->args, tmp) { in __get_variable_from_expr()
336 expr->cast_expression, len, in __get_variable_from_expr()
344 if (expr->cast_type && get_base_type(expr->cast_type)) { in __get_variable_from_expr()
345 size = type_bytes(get_base_type(expr->cast_type)); in __get_variable_from_expr()
348 } else if (get_value(expr, &sval)) { in __get_variable_from_expr()
356 if (expr->expr_ident) in __get_variable_from_expr()
357 append(buf, expr->expr_ident->name, len); in __get_variable_from_expr()
363 __get_variable_from_expr(NULL, buf, expr->conditional, len, complicated); in __get_variable_from_expr()
365 if (expr->cond_true) in __get_variable_from_expr()
366 __get_variable_from_expr(NULL, buf, expr->cond_true, len, complicated); in __get_variable_from_expr()
368 __get_variable_from_expr(NULL, buf, expr->cond_false, len, complicated); in __get_variable_from_expr()
373 snprintf(tmp, sizeof(tmp), "$expr_%p(%d)", expr, expr->type); in __get_variable_from_expr()
382 struct expression *expr; member
389 struct expression *expr, int len, in get_variable_from_expr() argument
398 if (expr == cached[i].expr) { in get_variable_from_expr()
407 __get_variable_from_expr(&tmp_sym, buf, expr, len, complicated); in get_variable_from_expr()
411 if (expr->smatch_flags & Tmp) in get_variable_from_expr()
414 cached[idx].expr = expr; in get_variable_from_expr()
431 char *expr_to_str_sym(struct expression *expr, struct symbol **sym_ptr) in expr_to_str_sym() argument
440 if (!expr) in expr_to_str_sym()
442 get_variable_from_expr(sym_ptr, var_name, expr, sizeof(var_name), in expr_to_str_sym()
450 char *expr_to_str(struct expression *expr) in expr_to_str() argument
452 return expr_to_str_sym(expr, NULL); in expr_to_str()
460 char *expr_to_var_sym(struct expression *expr, in expr_to_var_sym() argument
470 if (!expr) in expr_to_var_sym()
472 expr = strip_expr(expr); in expr_to_var_sym()
473 get_variable_from_expr(sym_ptr, var_name, expr, sizeof(var_name), in expr_to_var_sym()
484 char *expr_to_var(struct expression *expr) in expr_to_var() argument
486 return expr_to_var_sym(expr, NULL); in expr_to_var()
489 struct symbol *expr_to_sym(struct expression *expr) in expr_to_sym() argument
494 name = expr_to_var_sym(expr, &sym); in expr_to_sym()
499 int get_complication_score(struct expression *expr) in get_complication_score() argument
501 expr = strip_expr(expr); in get_complication_score()
509 if (!expr) in get_complication_score()
512 switch (expr->type) { in get_complication_score()
517 return get_complication_score(expr->left) + in get_complication_score()
518 get_complication_score(expr->right); in get_complication_score()
522 if (expr->op == '*' || expr->op == '(') in get_complication_score()
523 return get_complication_score(expr->unop); in get_complication_score()
526 return get_complication_score(expr->deref); in get_complication_score()
535 struct expression *reorder_expr_alphabetically(struct expression *expr) in reorder_expr_alphabetically() argument
540 if (expr->type != EXPR_BINOP) in reorder_expr_alphabetically()
541 return expr; in reorder_expr_alphabetically()
542 if (expr->op != '+' && expr->op != '*') in reorder_expr_alphabetically()
543 return expr; in reorder_expr_alphabetically()
545 left = expr_to_var(expr->left); in reorder_expr_alphabetically()
546 right = expr_to_var(expr->right); in reorder_expr_alphabetically()
547 ret = expr; in reorder_expr_alphabetically()
553 ret = binop_expression(expr->right, expr->op, expr->left); in reorder_expr_alphabetically()
561 char *expr_to_chunk_helper(struct expression *expr, struct symbol **sym, struct var_sym_list **vsl) in expr_to_chunk_helper() argument
573 expr = strip_parens(expr); in expr_to_chunk_helper()
574 if (!expr) in expr_to_chunk_helper()
577 name = expr_to_var_sym(expr, &tmp); in expr_to_chunk_helper()
587 score = get_complication_score(expr); in expr_to_chunk_helper()
591 tmp_vsl = expr_to_vsl(expr); in expr_to_chunk_helper()
606 expr = reorder_expr_alphabetically(expr); in expr_to_chunk_helper()
608 return expr_to_str(expr); in expr_to_chunk_helper()
611 char *expr_to_known_chunk_sym(struct expression *expr, struct symbol **sym) in expr_to_known_chunk_sym() argument
613 return expr_to_chunk_helper(expr, sym, NULL); in expr_to_known_chunk_sym()
616 char *expr_to_chunk_sym_vsl(struct expression *expr, struct symbol **sym, struct var_sym_list **vsl) in expr_to_chunk_sym_vsl() argument
618 return expr_to_chunk_helper(expr, sym, vsl); in expr_to_chunk_sym_vsl()
621 int sym_name_is(const char *name, struct expression *expr) in sym_name_is() argument
623 if (!expr) in sym_name_is()
625 if (expr->type != EXPR_SYMBOL) in sym_name_is()
627 if (!strcmp(expr->symbol_name->name, name)) in sym_name_is()
632 int expr_is_zero(struct expression *expr) in expr_is_zero() argument
636 if (get_value(expr, &sval) && sval.value == 0) in expr_is_zero()
641 int is_array(struct expression *expr) in is_array() argument
645 expr = strip_expr(expr); in is_array()
646 if (!expr) in is_array()
649 if (expr->type == EXPR_PREOP && expr->op == '*') { in is_array()
650 expr = strip_expr(expr->unop); in is_array()
651 if (!expr) in is_array()
653 if (expr->type == EXPR_BINOP && expr->op == '+') in is_array()
657 if (expr->type != EXPR_BINOP || expr->op != '+') in is_array()
660 type = get_type(expr->left); in is_array()
667 struct expression *get_array_base(struct expression *expr) in get_array_base() argument
669 if (!is_array(expr)) in get_array_base()
671 expr = strip_expr(expr); in get_array_base()
672 if (expr->type == EXPR_PREOP && expr->op == '*') in get_array_base()
673 expr = strip_expr(expr->unop); in get_array_base()
674 if (expr->type != EXPR_BINOP || expr->op != '+') in get_array_base()
676 return strip_parens(expr->left); in get_array_base()
679 struct expression *get_array_offset(struct expression *expr) in get_array_offset() argument
681 if (!is_array(expr)) in get_array_offset()
683 expr = strip_expr(expr); in get_array_offset()
684 if (expr->type == EXPR_PREOP && expr->op == '*') in get_array_offset()
685 expr = strip_expr(expr->unop); in get_array_offset()
686 if (expr->type != EXPR_BINOP || expr->op != '+') in get_array_offset()
688 return strip_parens(expr->right); in get_array_offset()
698 struct statement *get_expression_statement(struct expression *expr) in get_expression_statement() argument
702 if (expr->type != EXPR_PREOP) in get_expression_statement()
704 if (expr->op != '(') in get_expression_statement()
706 if (!expr->unop) in get_expression_statement()
708 if (expr->unop->type != EXPR_STATEMENT) in get_expression_statement()
710 if (expr->unop->statement->type != STMT_COMPOUND) in get_expression_statement()
712 return expr->unop->statement; in get_expression_statement()
715 struct expression *strip_parens(struct expression *expr) in strip_parens() argument
717 if (!expr) in strip_parens()
720 if (expr->type == EXPR_PREOP) { in strip_parens()
721 if (!expr->unop) in strip_parens()
722 return expr; /* parsing invalid code */ in strip_parens()
724 if (expr->op == '(' && expr->unop->type == EXPR_STATEMENT && in strip_parens()
725 expr->unop->statement->type == STMT_COMPOUND) in strip_parens()
726 return expr; in strip_parens()
727 if (expr->op == '(') in strip_parens()
728 return strip_parens(expr->unop); in strip_parens()
730 return expr; in strip_parens()
733 static struct expression *strip_expr_helper(struct expression *expr, bool set_parent) in strip_expr_helper() argument
735 if (!expr) in strip_expr_helper()
738 switch (expr->type) { in strip_expr_helper()
742 expr_set_parent_expr(expr->cast_expression, expr); in strip_expr_helper()
744 if (!expr->cast_expression) in strip_expr_helper()
745 return expr; in strip_expr_helper()
746 return strip_expr_helper(expr->cast_expression, set_parent); in strip_expr_helper()
750 if (!expr->unop) /* parsing invalid code */ in strip_expr_helper()
751 return expr; in strip_expr_helper()
753 expr_set_parent_expr(expr->unop, expr); in strip_expr_helper()
756 if (expr->op == '(' && expr->unop->type == EXPR_STATEMENT && in strip_expr_helper()
757 expr->unop->statement->type == STMT_COMPOUND) in strip_expr_helper()
758 return expr; in strip_expr_helper()
760 unop = strip_expr_helper(expr->unop, set_parent); in strip_expr_helper()
762 if (expr->op == '*' && unop && in strip_expr_helper()
767 return expr; in strip_expr_helper()
771 if (expr->op == '(') in strip_expr_helper()
774 return expr; in strip_expr_helper()
777 if (known_condition_true(expr->conditional)) { in strip_expr_helper()
778 if (expr->cond_true) { in strip_expr_helper()
780 expr_set_parent_expr(expr->cond_true, expr); in strip_expr_helper()
781 return strip_expr_helper(expr->cond_true, set_parent); in strip_expr_helper()
784 expr_set_parent_expr(expr->conditional, expr); in strip_expr_helper()
785 return strip_expr_helper(expr->conditional, set_parent); in strip_expr_helper()
787 if (known_condition_false(expr->conditional)) { in strip_expr_helper()
789 expr_set_parent_expr(expr->cond_false, expr); in strip_expr_helper()
790 return strip_expr_helper(expr->cond_false, set_parent); in strip_expr_helper()
792 return expr; in strip_expr_helper()
794 if (sym_name_is("__builtin_expect", expr->fn) || in strip_expr_helper()
795 sym_name_is("__builtin_bswap16", expr->fn) || in strip_expr_helper()
796 sym_name_is("__builtin_bswap32", expr->fn) || in strip_expr_helper()
797 sym_name_is("__builtin_bswap64", expr->fn)) { in strip_expr_helper()
798 expr = get_argument_from_call_expr(expr->args, 0); in strip_expr_helper()
799 return strip_expr_helper(expr, set_parent); in strip_expr_helper()
801 return expr; in strip_expr_helper()
803 return expr; in strip_expr_helper()
806 struct expression *strip_expr(struct expression *expr) in strip_expr() argument
808 return strip_expr_helper(expr, false); in strip_expr()
811 struct expression *strip_expr_set_parent(struct expression *expr) in strip_expr_set_parent() argument
813 return strip_expr_helper(expr, true); in strip_expr_set_parent()
830 int is_error_return(struct expression *expr) in is_error_return() argument
836 if (!expr) in is_error_return()
847 get_implied_rl(expr, &rl) && in is_error_return()
852 if (!get_implied_value(expr, &sval)) in is_error_return()
861 int getting_address(struct expression *expr) in getting_address() argument
865 while ((expr = expr_get_parent_expr(expr))) { in getting_address()
866 if (expr->type == EXPR_PREOP && expr->op == '*') { in getting_address()
872 if (expr->type == EXPR_PREOP && expr->op == '&') in getting_address()
878 int get_struct_and_member(struct expression *expr, const char **type, const char **member) in get_struct_and_member() argument
882 expr = strip_expr(expr); in get_struct_and_member()
883 if (expr->type != EXPR_DEREF) in get_struct_and_member()
885 if (!expr->member) in get_struct_and_member()
888 sym = get_type(expr->deref); in get_struct_and_member()
897 *member = expr->member->name; in get_struct_and_member()
901 char *get_member_name(struct expression *expr) in get_member_name() argument
906 expr = strip_expr(expr); in get_member_name()
907 if (!expr || expr->type != EXPR_DEREF) in get_member_name()
909 if (!expr->member) in get_member_name()
912 sym = get_type(expr->deref); in get_member_name()
918 expr->member->name); in get_member_name()
933 deref = expr->deref; in get_member_name()
940 full = expr_to_str(expr); in get_member_name()
967 snprintf(buf, sizeof(buf), "(struct %s)->%s", sym->ident->name, expr->member->name); in get_member_name()
1035 struct expression *get_last_expr_from_expression_stmt(struct expression *expr) in get_last_expr_from_expression_stmt() argument
1040 while (expr->type == EXPR_PREOP && expr->op == '(') in get_last_expr_from_expression_stmt()
1041 expr = expr->unop; in get_last_expr_from_expression_stmt()
1042 if (expr->type != EXPR_STATEMENT) in get_last_expr_from_expression_stmt()
1044 stmt = expr->statement; in get_last_expr_from_expression_stmt()
1094 int get_param_num(struct expression *expr) in get_param_num() argument
1101 name = expr_to_var_sym(expr, &sym); in get_param_num()
1146 int parent_is_gone(struct expression *expr) in parent_is_gone() argument
1152 expr = strip_expr(expr); in parent_is_gone()
1153 var = expr_to_var_sym(expr, &sym); in parent_is_gone()