| 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) |
nothing calls this directly
no test coverage detected