From 1ebc7e681079e61300e75a5c0f3b2da335720cc7 Mon Sep 17 00:00:00 2001 From: Raksit Ashok Date: Wed, 9 Jul 2008 08:23:48 +0000 Subject: [PATCH] invoke.texi (Option Summary): Mention new option -Wdisallowed-function-list=... 2008-07-09 Raksit Ashok * doc/invoke.texi (Option Summary): Mention new option -Wdisallowed-function-list=... (Warning Options): Document -Wdisallowed-function-list=... * common.opt (Wdisallowed-function-list=): New flag. * flags.h (warn_disallowed_functions): External definition of new boolean warning flag. (warn_if_disallowed_function_p): Declare new function. * opts.c (warning_disallowed_functions): New static variable. (warn_disallowed_functions): New boolean warning flag. (warn_if_disallowed_function_p): New function. (add_comma_separated_to_vector): Rename add_instrument_functions_exclude_list to this. (common_handle_option): Handle new option. Rename calls to add_instrument_functions_exclude_list into calls to add_comma_separated_to_vector. * c-parser.c (c_parser_postfix_expression_after_primary): New warning based on flag warn_disallowed_functions. gcc/cp/ChangeLog 2008-07-09 Raksit Ashok * parser.c (cp_parser_postfix_expression): New warning based on flag warn_disallowed_functions. gcc/testsuite/ChangeLog 2008-07-09 Raksit Ashok * gcc.dg/wdisallowed-functions-1.c: New test. * gcc.dg/wdisallowed-functions-2.c: New test. * g++.dg/warn/Wdisallowed-functions-1.C: New test. * g++.dg/warn/Wdisallowed-functions-2.C: New test. From-SVN: r137655 --- gcc/ChangeLog | 20 ++++++++ gcc/c-parser.c | 2 + gcc/common.opt | 4 ++ gcc/cp/ChangeLog | 5 ++ gcc/cp/parser.c | 3 ++ gcc/doc/invoke.texi | 12 ++++- gcc/flags.h | 7 +++ gcc/opts.c | 47 ++++++++++++++++--- gcc/testsuite/ChangeLog | 7 +++ .../g++.dg/warn/Wdisallowed-functions-1.C | 7 +++ .../g++.dg/warn/Wdisallowed-functions-2.C | 12 +++++ .../gcc.dg/wdisallowed-functions-1.c | 7 +++ .../gcc.dg/wdisallowed-functions-2.c | 12 +++++ 13 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wdisallowed-functions-1.C create mode 100644 gcc/testsuite/g++.dg/warn/Wdisallowed-functions-2.C create mode 100644 gcc/testsuite/gcc.dg/wdisallowed-functions-1.c create mode 100644 gcc/testsuite/gcc.dg/wdisallowed-functions-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5fe59fe673a..29576bbc7ad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,23 @@ +2008-07-09 Raksit Ashok + + * doc/invoke.texi (Option Summary): Mention new option + -Wdisallowed-function-list=... + (Warning Options): Document -Wdisallowed-function-list=... + * common.opt (Wdisallowed-function-list=): New flag. + * flags.h (warn_disallowed_functions): External definition of new + boolean warning flag. + (warn_if_disallowed_function_p): Declare new function. + * opts.c (warning_disallowed_functions): New static variable. + (warn_disallowed_functions): New boolean warning flag. + (warn_if_disallowed_function_p): New function. + (add_comma_separated_to_vector): Rename + add_instrument_functions_exclude_list to this. + (common_handle_option): Handle new option. Rename calls to + add_instrument_functions_exclude_list into calls to + add_comma_separated_to_vector. + * c-parser.c (c_parser_postfix_expression_after_primary): New warning + based on flag warn_disallowed_functions. + 2008-07-09 Christian Bruel * final.c (get_attr_length_1): Call get_attr_length_1 with fallback_fn diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 45aff80d6c0..4ca06fec414 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -5630,6 +5630,8 @@ c_parser_postfix_expression_after_primary (c_parser *parser, "expected %<)%>"); expr.value = build_function_call (expr.value, exprlist); expr.original_code = ERROR_MARK; + if (warn_disallowed_functions) + warn_if_disallowed_function_p (expr.value); break; case CPP_DOT: /* Structure element reference. */ diff --git a/gcc/common.opt b/gcc/common.opt index 200425d3128..28a5af25dd9 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -94,6 +94,10 @@ Wdisabled-optimization Common Var(warn_disabled_optimization) Warning Warn when an optimization pass is disabled +Wdisallowed-function-list= +Common RejectNegative Joined Warning +Warn on calls to these functions + Werror Common Var(warnings_are_errors) Treat all warnings as errors diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 75435cffda6..fa4419e998a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2008-07-09 Raksit Ashok + + * parser.c (cp_parser_postfix_expression): New warning based on flag + warn_disallowed_functions. + 2008-07-08 Simon Martin PR c++/34963 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 2323c672166..767d14d2a61 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -4725,6 +4725,9 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, koenig_p, tf_warning_or_error); + if (warn_disallowed_functions) + warn_if_disallowed_function_p (postfix_expression); + /* The POSTFIX_EXPRESSION is certainly no longer an id. */ idk = CP_ID_KIND_NONE; } diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 689f8381e1b..6122f791b68 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -231,8 +231,9 @@ Objective-C and Objective-C++ Dialects}. -Wno-attributes -Wc++-compat -Wc++0x-compat -Wcast-align -Wcast-qual @gol -Wchar-subscripts -Wclobbered -Wcomment @gol -Wconversion -Wcoverage-mismatch -Wno-deprecated @gol --Wno-deprecated-declarations -Wdisabled-optimization -Wno-div-by-zero @gol --Wempty-body -Wenum-compare -Wno-endif-labels @gol +-Wno-deprecated-declarations -Wdisabled-optimization @gol +-Wdisallowed-function-list=@var{sym},@var{sym},@dots{} @gol +-Wno-div-by-zero -Wempty-body -Wenum-compare -Wno-endif-labels @gol -Werror -Werror=* @gol -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 @gol -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral @gol @@ -4101,6 +4102,13 @@ minimum maximum, so we do not diagnose overlength strings in C++@. This option is implied by @option{-pedantic}, and can be disabled with @option{-Wno-overlength-strings}. + +@item -Wdisallowed-function-list=@var{sym},@var{sym},@dots{} +@opindex Wdisallowed-function-list + +If any of @var{sym} is called, GCC will issue a warning. This can be useful +in enforcing coding conventions that ban calls to certain functions, for +example, @code{alloca}, @code{malloc}, etc. @end table @node Debugging Options diff --git a/gcc/flags.h b/gcc/flags.h index 1818a42c5ca..edc96e95920 100644 --- a/gcc/flags.h +++ b/gcc/flags.h @@ -279,6 +279,13 @@ extern bool flag_speculative_prefetching_set; instrumentation. */ extern bool flag_instrument_functions_exclude_p (tree fndecl); +/* Emit warning if the function call is disallowed under + -Wdisallowed-function-list=... */ +extern void warn_if_disallowed_function_p (const_tree fncall); + +/* True, if the -Wdisallowed-function-list=... option has been specified. */ +extern bool warn_disallowed_functions; + /* True if the given mode has a NaN representation and the treatment of NaN operands is important. Certain optimizations, such as folding x * 0 into 0, are not correct for NaN operands, and are normally diff --git a/gcc/opts.c b/gcc/opts.c index c26260acdd7..8431a406bd7 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -371,6 +371,12 @@ DEF_VEC_ALLOC_P(const_char_p,heap); static VEC(const_char_p,heap) *ignored_options; +/* Function calls disallowed under -Wdisallowed-function-list=... */ +static VEC(char_p,heap) *warning_disallowed_functions; + +/* If -Wdisallowed-function-list=... */ +bool warn_disallowed_functions = false; + /* Input file names. */ const char **in_fnames; unsigned num_in_fnames; @@ -655,12 +661,10 @@ add_input_filename (const char *filename) in_fnames[num_in_fnames - 1] = filename; } -/* Add functions or file names to a vector of names to exclude from - instrumentation. */ +/* Add comma-separated strings to a char_p vector. */ static void -add_instrument_functions_exclude_list (VEC(char_p,heap) **pvec, - const char* arg) +add_comma_separated_to_vector (VEC(char_p,heap) **pvec, const char* arg) { char *tmp; char *r; @@ -736,6 +740,31 @@ flag_instrument_functions_exclude_p (tree fndecl) return false; } + +/* Return whether this function call is disallowed. */ +void +warn_if_disallowed_function_p (const_tree exp) +{ + if (TREE_CODE(exp) == CALL_EXPR + && VEC_length (char_p, warning_disallowed_functions) > 0) + { + int i; + char *s; + const char *fnname = + IDENTIFIER_POINTER (DECL_NAME (get_callee_fndecl (exp))); + for (i = 0; VEC_iterate (char_p, warning_disallowed_functions, i, s); + ++i) + { + if (strcmp (fnname, s) == 0) + { + warning (OPT_Wdisallowed_function_list_, + "disallowed call to %qs", fnname); + break; + } + } + } +} + /* Decode and handle the vector of command line options. LANG_MASK contains has a single bit set representing the current language. */ @@ -1541,6 +1570,12 @@ common_handle_option (size_t scode, const char *arg, int value, set_Wextra (value); break; + case OPT_Wdisallowed_function_list_: + warn_disallowed_functions = true; + add_comma_separated_to_vector + (&warning_disallowed_functions, arg); + break; + case OPT_Werror_: enable_warning_as_error (arg, value, lang_mask); break; @@ -1691,12 +1726,12 @@ common_handle_option (size_t scode, const char *arg, int value, break; case OPT_finstrument_functions_exclude_function_list_: - add_instrument_functions_exclude_list + add_comma_separated_to_vector (&flag_instrument_functions_exclude_functions, arg); break; case OPT_finstrument_functions_exclude_file_list_: - add_instrument_functions_exclude_list + add_comma_separated_to_vector (&flag_instrument_functions_exclude_files, arg); break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 07b3827c2e7..755f8e4719c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2008-07-09 Raksit Ashok + + * gcc.dg/wdisallowed-functions-1.c: New test. + * gcc.dg/wdisallowed-functions-2.c: New test. + * g++.dg/warn/Wdisallowed-functions-1.C: New test. + * g++.dg/warn/Wdisallowed-functions-2.C: New test. + 2008-07-08 Simon Martin PR c++/34963 diff --git a/gcc/testsuite/g++.dg/warn/Wdisallowed-functions-1.C b/gcc/testsuite/g++.dg/warn/Wdisallowed-functions-1.C new file mode 100644 index 00000000000..39760950d69 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdisallowed-functions-1.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-Wdisallowed-function-list=foobar" } */ + +int foobar (int i) +{ + return (i * 5); +} diff --git a/gcc/testsuite/g++.dg/warn/Wdisallowed-functions-2.C b/gcc/testsuite/g++.dg/warn/Wdisallowed-functions-2.C new file mode 100644 index 00000000000..ca5aab0e50d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdisallowed-functions-2.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-Wdisallowed-function-list=foo,foobar,bar,foobar" } */ + +int foobar (int i) +{ + return (i * 5); +} + +int foobar1 (int i) +{ + return foobar (i); /* { dg-warning "disallowed call to 'foobar'" } */ +} diff --git a/gcc/testsuite/gcc.dg/wdisallowed-functions-1.c b/gcc/testsuite/gcc.dg/wdisallowed-functions-1.c new file mode 100644 index 00000000000..39760950d69 --- /dev/null +++ b/gcc/testsuite/gcc.dg/wdisallowed-functions-1.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-Wdisallowed-function-list=foobar" } */ + +int foobar (int i) +{ + return (i * 5); +} diff --git a/gcc/testsuite/gcc.dg/wdisallowed-functions-2.c b/gcc/testsuite/gcc.dg/wdisallowed-functions-2.c new file mode 100644 index 00000000000..ca5aab0e50d --- /dev/null +++ b/gcc/testsuite/gcc.dg/wdisallowed-functions-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-Wdisallowed-function-list=foo,foobar,bar,foobar" } */ + +int foobar (int i) +{ + return (i * 5); +} + +int foobar1 (int i) +{ + return foobar (i); /* { dg-warning "disallowed call to 'foobar'" } */ +} -- 2.30.2