pointer_math: check for (int *)p += sizeof(int);
[smatch.git] / smatch_project.c
blobc1049869cc410c6cece5b50edbc4862a64677680
1 /*
2 * sparse/smatch_project.c
4 * Copyright (C) 2010 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
8 */
11 * This file is only for very generic stuff, that is reusable
12 * between projects. If you need something special create a
13 * check_your_project.c.
17 #include "smatch.h"
18 #include "smatch_extra.h"
20 static void register_no_return_funcs(void)
22 struct token *token;
23 const char *func;
24 char name[256];
26 if (option_project == PROJ_NONE)
27 strcpy(name, "no_return_funcs");
28 else
29 snprintf(name, 256, "%s.no_return_funcs", option_project_str);
31 token = get_tokens_file(name);
32 if (!token)
33 return;
34 if (token_type(token) != TOKEN_STREAMBEGIN)
35 return;
36 token = token->next;
37 while (token_type(token) != TOKEN_STREAMEND) {
38 if (token_type(token) != TOKEN_IDENT)
39 return;
40 func = show_ident(token->ident);
41 add_function_hook(func, &__match_nullify_path_hook, NULL);
42 token = token->next;
44 clear_token_alloc();
47 static void return_implies(struct expression *call_expr, int param, char *key, char *value)
49 struct range_list *rl;
50 struct expression *arg;
52 if (call_expr->type == EXPR_ASSIGNMENT)
53 call_expr = strip_expr(call_expr->right);
55 arg = get_argument_from_call_expr(call_expr->args, param);
56 parse_value_ranges_type(get_type(call_expr), value, &rl);
57 set_extra_expr_nomod(arg, alloc_estate_range_list(rl));
60 static void register_ignored_macros(void)
62 struct token *token;
63 char *macro;
64 char name[256];
66 if (option_project == PROJ_NONE)
67 strcpy(name, "ignored_macros");
68 else
69 snprintf(name, 256, "%s.ignored_macros", option_project_str);
71 token = get_tokens_file(name);
72 if (!token)
73 return;
74 if (token_type(token) != TOKEN_STREAMBEGIN)
75 return;
76 token = token->next;
77 while (token_type(token) != TOKEN_STREAMEND) {
78 if (token_type(token) != TOKEN_IDENT)
79 return;
80 macro = alloc_string(show_ident(token->ident));
81 add_ptr_list(&__ignored_macros, macro);
82 token = token->next;
84 clear_token_alloc();
87 void register_project(int id)
89 register_no_return_funcs();
90 register_ignored_macros();
91 add_db_return_implies_callback(RANGE_CAP, &return_implies);