MCPcopy Create free account
hub / github.com/KasperskyLab/hrtng / visit_expr

Function visit_expr

src/new_struct.cpp:97–213  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

95 }
96
97 int idaapi visit_expr(cexpr_t *e)
98 {
99 // varL = varR;
100 if (e->op == cot_asg && e->x->op == cot_var && e->y->op == cot_var) {
101 if(e->y->type == e->x->type) {//same type
102 int lft_var_idx = e->x->v.idx;
103 int rgt_var_idx = e->y->v.idx;
104 bool left = is_our(lft_var_idx);
105 bool right = is_our(rgt_var_idx);
106 bool swaped = false;
107 if(left && !right) {
108 std::swap(lft_var_idx, rgt_var_idx);
109 swaped = true;
110 }
111 if(swaped || (!left && right)) {
112 idxs.insert(lft_var_idx);
113 offsets[lft_var_idx] = offset_for_var_idx(rgt_var_idx);
114 Log(llNotice, "scanning also var '%s'\n", (*lvars)[(size_t)lft_var_idx].name.c_str());
115 }
116 }
117 return 0;
118 }
119
120 bool is_lvar = (e->op == cot_var && is_our(e->v.idx));
121 bool is_glob_obj_ptr = (e->op == cot_obj && is_our(e->obj_ea));
122 if(!is_lvar && !is_glob_obj_ptr)
123 return 0;
124
125 ea_t index = 0;
126 if (is_lvar)
127 index = e->v.idx;
128 else
129 index = e->obj_ea;
130
131 // found our var. are we inside a pointer expression?
132 bool is_ptr = false;
133 bool is_array = false;
134 uint64 delta = 0;
135 uval_t cur_var_offset = offset_for_var_idx(index);
136 bool delta_defined = true;
137
138 int i = (int)parents.size() - 1;
139 if(i >= 0 && parents[i]->op == cot_add) { // possible delta
140 cexpr_t *d = ((cexpr_t*)parents[i])->theother(e);
141 delta_defined = d->get_const_value(&delta);
142 i--;
143 if(i >= 0 && parents[i]->op == cot_add) {
144 cexpr_t *d = ((cexpr_t*)parents[i])->theother((cexpr_t*)parents[i+1]);
145 delta_defined = d->get_const_value(&delta);
146 is_array = true;
147 i--;
148 }
149 }
150
151 tinfo_t tvtbl;
152 handle_vtables(is_ptr, delta, i, tvtbl);
153
154 if(!delta_defined)

Callers

nothing calls this directly

Calls 10

offset_for_var_idxFunction · 0.85
LogFunction · 0.85
handle_vtablesFunction · 0.85
is_funcFunction · 0.85
get_idx_ofFunction · 0.85
sizeMethod · 0.80
emptyMethod · 0.80
update_max_offsetMethod · 0.80
is_ourFunction · 0.70
clearMethod · 0.45

Tested by

no test coverage detected