aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2020-08-31 11:55:34 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2020-08-31 18:31:49 -0400
commitbc62bfb0f43eeada02cb924e3cb5457a399b01c0 (patch)
treeae4f3ba2f194a189861a7e24bf62d2ecdaa4514f /gcc
parentee7bfbe5eb70a23bbf3a2cedfdcbd2ea1a20c3f2 (diff)
downloadgcc-bc62bfb0f43eeada02cb924e3cb5457a399b01c0.zip
gcc-bc62bfb0f43eeada02cb924e3cb5457a399b01c0.tar.gz
gcc-bc62bfb0f43eeada02cb924e3cb5457a399b01c0.tar.bz2
analyzer: handle __builtin___memset_chk [PR96798]
gcc/analyzer/ChangeLog: PR analyzer/96798 * region-model.cc (region_model::on_call_pre): Handle BUILT_IN_MEMSET_CHK. gcc/testsuite/ChangeLog: PR analyzer/96798 * gcc.dg/analyzer/memset-1.c (test_5a): New.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/analyzer/region-model.cc1
-rw-r--r--gcc/testsuite/gcc.dg/analyzer/memset-1.c14
2 files changed, 15 insertions, 0 deletions
diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc
index ec5094c..d47e896 100644
--- a/gcc/analyzer/region-model.cc
+++ b/gcc/analyzer/region-model.cc
@@ -673,6 +673,7 @@ region_model::on_call_pre (const gcall *call, region_model_context *ctxt)
case BUILT_IN_MALLOC:
return impl_call_malloc (cd);
case BUILT_IN_MEMSET:
+ case BUILT_IN_MEMSET_CHK:
impl_call_memset (cd);
return false;
break;
diff --git a/gcc/testsuite/gcc.dg/analyzer/memset-1.c b/gcc/testsuite/gcc.dg/analyzer/memset-1.c
index 830c110..5748aa1 100644
--- a/gcc/testsuite/gcc.dg/analyzer/memset-1.c
+++ b/gcc/testsuite/gcc.dg/analyzer/memset-1.c
@@ -68,6 +68,20 @@ void test_5 (int n)
__analyzer_eval (buf[42] == '\0'); /* { dg-warning "UNKNOWN" } */
}
+/* As test_5, but with "__builtin___memset_chk". */
+
+void test_5a (int n)
+{
+ char buf[256];
+ buf[42] = 'A';
+ __analyzer_eval (buf[42] == 'A'); /* { dg-warning "TRUE" } */
+ __builtin___memset_chk (buf, 0, n, __builtin_object_size (buf, 0));
+
+ /* We can't know if buf[42] was written to or not. */
+ __analyzer_eval (buf[42] == 'A'); /* { dg-warning "UNKNOWN" } */
+ __analyzer_eval (buf[42] == '\0'); /* { dg-warning "UNKNOWN" } */
+}
+
/* A "memset" with unknown value, but with zero size. */
static size_t __attribute__((noinline))