From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2209) id 1B3763858C60; Thu, 2 Feb 2023 14:13:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1B3763858C60 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1675347198; bh=JzyFAGTz6IwzzMavm60DEcmaxlYuCDK4POFMULKRBJo=; h=From:To:Subject:Date:From; b=isx+VnEAH6ij6J2ipsbrvdfAFF6Y3to8U3hvmZs+yvWaUCSXO4aLny2vQbTRnFrYy F5saNuBW6aVG+cs/wnKBj2s1C09ZTIGL7Ie6QCBzvq2CdItbKK6Q1Pv/c83BtJwJWG 2X7oBXNmwXJ3fu4o7Q4jrdAiMQ8+UjUvtyrsSTX4= 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-5654] analyzer: add deref-before-check-qemu-qtest_rsp_args.c test case X-Act-Checkin: gcc X-Git-Author: David Malcolm X-Git-Refname: refs/heads/master X-Git-Oldrev: a02aacf55a35876ddc1e534778dc37fae29054f6 X-Git-Newrev: 598e10cf415f0a53eab2b1e63980531c60d673b7 Message-Id: <20230202141318.1B3763858C60@sourceware.org> Date: Thu, 2 Feb 2023 14:13:18 +0000 (GMT) List-Id: https://gcc.gnu.org/g:598e10cf415f0a53eab2b1e63980531c60d673b7 commit r13-5654-g598e10cf415f0a53eab2b1e63980531c60d673b7 Author: David Malcolm Date: Thu Feb 2 09:11:31 2023 -0500 analyzer: add deref-before-check-qemu-qtest_rsp_args.c test case gcc/testsuite/ChangeLog: * gcc.dg/analyzer/deref-before-check-qemu-qtest_rsp_args.c: New test. Signed-off-by: David Malcolm Diff: --- .../deref-before-check-qemu-qtest_rsp_args.c | 73 ++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/gcc/testsuite/gcc.dg/analyzer/deref-before-check-qemu-qtest_rsp_args.c b/gcc/testsuite/gcc.dg/analyzer/deref-before-check-qemu-qtest_rsp_args.c new file mode 100644 index 00000000000..2b3ad8c5fb3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/deref-before-check-qemu-qtest_rsp_args.c @@ -0,0 +1,73 @@ +/* Reduced from qemu-7.2.0's tests/qtest/libqtest.c. */ + +#define TRUE 1 +#define NULL ((void *)0) + +#define g_assert(expr) \ + do { \ + if (expr) ; else /* { dg-warning "check of '\\*words' for NULL after already dereferencing it" } */ \ + g_assertion_message_expr (#expr); \ +} while (0) + +void g_assertion_message_expr (const char *expr) __attribute__((noreturn)); + +extern int strcmp (const char *__s1, const char *__s2) + __attribute__ ((__nothrow__ , __leaf__, __pure__, __nonnull__ (1, 2))); +typedef char gchar; +typedef int gint; +typedef gint gboolean; +typedef struct _GString GString; + +struct _GString +{ + gchar *str; + /* [...snip...] */ +}; + +extern +gchar* g_string_free (GString *string, + gboolean free_segment); +extern +gchar** g_strsplit (const gchar *string, + const gchar *delimiter, + gint max_tokens); +extern +void g_strfreev (gchar **str_array); + +typedef struct QTestState QTestState; +typedef GString* (*QTestRecvFn)(QTestState *); + +typedef struct QTestClientTransportOps { + /* [...snip...] */ + QTestRecvFn recv_line; +} QTestTransportOps; + +struct QTestState +{ + /* [...snip...] */ + QTestTransportOps ops; + /* [...snip...] */ +}; + +gchar **qtest_rsp_args(QTestState *s, int expected_args) +{ + GString *line; + gchar **words; + /* [...snip...] */ + +redo: + line = s->ops.recv_line(s); + words = g_strsplit(line->str, " ", 0); + g_string_free(line, TRUE); + + if (strcmp(words[0], "IRQ") == 0) { /* { dg-message "pointer '\\*words' is dereferenced here" } */ + /* [...snip...] */ + g_strfreev(words); + goto redo; + } + + g_assert(words[0] != NULL); /* { dg-message "in expansion of macro 'g_assert'" } */ + /* [...snip...] */ + + return words; +}