Print this page
11506 smatch resync
*** 18,27 ****
--- 18,28 ----
#include "smatch.h"
#include "smatch_slist.h"
STATE(ignore);
static struct stree *ignored;
+ static struct stree *ignored_from_file;
void add_ignore(int owner, const char *name, struct symbol *sym)
{
set_state_stree(&ignored, owner, name, sym, &ignore);
}
*** 52,70 ****
name = expr_to_str_sym(expr, &sym);
if (!name && !sym)
return 0;
ret = is_ignored(owner, name, sym);
free_string(name);
! return ret;
}
static void clear_ignores(void)
{
if (__inline_fn)
return;
free_stree(&ignored);
}
void register_smatch_ignore(int id)
{
add_hook(&clear_ignores, AFTER_FUNC_HOOK);
}
--- 53,114 ----
name = expr_to_str_sym(expr, &sym);
if (!name && !sym)
return 0;
ret = is_ignored(owner, name, sym);
free_string(name);
! if (ret)
! return true;
!
! name = get_macro_name(expr->pos);
! if (name && get_state_stree(ignored_from_file, owner, name, NULL))
! return true;
!
! name = get_function();
! if (name && get_state_stree(ignored_from_file, owner, name, NULL))
! return true;
!
! return false;
}
static void clear_ignores(void)
{
if (__inline_fn)
return;
free_stree(&ignored);
}
+ static void load_ignores(void)
+ {
+ struct token *token;
+ const char *name, *str;
+ int owner;
+ char buf[64];
+
+ snprintf(buf, sizeof(buf), "%s.ignored_warnings", option_project_str);
+ token = get_tokens_file(buf);
+ if (!token)
+ return;
+ if (token_type(token) != TOKEN_STREAMBEGIN)
+ return;
+ token = token->next;
+ while (token_type(token) != TOKEN_STREAMEND) {
+ if (token_type(token) != TOKEN_IDENT)
+ break;
+ name = show_ident(token->ident);
+ token = token->next;
+ owner = id_from_name(name);
+
+ if (token_type(token) != TOKEN_IDENT)
+ break;
+ str = show_ident(token->ident);
+ token = token->next;
+
+ set_state_stree_perm(&ignored_from_file, owner, str, NULL, &ignore);
+ }
+ clear_token_alloc();
+ }
+
void register_smatch_ignore(int id)
{
add_hook(&clear_ignores, AFTER_FUNC_HOOK);
+ load_ignores();
}