aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRaksit Ashok <raksit@google.com>2008-07-09 08:23:48 +0000
committerRaksit Ashok <raksit@gcc.gnu.org>2008-07-09 08:23:48 +0000
commit1ebc7e681079e61300e75a5c0f3b2da335720cc7 (patch)
tree52f1164b80ec03e33183a75b3810a57f8697a378 /gcc
parent47d268d0d33fbf5dbcd7d022c87e1dfcb6b61577 (diff)
downloadgcc-1ebc7e681079e61300e75a5c0f3b2da335720cc7.zip
gcc-1ebc7e681079e61300e75a5c0f3b2da335720cc7.tar.gz
gcc-1ebc7e681079e61300e75a5c0f3b2da335720cc7.tar.bz2
invoke.texi (Option Summary): Mention new option -Wdisallowed-function-list=...
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. gcc/cp/ChangeLog 2008-07-09 Raksit Ashok <raksit@google.com> * parser.c (cp_parser_postfix_expression): New warning based on flag warn_disallowed_functions. gcc/testsuite/ChangeLog 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. From-SVN: r137655
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog20
-rw-r--r--gcc/c-parser.c2
-rw-r--r--gcc/common.opt4
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parser.c3
-rw-r--r--gcc/doc/invoke.texi12
-rw-r--r--gcc/flags.h7
-rw-r--r--gcc/opts.c47
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/warn/Wdisallowed-functions-1.C7
-rw-r--r--gcc/testsuite/g++.dg/warn/Wdisallowed-functions-2.C12
-rw-r--r--gcc/testsuite/gcc.dg/wdisallowed-functions-1.c7
-rw-r--r--gcc/testsuite/gcc.dg/wdisallowed-functions-2.c12
13 files changed, 137 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5fe59fe..29576bb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,23 @@
+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
diff --git a/gcc/c-parser.c b/gcc/c-parser.c
index 45aff80..4ca06fe 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 200425d..28a5af2 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 75435cf..fa4419e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 2323c67..767d14d 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 689f838..6122f79 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 1818a42..edc96e9 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 c26260a..8431a40 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 07b3827..755f8e4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+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
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 0000000..3976095
--- /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 0000000..ca5aab0
--- /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 0000000..3976095
--- /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 0000000..ca5aab0
--- /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'" } */
+}