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;