2 * Copyright (C) 2012 Oracle.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt
19 #include "smatch_extra.h"
20 #include "smatch_slist.h"
24 static struct symbol
*get_cast_type(struct expression
*expr
)
26 if (!expr
|| expr
->type
!= EXPR_PREOP
|| expr
->op
!= '*')
28 expr
= strip_parens(expr
->unop
);
29 if (expr
->type
!= EXPR_CAST
)
31 return get_pointer_type(expr
);
34 static void match_overflow(struct expression
*expr
)
36 struct expression
*ptr
;
41 type
= get_cast_type(expr
->left
);
44 cast_size
= bits_to_bytes(type
->bit_size
);
46 ptr
= strip_expr(expr
->left
->unop
);
47 data_size
= get_array_size_bytes_min(ptr
);
50 if (data_size
>= cast_size
)
52 sm_msg("warn: potential memory corrupting cast %d vs %d bytes",
53 cast_size
, data_size
);
56 void check_cast_assign(int id
)
59 add_hook(&match_overflow
, ASSIGNMENT_HOOK
);