Print this page
12724 update smatch to 0.6.1-rc1-il-5

*** 549,558 **** --- 549,568 ---- if (expr->string) return 1; return 0; } + bool is_struct_ptr(struct symbol *type) + { + if (!type || type->type != SYM_PTR) + return false; + type = get_real_base_type(type); + if (!type || type->type != SYM_STRUCT) + return false; + return true; + } + int is_static(struct expression *expr) { char *name; struct symbol *sym; int ret = 0;
*** 593,602 **** --- 603,629 ---- if (type_positive_bits(one) != type_positive_bits(two)) return 0; return 1; } + bool type_fits(struct symbol *type, struct symbol *test) + { + if (!type || !test) + return false; + + if (type == test) + return true; + + if (type_bits(test) > type_bits(type)) + return false; + if (type_signed(test) && !type_signed(type)) + return false; + if (type_positive_bits(test) > type_positive_bits(type)) + return false; + return true; + } + int fn_static(void) { return !!(cur_func_sym->ctype.modifiers & MOD_STATIC); }
*** 683,692 **** --- 710,721 ---- } struct symbol *get_member_type_from_key(struct expression *expr, const char *key) { struct symbol *sym; + int star = 0; + int i; if (strcmp(key, "$") == 0) return get_type(expr); if (strcmp(key, "*$") == 0) {
*** 700,714 **** if (!sym) return NULL; if (sym->type == SYM_PTR) sym = get_real_base_type(sym); ! key = key + 1; sym = get_member_from_string(sym->symbol_list, key); if (!sym) return NULL; ! return get_real_base_type(sym); } struct symbol *get_arg_type_from_key(struct expression *fn, int param, struct expression *arg, const char *key) { struct symbol *type; --- 729,758 ---- if (!sym) return NULL; if (sym->type == SYM_PTR) sym = get_real_base_type(sym); ! while (*key == '*') { ! key++; ! star++; ! } ! ! if (*key != '$') ! return NULL; ! key++; ! sym = get_member_from_string(sym->symbol_list, key); if (!sym) return NULL; ! if (sym->type == SYM_RESTRICT || sym->type == SYM_NODE) ! sym = get_real_base_type(sym); ! for (i = 0; i < star; i++) { ! if (!sym || sym->type != SYM_PTR) ! return NULL; ! sym = get_real_base_type(sym); ! } ! return sym; } struct symbol *get_arg_type_from_key(struct expression *fn, int param, struct expression *arg, const char *key) { struct symbol *type;