From patchwork Tue Jun 12 21:29:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Sebor X-Patchwork-Id: 928505 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-479595-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="RFEl3/rl"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41531D2rz1z9s1B for ; Wed, 13 Jun 2018 07:29:18 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :subject:to:message-id:date:mime-version:content-type; q=dns; s= default; b=gyvbFKmD/B3mm3BDkVCo3RpGaJ2/45herIopjH5h6Zwf0DbpC8iu0 HnqqY5pT24jcblz1C/MJrfjpfhSElOp1MmbgfKAJNXNZ/KsoxVErSPKlo1WhYtMB l4F2ugeC2emFdBFRM0Hv4pTSzfDKNH5o5RwuphIg0Y2Dh25BqmY08A= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :subject:to:message-id:date:mime-version:content-type; s= default; bh=wR4JUu2sM7TX6JZolcBlAhctNyE=; b=RFEl3/rlbCdJXRVFeLU3 +6lY0ARaP9j4cuCb9UL1b9mo8BN004UHumYVwVW77g4ID7uwPHFtxay8hVJepFST W1uU0NGnsnqEs3fMQnPNupnQhKUQ4vRfN22RZBst7V+l/TkH+5avQZ+YEAT1BJ+r nsmYUCoE4ykrp2YxkuvscGA= Received: (qmail 34925 invoked by alias); 12 Jun 2018 21:29:11 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 34902 invoked by uid 89); 12 Jun 2018 21:29:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-10.6 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=H*r:sk:h6-v6so X-HELO: mail-ot0-f174.google.com Received: from mail-ot0-f174.google.com (HELO mail-ot0-f174.google.com) (74.125.82.174) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 12 Jun 2018 21:29:09 +0000 Received: by mail-ot0-f174.google.com with SMTP id h6-v6so563747otj.0 for ; Tue, 12 Jun 2018 14:29:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:message-id:date:user-agent :mime-version; bh=2wdYu+PD8mqZlc8lpFf95SdwXaj390zsqRfCWjywZGk=; b=JNPFQvgwFKTCJ3Uue4XJNM/c5+JqgRJD4+02+FKi3WrXVKUla+HM6ZJnqPLJ9NUJ2Z cJk7gzY6gD4aCtHWasEspvozPMHa9gmRN0gRpvK5dP1y9DiJuqh44b0/SaZXFewBUBRA 4+S+qnH4k5epJShjz8HOhbqIwL1+WbWipP217o3g7MKTu9YS+YKgZKjlUA+dhMdnwYjI tQ/P2qXP/wwuPOFv45lpuTr+woJa8uMtI/NOgSO3f6Ljxv23Rq1+VYob56eIcYXI9Klq qCDIKUAnl1RkVaktNutFiwYf+toY+Rji/zhIqA0MN0/JWyzoUUPpCDryxiUAlesrG0mL amcw== X-Gm-Message-State: APt69E0/3kYlRPCUw2WZWrHdZBQrnxYAGeP0v5OM27a0mJ3rTYK/SG5z TrXkNmHK/8jWJeYAKn34Yh1b4A== X-Google-Smtp-Source: ADUXVKKU+guhLvPTQan7jiuM8Jmp1jYvchjVN/0lnn/oqECs5xJAlRtv8L5VxUT8Dpd94X5lT1O2Aw== X-Received: by 2002:a9d:3663:: with SMTP id w90-v6mr1374643otb.96.1528838946998; Tue, 12 Jun 2018 14:29:06 -0700 (PDT) Received: from localhost.localdomain (75-166-107-65.hlrn.qwest.net. [75.166.107.65]) by smtp.gmail.com with ESMTPSA id 23-v6sm481571ois.30.2018.06.12.14.29.05 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 12 Jun 2018 14:29:05 -0700 (PDT) From: Martin Sebor Subject: [PATCH] gracefully deal with invalid strlen declarations (PR 86114) To: Gcc Patch List Message-ID: <0e941f41-e1b1-1255-8fe7-8a72427c19d9@gmail.com> Date: Tue, 12 Jun 2018 15:29:03 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 X-IsSubscribed: yes Declaring strlen() to return a pointer instead of size_t and then calling the function can result in an ICE due to both gimple-fold and tree-ssa-strlen assuming the function necessarily returns an integer. As luck would have it, the incompatible declaration isn't detected by -Wbuiltin-declaration-mismatch (bug 86125), nor apparently even by gimple_builtin_call_types_compatible_p(), and so the invalid declaration makes its way where it isn't expected. The attached patch avoids the ICE by removing the unsafe assumption from both the folder and the strlen pass. Martin PR tree-optimization/86114 - ICE in gimple_fold_builtin_strlen with an invalid call to strnlen gcc/testsuite/ChangeLog: PR tree-optimization/86114 * gcc.dg/pr86114.c: New test. gcc/ChangeLog: PR tree-optimization/86114 * gimple-fold.c (gimple_fold_builtin_strlen): Only handle LHS of integer types. * tree-ssa-strlen.c (maybe_set_strlen_range): Same. Index: gcc/gimple-fold.c =================================================================== --- gcc/gimple-fold.c (revision 261516) +++ gcc/gimple-fold.c (working copy) @@ -3538,9 +3538,10 @@ gimple_fold_builtin_strlen (gimple_stmt_iterator * return true; } - tree lhs = gimple_call_lhs (stmt); - if (lhs && TREE_CODE (lhs) == SSA_NAME) - set_range_info (lhs, VR_RANGE, minlen, maxlen); + if (tree lhs = gimple_call_lhs (stmt)) + if (TREE_CODE (lhs) == SSA_NAME + && INTEGRAL_TYPE_P (TREE_TYPE (lhs))) + set_range_info (lhs, VR_RANGE, minlen, maxlen); return false; } Index: gcc/tree-ssa-strlen.c =================================================================== --- gcc/tree-ssa-strlen.c (revision 261518) +++ gcc/tree-ssa-strlen.c (working copy) @@ -1124,14 +1124,15 @@ adjust_last_stmt (strinfo *si, gimple *stmt, bool update_stmt (last.stmt); } -/* For an LHS that is an SSA_NAME and for strlen() argument SRC, set - LHS range info to [0, N] if SRC refers to a character array A[N] - with unknown length bounded by N. */ +/* For an LHS that is an SSA_NAME with integer type and for strlen() + argument SRC, set LHS range info to [0, N] if SRC refers to + a character array A[N] with unknown length bounded by N. */ static void maybe_set_strlen_range (tree lhs, tree src) { - if (TREE_CODE (lhs) != SSA_NAME) + if (TREE_CODE (lhs) != SSA_NAME + || !INTEGRAL_TYPE_P (TREE_TYPE (lhs))) return; if (TREE_CODE (src) == SSA_NAME) Index: gcc/testsuite/gcc.dg/pr86114.c =================================================================== --- gcc/testsuite/gcc.dg/pr86114.c (nonexistent) +++ gcc/testsuite/gcc.dg/pr86114.c (working copy) @@ -0,0 +1,42 @@ +/* PR tree-optimization/86114 - ICE in gimple_fold_builtin_strlen with + an invalid call to strnlen + { dg-do compile } + { dg-options "-O2" } */ + +typedef __SIZE_TYPE__ size_t; + +extern char* strcmp (const char*, const char*); +extern char* strncmp (const char*, const char*, size_t); +extern char* strlen (const char*); +extern char* strnlen (const char*, size_t); +extern char* strcspn (const char*, const char*); +extern char* strspn (const char*, const char*); +extern char* strxfrm (const char*, const char*, size_t); + +char** q; + +void test_array (const char *s) +{ + extern char a[8]; + + q[0] = strcmp (a, s); + q[1] = strncmp (a, s, 7); + q[2] = strlen (a); + q[3] = strnlen (a, 7); + q[4] = strcspn (a, s); + q[5] = strspn (a, s); + q[6] = strxfrm (a, s, 7); +} + +void test_pointer (const char *s, const char *t) +{ + q[0] = strcmp (s, t); + q[1] = strncmp (s, t, 7); + q[2] = strlen (s); + q[3] = strnlen (s, 7); + q[4] = strcspn (s, t); + q[5] = strspn (s, t); + q[6] = strxfrm (s, s, 7); +} + +/* { dg-prune-output "-Wbuiltin-declaration-mismatch" } */