• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

GCC with patches for OS216


Commit MetaInfo

修訂4804c5fe965eef2f346de53d9e896ea2cd88f0b9 (tree)
時間2020-01-15 08:55:00
作者David Malcolm <dmalcolm@redh...>
CommiterDavid Malcolm

Log Message

analyzer: introduce a set of known async-signal-unsafe functions

This patch uses the class function_set from the previous patch to
generalize the test for an fprintf inside a signal handler to
check for a set of known async-signal-unsafe functions.

gcc/analyzer/ChangeLog:
* analyzer-selftests.cc (selftest::run_analyzer_selftests): Call
selftest::analyzer_sm_signal_cc_tests.
* analyzer-selftests.h (selftest::analyzer_sm_signal_cc_tests):
New decl.
* sm-signal.cc: Include "analyzer/function-set.h" and
"analyzer/analyzer-selftests.h".
(get_async_signal_unsafe_fns): New function.
(signal_unsafe_p): Reimplement in terms of the above.
(selftest::analyzer_sm_signal_cc_tests): New function.

gcc/testsuite/ChangeLog:
* gcc.dg/analyzer/signal-5.c: New test.

Change Summary

差異

--- a/gcc/analyzer/ChangeLog
+++ b/gcc/analyzer/ChangeLog
@@ -1,6 +1,18 @@
11 2020-01-14 David Malcolm <dmalcolm@redhat.com>
22
33 * analyzer-selftests.cc (selftest::run_analyzer_selftests): Call
4+ selftest::analyzer_sm_signal_cc_tests.
5+ * analyzer-selftests.h (selftest::analyzer_sm_signal_cc_tests):
6+ New decl.
7+ * sm-signal.cc: Include "analyzer/function-set.h" and
8+ "analyzer/analyzer-selftests.h".
9+ (get_async_signal_unsafe_fns): New function.
10+ (signal_unsafe_p): Reimplement in terms of the above.
11+ (selftest::analyzer_sm_signal_cc_tests): New function.
12+
13+2020-01-14 David Malcolm <dmalcolm@redhat.com>
14+
15+ * analyzer-selftests.cc (selftest::run_analyzer_selftests): Call
416 selftest::analyzer_function_set_cc_tests.
517 * analyzer-selftests.h (selftest::analyzer_function_set_cc_tests):
618 New decl.
--- a/gcc/analyzer/analyzer-selftests.cc
+++ b/gcc/analyzer/analyzer-selftests.cc
@@ -54,6 +54,7 @@ run_analyzer_selftests ()
5454 analyzer_program_point_cc_tests ();
5555 analyzer_program_state_cc_tests ();
5656 analyzer_region_model_cc_tests ();
57+ analyzer_sm_signal_cc_tests ();
5758 #endif /* #if ENABLE_ANALYZER */
5859 }
5960
--- a/gcc/analyzer/analyzer-selftests.h
+++ b/gcc/analyzer/analyzer-selftests.h
@@ -37,6 +37,7 @@ extern void analyzer_function_set_cc_tests ();
3737 extern void analyzer_program_point_cc_tests ();
3838 extern void analyzer_program_state_cc_tests ();
3939 extern void analyzer_region_model_cc_tests ();
40+extern void analyzer_sm_signal_cc_tests ();
4041
4142 } /* end of namespace selftest. */
4243
--- a/gcc/analyzer/sm-signal.cc
+++ b/gcc/analyzer/sm-signal.cc
@@ -56,6 +56,8 @@ along with GCC; see the file COPYING3. If not see
5656 #include "analyzer/diagnostic-manager.h"
5757 #include "shortest-paths.h"
5858 #include "analyzer/exploded-graph.h"
59+#include "analyzer/function-set.h"
60+#include "analyzer/analyzer-selftests.h"
5961
6062 #if ENABLE_ANALYZER
6163
@@ -246,16 +248,40 @@ public:
246248 tree m_fndecl;
247249 };
248250
249-/* Return true if CALL is known to be unsafe to call from a signal handler. */
251+/* Get a set of functions that are known to be unsafe to call from an
252+ async signal handler. */
250253
251-static bool
252-signal_unsafe_p (tree callee_fndecl)
254+static function_set
255+get_async_signal_unsafe_fns ()
253256 {
254- // TODO: maintain a list of known unsafe functions
255- if (is_named_call_p (callee_fndecl, "fprintf"))
256- return true;
257+ // TODO: populate this list more fully
258+ static const char * const async_signal_unsafe_fns[] = {
259+ /* This array must be kept sorted. */
260+ "fprintf",
261+ "free",
262+ "malloc",
263+ "printf",
264+ "snprintf",
265+ "sprintf",
266+ "vfprintf",
267+ "vprintf",
268+ "vsnprintf",
269+ "vsprintf"
270+ };
271+ const size_t count
272+ = sizeof(async_signal_unsafe_fns) / sizeof (async_signal_unsafe_fns[0]);
273+ function_set fs (async_signal_unsafe_fns, count);
274+ return fs;
275+};
257276
258- return false;
277+/* Return true if FNDECL is known to be unsafe to call from a signal
278+ handler. */
279+
280+static bool
281+signal_unsafe_p (tree fndecl)
282+{
283+ function_set fs = get_async_signal_unsafe_fns ();
284+ return fs.contains_decl_p (fndecl);
259285 }
260286
261287 /* Implementation of state_machine::on_stmt vfunc for signal_state_machine. */
@@ -325,4 +351,21 @@ make_signal_state_machine (logger *logger)
325351 return new signal_state_machine (logger);
326352 }
327353
354+#if CHECKING_P
355+
356+namespace selftest {
357+
358+/* Run all of the selftests within this file. */
359+
360+void
361+analyzer_sm_signal_cc_tests ()
362+{
363+ function_set fs = get_async_signal_unsafe_fns ();
364+ fs.assert_sorted ();
365+ fs.assert_sane ();
366+}
367+
368+} // namespace selftest
369+
370+#endif /* CHECKING_P */
328371 #endif /* #if ENABLE_ANALYZER */
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
11 2020-01-14 David Malcolm <dmalcolm@redhat.com>
22
3+ * gcc.dg/analyzer/signal-5.c: New test.
4+
5+2020-01-14 David Malcolm <dmalcolm@redhat.com>
6+
37 * gcc.dg/analyzer/data-model-1.c: Remove xfail.
48 * gcc.dg/analyzer/data-model-5b.c: Likewise.
59 * gcc.dg/analyzer/data-model-5c.c: Likewise.
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/analyzer/signal-5.c
@@ -0,0 +1,21 @@
1+/* Example of other bad calls within a signal handler. */
2+
3+#include <stdlib.h>
4+#include <signal.h>
5+
6+extern void do_stuff (void *ptr);
7+extern void body_of_program(void);
8+
9+static void handler(int signum)
10+{
11+ void *ptr = malloc (1024); /* { dg-warning "call to 'malloc' from within signal handler" } */
12+ do_stuff (ptr);
13+ free (ptr); /* { dg-warning "call to 'free' from within signal handler" } */
14+}
15+
16+int main(int argc, const char *argv)
17+{
18+ signal(SIGINT, handler); /* { dg-message "registering 'handler' as signal handler" } */
19+ body_of_program();
20+ return 0;
21+}