2 * Copyright (C) 2006 Dan Carpenter.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt
19 * Miscellaneous helper functions.
26 #include "smatch_extra.h"
27 #include "smatch_slist.h"
31 char *alloc_string(const char *str
)
37 tmp
= malloc(strlen(str
) + 1);
42 void free_string(char *str
)
47 void remove_parens(char *str
)
52 while (*src
!= '\0') {
53 if (*src
== '(' || *src
== ')') {
62 struct smatch_state
*alloc_state_num(int num
)
64 struct smatch_state
*state
;
65 static char buff
[256];
67 state
= __alloc_smatch_state(0);
68 snprintf(buff
, 255, "%d", num
);
70 state
->name
= alloc_string(buff
);
71 state
->data
= INT_PTR(num
);
75 struct smatch_state
*alloc_state_str(const char *name
)
77 struct smatch_state
*state
;
79 state
= __alloc_smatch_state(0);
80 state
->name
= alloc_string(name
);
84 struct smatch_state
*alloc_state_expr(struct expression
*expr
)
86 struct smatch_state
*state
;
89 state
= __alloc_smatch_state(0);
90 expr
= strip_expr(expr
);
91 name
= expr_to_str(expr
);
92 state
->name
= alloc_sname(name
);
98 void append(char *dest
, const char *data
, int buff_len
)
100 strncat(dest
, data
, buff_len
- strlen(dest
) - 1);
104 * If you have "foo(a, b, 1);" then use
105 * get_argument_from_call_expr(expr, 0) to return the expression for
106 * a. Yes, it does start counting from 0.
108 struct expression
*get_argument_from_call_expr(struct expression_list
*args
,
111 struct expression
*expr
;
117 FOR_EACH_PTR(args
, expr
) {
121 } END_FOR_EACH_PTR(expr
);
125 static struct expression
*get_array_expr(struct expression
*expr
)
127 struct expression
*parent
;
130 if (expr
->type
!= EXPR_BINOP
|| expr
->op
!= '+')
133 type
= get_type(expr
->left
);
136 if (type
->type
== SYM_ARRAY
)
138 if (type
->type
!= SYM_PTR
)
141 parent
= expr_get_parent_expr(expr
);
142 if (!parent
) /* Sometimes we haven't set up the ->parent yet. FIXME!! */
144 if (parent
->type
== EXPR_PREOP
&& parent
->op
== '*')
150 static void __get_variable_from_expr(struct symbol
**sym_ptr
, char *buf
,
151 struct expression
*expr
, int len
,
152 int *complicated
, int no_parens
)
157 /* can't happen on valid code */
162 switch (expr
->type
) {
164 struct expression
*deref
;
170 struct expression
*unop
= strip_expr(deref
->unop
);
172 if (unop
->type
== EXPR_PREOP
&& unop
->op
== '&') {
177 if (!is_pointer(deref
))
182 __get_variable_from_expr(sym_ptr
, buf
, deref
, len
, complicated
, no_parens
);
185 append(buf
, "->", len
);
187 append(buf
, ".", len
);
190 append(buf
, expr
->member
->name
, len
);
192 append(buf
, "unknown_member", len
);
197 if (expr
->symbol_name
)
198 append(buf
, expr
->symbol_name
->name
, len
);
202 *sym_ptr
= expr
->symbol
;
208 if (get_expression_statement(expr
)) {
213 if (expr
->op
== '(') {
214 if (!no_parens
&& expr
->unop
->type
!= EXPR_SYMBOL
)
215 append(buf
, "(", len
);
216 } else if (expr
->op
!= '*' || !get_array_expr(expr
->unop
)) {
217 tmp
= show_special(expr
->op
);
218 append(buf
, tmp
, len
);
220 __get_variable_from_expr(sym_ptr
, buf
, expr
->unop
,
221 len
, complicated
, no_parens
);
223 if (expr
->op
== '(' && !no_parens
&& expr
->unop
->type
!= EXPR_SYMBOL
)
224 append(buf
, ")", len
);
226 if (expr
->op
== SPECIAL_DECREMENT
||
227 expr
->op
== SPECIAL_INCREMENT
)
235 __get_variable_from_expr(sym_ptr
, buf
, expr
->unop
,
236 len
, complicated
, no_parens
);
237 tmp
= show_special(expr
->op
);
238 append(buf
, tmp
, len
);
240 if (expr
->op
== SPECIAL_DECREMENT
|| expr
->op
== SPECIAL_INCREMENT
)
244 case EXPR_ASSIGNMENT
:
249 struct expression
*array_expr
;
252 array_expr
= get_array_expr(expr
);
254 __get_variable_from_expr(sym_ptr
, buf
, array_expr
, len
, complicated
, no_parens
);
255 append(buf
, "[", len
);
257 __get_variable_from_expr(sym_ptr
, buf
, expr
->left
, len
, complicated
, no_parens
);
258 snprintf(tmp
, sizeof(tmp
), " %s ", show_special(expr
->op
));
259 append(buf
, tmp
, len
);
261 __get_variable_from_expr(NULL
, buf
, expr
->right
, len
, complicated
, no_parens
);
263 append(buf
, "]", len
);
270 snprintf(tmp
, 25, "%lld", expr
->value
);
271 append(buf
, tmp
, len
);
275 append(buf
, "\"", len
);
277 append(buf
, expr
->string
->data
, len
);
278 append(buf
, "\"", len
);
281 struct expression
*tmp
;
285 __get_variable_from_expr(NULL
, buf
, expr
->fn
, len
, complicated
, no_parens
);
286 append(buf
, "(", len
);
288 FOR_EACH_PTR(expr
->args
, tmp
) {
290 append(buf
, ", ", len
);
291 __get_variable_from_expr(NULL
, buf
, tmp
, len
, complicated
, no_parens
);
292 } END_FOR_EACH_PTR(tmp
);
293 append(buf
, ")", len
);
297 case EXPR_FORCE_CAST
:
298 __get_variable_from_expr(sym_ptr
, buf
,
299 expr
->cast_expression
, len
,
300 complicated
, no_parens
);
307 if (expr
->cast_type
&& get_base_type(expr
->cast_type
)) {
308 size
= type_bytes(get_base_type(expr
->cast_type
));
309 snprintf(tmp
, 25, "%d", size
);
310 append(buf
, tmp
, len
);
311 } else if (get_value(expr
, &sval
)) {
312 snprintf(tmp
, 25, "%s", sval_to_str(sval
));
313 append(buf
, tmp
, len
);
317 case EXPR_IDENTIFIER
:
319 if (expr
->expr_ident
)
320 append(buf
, expr
->expr_ident
->name
, len
);
324 //printf("unknown type = %d\n", expr->type);
329 struct expr_str_cache_results
{
330 struct expression
*expr
;
337 static void get_variable_from_expr(struct symbol
**sym_ptr
, char *buf
,
338 struct expression
*expr
, int len
,
339 int *complicated
, int no_parens
)
341 static struct expr_str_cache_results cached
[8];
342 struct symbol
*tmp_sym
= NULL
;
346 for (i
= 0; i
< ARRAY_SIZE(cached
); i
++) {
347 if (expr
== cached
[i
].expr
&&
348 no_parens
== cached
[i
].no_parens
) {
349 strncpy(buf
, cached
[i
].str
, len
);
351 *sym_ptr
= cached
[i
].sym
;
352 *complicated
= cached
[i
].complicated
;
357 __get_variable_from_expr(&tmp_sym
, buf
, expr
, len
, complicated
, no_parens
);
361 cached
[idx
].expr
= expr
;
362 cached
[idx
].no_parens
= no_parens
;
363 strncpy(cached
[idx
].str
, buf
, VAR_LEN
);
364 cached
[idx
].sym
= tmp_sym
;
365 cached
[idx
].complicated
= *complicated
;
367 idx
= (idx
+ 1) % ARRAY_SIZE(cached
);
371 * This is returns a stylized "c looking" representation of the
374 * It uses the same buffer every time so you have to save the result
375 * yourself if you want to keep it.
379 char *expr_to_str_sym(struct expression
*expr
, struct symbol
**sym_ptr
)
381 static char var_name
[VAR_LEN
];
390 get_variable_from_expr(sym_ptr
, var_name
, expr
, sizeof(var_name
),
393 return alloc_string(var_name
);
398 char *expr_to_str(struct expression
*expr
)
400 return expr_to_str_sym(expr
, NULL
);
404 * get_variable_from_expr_simple() only returns simple variables.
405 * If it's a complicated variable like a->foo[x] instead of just 'a->foo'
406 * then it returns NULL.
408 char *expr_to_var_sym(struct expression
*expr
,
409 struct symbol
**sym_ptr
)
411 static char var_name
[VAR_LEN
];
420 expr
= strip_expr(expr
);
421 get_variable_from_expr(sym_ptr
, var_name
, expr
, sizeof(var_name
),
429 return alloc_string(var_name
);
432 char *expr_to_var(struct expression
*expr
)
434 return expr_to_var_sym(expr
, NULL
);
437 struct symbol
*expr_to_sym(struct expression
*expr
)
442 name
= expr_to_var_sym(expr
, &sym
);
447 int get_complication_score(struct expression
*expr
)
449 expr
= strip_expr(expr
);
452 * Don't forget to keep get_complication_score() and store_all_links()
460 switch (expr
->type
) {
465 return get_complication_score(expr
->left
) +
466 get_complication_score(expr
->right
);
470 if (expr
->op
== '*' || expr
->op
== '(')
471 return get_complication_score(expr
->unop
);
474 return get_complication_score(expr
->deref
);
483 struct expression
*reorder_expr_alphabetically(struct expression
*expr
)
485 struct expression
*ret
;
488 if (expr
->type
!= EXPR_BINOP
)
490 if (expr
->op
!= '+' && expr
->op
!= '*')
493 left
= expr_to_var(expr
->left
);
494 right
= expr_to_var(expr
->right
);
498 if (strcmp(left
, right
) <= 0)
501 ret
= binop_expression(expr
->right
, expr
->op
, expr
->left
);
509 char *expr_to_chunk_helper(struct expression
*expr
, struct symbol
**sym
, struct var_sym_list
**vsl
)
511 struct var_sym_list
*tmp_vsl
;
521 expr
= strip_parens(expr
);
525 name
= expr_to_var_sym(expr
, &tmp
);
530 *vsl
= expr_to_vsl(expr
);
535 score
= get_complication_score(expr
);
536 if (score
<= 0 || score
> 2)
539 tmp_vsl
= expr_to_vsl(expr
);
546 if (ptr_list_size((struct ptr_list
*)tmp_vsl
) == 1) {
549 vs
= first_ptr_list((struct ptr_list
*)tmp_vsl
);
554 expr
= reorder_expr_alphabetically(expr
);
556 return expr_to_str(expr
);
559 char *expr_to_known_chunk_sym(struct expression
*expr
, struct symbol
**sym
)
561 return expr_to_chunk_helper(expr
, sym
, NULL
);
564 char *expr_to_chunk_sym_vsl(struct expression
*expr
, struct symbol
**sym
, struct var_sym_list
**vsl
)
566 return expr_to_chunk_helper(expr
, sym
, vsl
);
569 int sym_name_is(const char *name
, struct expression
*expr
)
573 if (expr
->type
!= EXPR_SYMBOL
)
575 if (!strcmp(expr
->symbol_name
->name
, name
))
580 int is_zero(struct expression
*expr
)
584 if (get_value(expr
, &sval
) && sval
.value
== 0)
589 int is_array(struct expression
*expr
)
593 expr
= strip_expr(expr
);
597 if (expr
->type
== EXPR_PREOP
&& expr
->op
== '*') {
598 expr
= strip_expr(expr
->unop
);
601 if (expr
->type
== EXPR_BINOP
&& expr
->op
== '+')
605 if (expr
->type
!= EXPR_BINOP
|| expr
->op
!= '+')
608 type
= get_type(expr
->left
);
609 if (!type
|| type
->type
!= SYM_ARRAY
)
615 struct expression
*get_array_base(struct expression
*expr
)
619 expr
= strip_expr(expr
);
620 if (expr
->type
== EXPR_PREOP
&& expr
->op
== '*')
621 expr
= strip_expr(expr
->unop
);
622 if (expr
->type
!= EXPR_BINOP
|| expr
->op
!= '+')
624 return strip_parens(expr
->left
);
627 struct expression
*get_array_offset(struct expression
*expr
)
631 expr
= strip_expr(expr
);
632 if (expr
->type
== EXPR_PREOP
&& expr
->op
== '*')
633 expr
= strip_expr(expr
->unop
);
634 if (expr
->type
!= EXPR_BINOP
|| expr
->op
!= '+')
636 return strip_parens(expr
->right
);
639 const char *show_state(struct smatch_state
*state
)
646 struct statement
*get_expression_statement(struct expression
*expr
)
648 /* What are those things called? if (({....; ret;})) { ...*/
650 if (expr
->type
!= EXPR_PREOP
)
656 if (expr
->unop
->type
!= EXPR_STATEMENT
)
658 if (expr
->unop
->statement
->type
!= STMT_COMPOUND
)
660 return expr
->unop
->statement
;
663 struct expression
*strip_parens(struct expression
*expr
)
668 if (expr
->type
== EXPR_PREOP
) {
670 return expr
; /* parsing invalid code */
672 if (expr
->op
== '(' && expr
->unop
->type
== EXPR_STATEMENT
&&
673 expr
->unop
->statement
->type
== STMT_COMPOUND
)
676 return strip_parens(expr
->unop
);
681 static struct expression
*strip_expr_helper(struct expression
*expr
, bool set_parent
)
686 switch (expr
->type
) {
687 case EXPR_FORCE_CAST
:
690 expr_set_parent_expr(expr
->cast_expression
, expr
);
692 if (!expr
->cast_expression
)
694 return strip_expr_helper(expr
->cast_expression
, set_parent
);
696 struct expression
*unop
;
698 if (!expr
->unop
) /* parsing invalid code */
701 expr_set_parent_expr(expr
->unop
, expr
);
704 if (expr
->op
== '(' && expr
->unop
->type
== EXPR_STATEMENT
&&
705 expr
->unop
->statement
->type
== STMT_COMPOUND
)
708 unop
= strip_expr_helper(expr
->unop
, set_parent
);
710 if (expr
->op
== '*' && unop
&&
711 unop
->type
== EXPR_PREOP
&& unop
->op
== '&') {
712 struct symbol
*type
= get_type(unop
->unop
);
714 if (type
&& type
->type
== SYM_ARRAY
)
716 return strip_expr_helper(unop
->unop
, set_parent
);
724 case EXPR_CONDITIONAL
:
725 if (known_condition_true(expr
->conditional
)) {
726 if (expr
->cond_true
) {
728 expr_set_parent_expr(expr
->cond_true
, expr
);
729 return strip_expr_helper(expr
->cond_true
, set_parent
);
732 expr_set_parent_expr(expr
->conditional
, expr
);
733 return strip_expr_helper(expr
->conditional
, set_parent
);
735 if (known_condition_false(expr
->conditional
)) {
737 expr_set_parent_expr(expr
->cond_false
, expr
);
738 return strip_expr_helper(expr
->cond_false
, set_parent
);
742 if (sym_name_is("__builtin_expect", expr
->fn
) ||
743 sym_name_is("__builtin_bswap16", expr
->fn
) ||
744 sym_name_is("__builtin_bswap32", expr
->fn
) ||
745 sym_name_is("__builtin_bswap64", expr
->fn
)) {
746 expr
= get_argument_from_call_expr(expr
->args
, 0);
747 return strip_expr_helper(expr
, set_parent
);
754 struct expression
*strip_expr(struct expression
*expr
)
756 return strip_expr_helper(expr
, false);
759 struct expression
*strip_expr_set_parent(struct expression
*expr
)
761 return strip_expr_helper(expr
, true);
764 static void delete_state_tracker(struct tracker
*t
)
766 delete_state(t
->owner
, t
->name
, t
->sym
);
770 void scoped_state(int my_id
, const char *name
, struct symbol
*sym
)
774 t
= alloc_tracker(my_id
, name
, sym
);
775 add_scope_hook((scope_hook
*)&delete_state_tracker
, t
);
778 int is_error_return(struct expression
*expr
)
780 struct symbol
*cur_func
= cur_func_sym
;
781 struct range_list
*rl
;
786 if (cur_func
->type
!= SYM_NODE
)
788 cur_func
= get_base_type(cur_func
);
789 if (cur_func
->type
!= SYM_FN
)
791 cur_func
= get_base_type(cur_func
);
792 if (cur_func
== &void_ctype
)
794 if (option_project
== PROJ_KERNEL
&&
795 get_implied_rl(expr
, &rl
) &&
796 rl_type(rl
) == &int_ctype
&&
797 sval_is_negative(rl_min(rl
)) &&
798 rl_max(rl
).value
== -1)
800 if (!get_implied_value(expr
, &sval
))
804 if (cur_func
->type
== SYM_PTR
&& sval
.value
== 0)
809 int getting_address(void)
811 struct expression
*tmp
;
815 FOR_EACH_PTR_REVERSE(big_expression_stack
, tmp
) {
818 if (tmp
->type
== EXPR_PREOP
&& tmp
->op
== '(')
820 if (tmp
->op
== '.' && !dot_ops
++)
825 } END_FOR_EACH_PTR_REVERSE(tmp
);
829 int get_struct_and_member(struct expression
*expr
, const char **type
, const char **member
)
833 expr
= strip_expr(expr
);
834 if (expr
->type
!= EXPR_DEREF
)
839 sym
= get_type(expr
->deref
);
842 if (sym
->type
== SYM_UNION
)
847 *type
= sym
->ident
->name
;
848 *member
= expr
->member
->name
;
852 char *get_member_name(struct expression
*expr
)
857 expr
= strip_expr(expr
);
858 if (!expr
|| expr
->type
!= EXPR_DEREF
)
863 sym
= get_type(expr
->deref
);
866 if (sym
->type
== SYM_UNION
) {
867 snprintf(buf
, sizeof(buf
), "(union %s)->%s",
868 sym
->ident
? sym
->ident
->name
: "anonymous",
870 return alloc_string(buf
);
874 snprintf(buf
, sizeof(buf
), "(struct %s)->%s", sym
->ident
->name
, expr
->member
->name
);
875 return alloc_string(buf
);
878 int cmp_pos(struct position pos1
, struct position pos2
)
880 /* the stream position is ... */
881 if (pos1
.stream
> pos2
.stream
)
883 if (pos1
.stream
< pos2
.stream
)
886 if (pos1
.line
< pos2
.line
)
888 if (pos1
.line
> pos2
.line
)
891 if (pos1
.pos
< pos2
.pos
)
893 if (pos1
.pos
> pos2
.pos
)
899 int positions_eq(struct position pos1
, struct position pos2
)
901 if (pos1
.line
!= pos2
.line
)
903 if (pos1
.pos
!= pos2
.pos
)
905 if (pos1
.stream
!= pos2
.stream
)
910 struct statement
*get_current_statement(void)
912 struct statement
*prev
, *tmp
;
914 prev
= last_ptr_list((struct ptr_list
*)big_statement_stack
);
916 if (!prev
|| !get_macro_name(prev
->pos
))
919 FOR_EACH_PTR_REVERSE(big_statement_stack
, tmp
) {
920 if (positions_eq(tmp
->pos
, prev
->pos
))
922 if (prev
->pos
.line
> tmp
->pos
.line
)
925 } END_FOR_EACH_PTR_REVERSE(tmp
);
929 struct statement
*get_prev_statement(void)
931 struct statement
*tmp
;
935 FOR_EACH_PTR_REVERSE(big_statement_stack
, tmp
) {
938 } END_FOR_EACH_PTR_REVERSE(tmp
);
942 struct expression
*get_last_expr_from_expression_stmt(struct expression
*expr
)
944 struct statement
*stmt
;
945 struct statement
*last_stmt
;
947 while (expr
->type
== EXPR_PREOP
&& expr
->op
== '(')
949 if (expr
->type
!= EXPR_STATEMENT
)
951 stmt
= expr
->statement
;
954 if (stmt
->type
== STMT_COMPOUND
) {
955 last_stmt
= last_ptr_list((struct ptr_list
*)stmt
->stmts
);
958 if (last_stmt
->type
== STMT_LABEL
)
959 last_stmt
= last_stmt
->label_statement
;
960 if (last_stmt
->type
!= STMT_EXPRESSION
)
962 return last_stmt
->expression
;
964 if (stmt
->type
== STMT_EXPRESSION
)
965 return stmt
->expression
;
969 int get_param_num_from_sym(struct symbol
*sym
)
978 FOR_EACH_PTR(cur_func_sym
->ctype
.base_type
->arguments
, tmp
) {
982 } END_FOR_EACH_PTR(tmp
);
986 int get_param_num(struct expression
*expr
)
993 name
= expr_to_var_sym(expr
, &sym
);
997 return get_param_num_from_sym(sym
);
1000 int ms_since(struct timeval
*start
)
1005 gettimeofday(&end
, NULL
);
1006 diff
= (end
.tv_sec
- start
->tv_sec
) * 1000.0;
1007 diff
+= (end
.tv_usec
- start
->tv_usec
) / 1000.0;
1011 int parent_is_gone_var_sym(const char *name
, struct symbol
*sym
)
1016 if (parent_is_null_var_sym(name
, sym
) ||
1017 parent_is_free_var_sym(name
, sym
))
1022 int parent_is_gone(struct expression
*expr
)
1028 expr
= strip_expr(expr
);
1029 var
= expr_to_var_sym(expr
, &sym
);
1032 ret
= parent_is_gone_var_sym(var
, sym
);
1038 int invert_op(int op
)
1049 case SPECIAL_LEFTSHIFT
:
1050 return SPECIAL_RIGHTSHIFT
;
1051 case SPECIAL_RIGHTSHIFT
:
1052 return SPECIAL_LEFTSHIFT
;
1057 int expr_equiv(struct expression
*one
, struct expression
*two
)
1059 struct symbol
*one_sym
= NULL
;
1060 struct symbol
*two_sym
= NULL
;
1061 char *one_name
= NULL
;
1062 char *two_name
= NULL
;
1067 if (one
->type
!= two
->type
)
1070 one_name
= expr_to_str_sym(one
, &one_sym
);
1073 two_name
= expr_to_str_sym(two
, &two_sym
);
1076 if (one_sym
!= two_sym
)
1079 * This is a terrible hack because expr_to_str() sometimes gives up in
1080 * the middle and just returns what it has. If you see a () you know
1081 * the string is bogus.
1083 if (strstr(one_name
, "()"))
1085 if (strcmp(one_name
, two_name
) == 0)
1088 free_string(one_name
);
1089 free_string(two_name
);
1093 void push_int(struct int_stack
**stack
, int num
)
1098 * Just put the int on directly instead of a pointer to the int.
1099 * Shift it to the left because Sparse uses the last two bits.
1100 * This is sort of a dirty hack, yes.
1103 munged
= INT_PTR(num
<< 2);
1105 add_ptr_list(stack
, munged
);
1108 int pop_int(struct int_stack
**stack
)
1112 num
= last_ptr_list((struct ptr_list
*)*stack
);
1113 delete_ptr_list_last((struct ptr_list
**)stack
);
1115 return PTR_INT(num
) >> 2;