Print this page
new smatch


 330                 return 0;
 331 
 332         expr = strip_expr(expr);
 333         if (!expr)
 334                 return 0;
 335 
 336         if (is_array(expr))
 337                 return get_array_mtag_offset(expr, tag, offset);
 338 
 339         if (expr->type == EXPR_PREOP && expr->op == '*') {
 340                 expr = strip_expr(expr->unop);
 341                 return get_implied_mtag_offset(expr, tag, offset);
 342         } else if (expr->type == EXPR_DEREF) {
 343                 int tmp, tmp_offset = 0;
 344 
 345                 while (expr->type == EXPR_DEREF) {
 346                         tmp = get_member_offset_from_deref(expr);
 347                         if (tmp < 0)
 348                                 return 0;
 349                         tmp_offset += tmp;
 350                         expr = expr->deref;
 351                 }
 352                 *offset = tmp_offset;
 353                 if (expr->type == EXPR_PREOP && expr->op == '*') {
 354                         expr = strip_expr(expr->unop);
 355 
 356                         if (get_implied_mtag_offset(expr, tag, &tmp_offset)) {
 357                                 // FIXME:  look it up recursively?
 358                                 if (tmp_offset)
 359                                         return 0;
 360                                 return 1;
 361                         }
 362                         return 0;
 363                 } else if (expr->type == EXPR_SYMBOL) {
 364                         return get_symbol_mtag(expr->symbol, tag);
 365                 }
 366                 return 0;
 367         } else if (expr->type == EXPR_SYMBOL) {
 368                 return get_symbol_mtag(expr->symbol, tag);
 369         }
 370         return 0;




 330                 return 0;
 331 
 332         expr = strip_expr(expr);
 333         if (!expr)
 334                 return 0;
 335 
 336         if (is_array(expr))
 337                 return get_array_mtag_offset(expr, tag, offset);
 338 
 339         if (expr->type == EXPR_PREOP && expr->op == '*') {
 340                 expr = strip_expr(expr->unop);
 341                 return get_implied_mtag_offset(expr, tag, offset);
 342         } else if (expr->type == EXPR_DEREF) {
 343                 int tmp, tmp_offset = 0;
 344 
 345                 while (expr->type == EXPR_DEREF) {
 346                         tmp = get_member_offset_from_deref(expr);
 347                         if (tmp < 0)
 348                                 return 0;
 349                         tmp_offset += tmp;
 350                         expr = strip_expr(expr->deref);
 351                 }
 352                 *offset = tmp_offset;
 353                 if (expr->type == EXPR_PREOP && expr->op == '*') {
 354                         expr = strip_expr(expr->unop);
 355 
 356                         if (get_implied_mtag_offset(expr, tag, &tmp_offset)) {
 357                                 // FIXME:  look it up recursively?
 358                                 if (tmp_offset)
 359                                         return 0;
 360                                 return 1;
 361                         }
 362                         return 0;
 363                 } else if (expr->type == EXPR_SYMBOL) {
 364                         return get_symbol_mtag(expr->symbol, tag);
 365                 }
 366                 return 0;
 367         } else if (expr->type == EXPR_SYMBOL) {
 368                 return get_symbol_mtag(expr->symbol, tag);
 369         }
 370         return 0;