Print this page
new smatch

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/check_memset.c
          +++ new/usr/src/tools/smatch/src/check_memset.c
↓ open down ↓ 11 lines elided ↑ open up ↑
  12   12   * GNU General Public License for more details.
  13   13   *
  14   14   * You should have received a copy of the GNU General Public License
  15   15   * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt
  16   16   */
  17   17  
  18   18  #include "smatch.h"
  19   19  
  20   20  static int my_id;
  21   21  
  22      -static void match_memset(const char *fn, struct expression *expr, void *data)
       22 +static void check_size_not_zero(struct expression *expr)
  23   23  {
  24      -        struct expression *arg_expr;
  25   24          sval_t sval;
  26   25  
  27      -        arg_expr = get_argument_from_call_expr(expr->args, 2);
  28      -
  29      -        if (arg_expr->type != EXPR_VALUE)
       26 +        if (expr->type != EXPR_VALUE)
  30   27                  return;
  31      -        if (!get_value(arg_expr, &sval))
       28 +        if (!get_value(expr, &sval))
  32   29                  return;
  33   30          if (sval.value != 0)
  34   31                  return;
  35   32          sm_error("calling memset(x, y, 0);");
  36   33  }
  37   34  
       35 +static void check_size_not_ARRAY_SIZE(struct expression *expr)
       36 +{
       37 +        char *name;
       38 +
       39 +        name = get_macro_name(expr->pos);
       40 +        if (name && strcmp(name, "ARRAY_SIZE") == 0)
       41 +                sm_warning("calling memset(x, y, ARRAY_SIZE());");
       42 +}
       43 +
       44 +static void match_memset(const char *fn, struct expression *expr, void *data)
       45 +{
       46 +        struct expression *arg_expr;
       47 +
       48 +        arg_expr = get_argument_from_call_expr(expr->args, 2);
       49 +        if (!arg_expr)
       50 +                return;
       51 +        check_size_not_zero(arg_expr);
       52 +        check_size_not_ARRAY_SIZE(arg_expr);
       53 +}
       54 +
  38   55  void check_memset(int id)
  39   56  {
  40   57          my_id = id;
  41   58          add_function_hook("memset", &match_memset, NULL);
  42   59          add_function_hook("__builtin_memset", &match_memset, NULL);
  43   60  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX