Module Name: src Committed By: rillig Date: Sat Apr 22 20:17:19 UTC 2023
Modified Files: src/usr.bin/xlint/lint1: debug.c tree.c Log Message: lint: fix missing initialization for cast to union The left operand of a unary AST node must not be NULL. The previous code crashed lint when run with some query enabled, as is_cast_redundant assumes that a non-null AST node has valid operands. $ cat <<EOF > crash.c double demo(void) { union u { double *num; } u; u = (union u)&((double) { 0.0 }); return *u.num; } EOF $ /usr/libexec/lint1 -w -S -g -q8 crash.c /dev/null To generate a diff of this commit: cvs rdiff -u -r1.29 -r1.30 src/usr.bin/xlint/lint1/debug.c cvs rdiff -u -r1.517 -r1.518 src/usr.bin/xlint/lint1/tree.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/xlint/lint1/debug.c diff -u src/usr.bin/xlint/lint1/debug.c:1.29 src/usr.bin/xlint/lint1/debug.c:1.30 --- src/usr.bin/xlint/lint1/debug.c:1.29 Sat Apr 22 17:49:15 2023 +++ src/usr.bin/xlint/lint1/debug.c Sat Apr 22 20:17:19 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: debug.c,v 1.29 2023/04/22 17:49:15 rillig Exp $ */ +/* $NetBSD: debug.c,v 1.30 2023/04/22 20:17:19 rillig Exp $ */ /*- * Copyright (c) 2021 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: debug.c,v 1.29 2023/04/22 17:49:15 rillig Exp $"); +__RCSID("$NetBSD: debug.c,v 1.30 2023/04/22 20:17:19 rillig Exp $"); #endif #include <stdlib.h> @@ -205,8 +205,10 @@ debug_node(const tnode_t *tn) // NOLINT( debug_printf("\n"); debug_indent_inc(); + lint_assert(tn->tn_left != NULL); debug_node(tn->tn_left); - if (is_binary(tn) || tn->tn_right != NULL) + lint_assert(is_binary(tn) == (tn->tn_right != NULL)); + if (tn->tn_right != NULL) debug_node(tn->tn_right); debug_indent_dec(); } Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.517 src/usr.bin/xlint/lint1/tree.c:1.518 --- src/usr.bin/xlint/lint1/tree.c:1.517 Sat Apr 22 17:49:15 2023 +++ src/usr.bin/xlint/lint1/tree.c Sat Apr 22 20:17:19 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.517 2023/04/22 17:49:15 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.518 2023/04/22 20:17:19 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: tree.c,v 1.517 2023/04/22 17:49:15 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.518 2023/04/22 20:17:19 rillig Exp $"); #endif #include <float.h> @@ -4049,7 +4049,7 @@ build_alignof(const type_t *tp) } static tnode_t * -cast_to_union(const tnode_t *otn, type_t *ntp) +cast_to_union(tnode_t *otn, type_t *ntp) { if (!allow_gcc) { @@ -4066,6 +4066,7 @@ cast_to_union(const tnode_t *otn, type_t ntn->tn_op = CVT; ntn->tn_type = ntp; ntn->tn_cast = true; + ntn->tn_left = otn; ntn->tn_right = NULL; return ntn; }