+2008-07-09 Raksit Ashok <raksit@google.com>
+
+ * 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 <christian.bruel@st.com>
* final.c (get_attr_length_1): Call get_attr_length_1 with fallback_fn
"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. */
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
+2008-07-09 Raksit Ashok <raksit@google.com>
+
+ * parser.c (cp_parser_postfix_expression): New warning based on flag
+ warn_disallowed_functions.
+
2008-07-08 Simon Martin <simartin@users.sourceforge.net>
PR c++/34963
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;
}
-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
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
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
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;
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;
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. */
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;
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;
+2008-07-09 Raksit Ashok <raksit@google.com>
+
+ * 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 <simartin@users.sourceforge.net>
PR c++/34963
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wdisallowed-function-list=foobar" } */
+
+int foobar (int i)
+{
+ return (i * 5);
+}
--- /dev/null
+/* { 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'" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wdisallowed-function-list=foobar" } */
+
+int foobar (int i)
+{
+ return (i * 5);
+}
--- /dev/null
+/* { 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'" } */
+}