This patch fixes the ICE caused by valid_to_unchecked_state in sm-fd.cc by exiting early if first argument of any "dup" functions is invalid.
gcc/analyzer/ChangeLog: PR analyzer/106551 * sm-fd.cc (check_for_dup): exit early if first argument is invalid for all dup functions. gcc/testsuite/ChangeLog: PR analyzer/106551 * gcc.dg/analyzer/fd-dup-1.c: New testcase. Signed-off-by: Immad Mir <mirim...@outlook.com> --- gcc/analyzer/sm-fd.cc | 3 +-- gcc/testsuite/gcc.dg/analyzer/fd-dup-1.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gcc/analyzer/sm-fd.cc b/gcc/analyzer/sm-fd.cc index e02b86baad1..505d598f3f0 100644 --- a/gcc/analyzer/sm-fd.cc +++ b/gcc/analyzer/sm-fd.cc @@ -976,8 +976,7 @@ fd_state_machine::check_for_dup (sm_context *sm_ctxt, const supernode *node, { check_for_open_fd (sm_ctxt, node, stmt, call, callee_fndecl, DIRS_READ_WRITE); - if (kind == DUP_1) - return; + return; } switch (kind) { diff --git a/gcc/testsuite/gcc.dg/analyzer/fd-dup-1.c b/gcc/testsuite/gcc.dg/analyzer/fd-dup-1.c index b971d31b1c7..b4f43e7f0ef 100644 --- a/gcc/testsuite/gcc.dg/analyzer/fd-dup-1.c +++ b/gcc/testsuite/gcc.dg/analyzer/fd-dup-1.c @@ -245,4 +245,15 @@ test_22 (int flags) close (fd); } +void do_something(); +void +test_23 () +{ + int nullfd = -1; + int fd = 1; + if (dup2 (nullfd, fd) < 0) /* { dg-warning "'dup2' on possibly invalid file descriptor 'nullfd'" } */ + { + do_something(); + } +} -- 2.25.1