From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2209) id 4F56A384F6D5; Tue, 22 Nov 2022 00:10:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4F56A384F6D5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1669075808; bh=pJIlLjcPjZlEQlldVdLEYo6+hAOOJ4SMVXvK3vPOj9E=; h=From:To:Subject:Date:From; b=EwgBx7J60pnhuiGAdmB36K7xN2jYAUDrP7btUJKV0g5uJ7056vEEvQ3wN9bhyw44z XFRWGWW45n7PHPcnUBtBEk5vz00RelJ/ROcPa98jEf3jhzO5ENEjtg3xUXm7L28t36 sK09NHEU7bQ2GxcIMFWBp1kkhJy0PJf9jKmH+4y8= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: David Malcolm To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-4219] analyzer: fix ICE on writes to errno [PR107777] X-Act-Checkin: gcc X-Git-Author: David Malcolm X-Git-Refname: refs/heads/master X-Git-Oldrev: 9ada45967b4cf543aa47091e99a760d0718013cc X-Git-Newrev: 358dab90186b30a5d287710f13625c327210218d Message-Id: <20221122001008.4F56A384F6D5@sourceware.org> Date: Tue, 22 Nov 2022 00:10:08 +0000 (GMT) List-Id: https://gcc.gnu.org/g:358dab90186b30a5d287710f13625c327210218d commit r13-4219-g358dab90186b30a5d287710f13625c327210218d Author: David Malcolm Date: Mon Nov 21 19:08:17 2022 -0500 analyzer: fix ICE on writes to errno [PR107777] gcc/analyzer/ChangeLog: PR analyzer/107777 * call-summary.cc (call_summary_replay::convert_region_from_summary_1): Handle RK_THREAD_LOCAL and RK_ERRNO in switch. * region-model.cc (region_model::get_representative_path_var_1): Likewise. gcc/testsuite/ChangeLog: PR analyzer/107777 * gcc.dg/analyzer/call-summaries-errno.c: New test. * gcc.dg/analyzer/errno-pr107777.c: New test. Signed-off-by: David Malcolm Diff: --- gcc/analyzer/call-summary.cc | 2 ++ gcc/analyzer/region-model.cc | 2 ++ gcc/testsuite/gcc.dg/analyzer/call-summaries-errno.c | 17 +++++++++++++++++ gcc/testsuite/gcc.dg/analyzer/errno-pr107777.c | 20 ++++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/gcc/analyzer/call-summary.cc b/gcc/analyzer/call-summary.cc index ebc7b5028ec..4c4694b5381 100644 --- a/gcc/analyzer/call-summary.cc +++ b/gcc/analyzer/call-summary.cc @@ -575,6 +575,7 @@ call_summary_replay::convert_region_from_summary_1 (const region *summary_reg) case RK_CODE: case RK_STACK: case RK_HEAP: + case RK_THREAD_LOCAL: case RK_ROOT: /* These should never be pointed to by a region_svalue. */ gcc_unreachable (); @@ -582,6 +583,7 @@ call_summary_replay::convert_region_from_summary_1 (const region *summary_reg) case RK_FUNCTION: case RK_LABEL: case RK_STRING: + case RK_ERRNO: case RK_UNKNOWN: /* We can reuse these regions directly. */ return summary_reg; diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc index 81f58a59f4f..1d5b09a6805 100644 --- a/gcc/analyzer/region-model.cc +++ b/gcc/analyzer/region-model.cc @@ -4754,6 +4754,7 @@ region_model::get_representative_path_var_1 (const region *reg, case RK_CODE: case RK_HEAP: case RK_STACK: + case RK_THREAD_LOCAL: case RK_ROOT: /* Regions that represent memory spaces are not expressible as trees. */ return path_var (NULL_TREE, 0); @@ -4873,6 +4874,7 @@ region_model::get_representative_path_var_1 (const region *reg, } case RK_VAR_ARG: + case RK_ERRNO: case RK_UNKNOWN: return path_var (NULL_TREE, 0); } diff --git a/gcc/testsuite/gcc.dg/analyzer/call-summaries-errno.c b/gcc/testsuite/gcc.dg/analyzer/call-summaries-errno.c new file mode 100644 index 00000000000..e4333b30bb7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/call-summaries-errno.c @@ -0,0 +1,17 @@ +/* { dg-additional-options "-fanalyzer-call-summaries" } */ + +#include +#include "analyzer-decls.h" + +void sets_errno (int x) +{ + errno = x; +} + +void test_sets_errno (int y) +{ + sets_errno (y); + sets_errno (y); + + __analyzer_eval (errno == y); /* { dg-warning "TRUE" } */ +} diff --git a/gcc/testsuite/gcc.dg/analyzer/errno-pr107777.c b/gcc/testsuite/gcc.dg/analyzer/errno-pr107777.c new file mode 100644 index 00000000000..65687393657 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/errno-pr107777.c @@ -0,0 +1,20 @@ +int * +__errno_location (void); + +long int +read (int, void *, unsigned long int); + +struct IOBUF { + int fd; +}; + +void +do_getline_end_data (struct IOBUF *iop, int tree) +{ + char end_data; + + if (tree) + *__errno_location () = 0; + + read (iop->fd, &end_data, sizeof end_data); +}