math: handle foo = !2;
[smatch.git] / check_db_info.c
blob59310ae92c64b760ffb2604dc6c64ddbf0a2209d
1 /*
2 * smatch/check_db_info.c
4 * Copyright (C) 2010 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
8 */
10 #include "smatch.h"
11 #include "smatch_extra.h"
13 static int my_id;
15 static struct range_list *return_ranges;
17 static void add_return_range(struct range_list *rl)
19 if (!return_ranges) {
20 return_ranges = rl;
21 return;
23 return_ranges = range_list_union(return_ranges, rl);
26 static void match_return(struct expression *ret_value)
28 struct smatch_state *state;
29 struct range_list *rl;
30 long long val;
32 ret_value = strip_expr(ret_value);
33 if (!ret_value)
34 return;
36 if (ret_value->type == EXPR_CALL) {
37 rl = db_return_vals(ret_value);
38 if (rl) {
39 sm_msg("info: return_value %s", show_ranges(rl));
40 add_return_range(rl);
41 } else {
42 sm_msg("info: return_value unknown");
43 add_return_range(whole_range_list());
45 return;
48 if (get_value(ret_value, &val)) {
49 sm_msg("info: return_value %lld", val);
50 add_return_range(alloc_range_list(val, val));
51 return;
53 state = get_state_expr(SMATCH_EXTRA, ret_value);
54 if (!state) {
55 sm_msg("info: return_value unknown");
56 add_return_range(whole_range_list());
57 return;
60 sm_msg("info: return_value %s", state->name);
61 add_return_range(whole_range_list());
64 static void match_end_func(struct symbol *sym)
66 if (!return_ranges)
67 return;
68 sm_msg("info: function_return_values '%s'", show_ranges(return_ranges));
69 return_ranges = NULL;
72 void check_db_info(int id)
74 if (!option_info)
75 return;
76 my_id = id;
77 add_hook(&match_return, RETURN_HOOK);
78 add_hook(&match_end_func, END_FUNC_HOOK);