Print this page
new smatch
*** 17,42 ****
#include "smatch.h"
static int my_id;
! static void match_memset(const char *fn, struct expression *expr, void *data)
{
- struct expression *arg_expr;
sval_t sval;
! arg_expr = get_argument_from_call_expr(expr->args, 2);
!
! if (arg_expr->type != EXPR_VALUE)
return;
! if (!get_value(arg_expr, &sval))
return;
if (sval.value != 0)
return;
sm_error("calling memset(x, y, 0);");
}
void check_memset(int id)
{
my_id = id;
add_function_hook("memset", &match_memset, NULL);
add_function_hook("__builtin_memset", &match_memset, NULL);
--- 17,59 ----
#include "smatch.h"
static int my_id;
! static void check_size_not_zero(struct expression *expr)
{
sval_t sval;
! if (expr->type != EXPR_VALUE)
return;
! if (!get_value(expr, &sval))
return;
if (sval.value != 0)
return;
sm_error("calling memset(x, y, 0);");
}
+ static void check_size_not_ARRAY_SIZE(struct expression *expr)
+ {
+ char *name;
+
+ name = get_macro_name(expr->pos);
+ if (name && strcmp(name, "ARRAY_SIZE") == 0)
+ sm_warning("calling memset(x, y, ARRAY_SIZE());");
+ }
+
+ static void match_memset(const char *fn, struct expression *expr, void *data)
+ {
+ struct expression *arg_expr;
+
+ arg_expr = get_argument_from_call_expr(expr->args, 2);
+ if (!arg_expr)
+ return;
+ check_size_not_zero(arg_expr);
+ check_size_not_ARRAY_SIZE(arg_expr);
+ }
+
void check_memset(int id)
{
my_id = id;
add_function_hook("memset", &match_memset, NULL);
add_function_hook("__builtin_memset", &match_memset, NULL);