Module Name: src Committed By: rillig Date: Fri Jun 24 20:44:53 UTC 2022
Modified Files: src/tests/usr.bin/xlint/lint1: msg_247.c src/usr.bin/xlint/lint1: tree.c Log Message: lint: allow pointer cast between compatible structs Lint already allowed pointer casts from 'struct counter' to 'struct counter_impl'. Now it also allows the other direction. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/tests/usr.bin/xlint/lint1/msg_247.c cvs rdiff -u -r1.461 -r1.462 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/tests/usr.bin/xlint/lint1/msg_247.c diff -u src/tests/usr.bin/xlint/lint1/msg_247.c:1.23 src/tests/usr.bin/xlint/lint1/msg_247.c:1.24 --- src/tests/usr.bin/xlint/lint1/msg_247.c:1.23 Fri Jun 24 20:32:12 2022 +++ src/tests/usr.bin/xlint/lint1/msg_247.c Fri Jun 24 20:44:53 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: msg_247.c,v 1.23 2022/06/24 20:32:12 rillig Exp $ */ +/* $NetBSD: msg_247.c,v 1.24 2022/06/24 20:44:53 rillig Exp $ */ # 3 "msg_247.c" // Test for message: pointer cast from '%s' to '%s' may be troublesome [247] @@ -117,7 +117,7 @@ counter_new_cast(void) struct counter_impl *impl = allocate(); impl->public_part.count = 12345; impl->saved_count = 12346; - /* expect+1: warning: pointer cast from 'pointer to struct counter_impl' to 'pointer to struct counter' may be troublesome [247] */ + /* Before tree.c 1.462 from 2022-06-24, lint warned about this cast. */ return (struct counter *)impl; } @@ -296,9 +296,9 @@ typedef struct ctl_named_node_s { } ctl_named_node_t; void * -cast_between_initial_struct(void *ptr) +cast_between_first_member_struct(void *ptr) { - /* expect+1: warning: pointer cast from 'pointer to struct ctl_named_node_s' to 'pointer to struct ctl_node_s' may be troublesome [247] */ + /* Before tree.c 1.462 from 2022-06-24, lint warned about this cast. */ void *t1 = (ctl_node_t *)(ctl_named_node_t *)ptr; void *t2 = (ctl_named_node_t *)(ctl_node_t *)ptr; Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.461 src/usr.bin/xlint/lint1/tree.c:1.462 --- src/usr.bin/xlint/lint1/tree.c:1.461 Fri Jun 24 20:16:21 2022 +++ src/usr.bin/xlint/lint1/tree.c Fri Jun 24 20:44:53 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.461 2022/06/24 20:16:21 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.462 2022/06/24 20:44:53 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.461 2022/06/24 20:16:21 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.462 2022/06/24 20:44:53 rillig Exp $"); #endif #include <float.h> @@ -2491,6 +2491,15 @@ check_pointer_integer_conversion(op_t op } static bool +struct_starts_with(const type_t *struct_tp, const type_t *member_tp) +{ + + return struct_tp->t_str->sou_first_member != NULL && + eqtype(struct_tp->t_str->sou_first_member->s_type, member_tp, + true, false, NULL); +} + +static bool is_byte_array(const type_t *tp) { @@ -2502,14 +2511,10 @@ static bool should_warn_about_pointer_cast(const type_t *nstp, tspec_t nst, const type_t *ostp, tspec_t ost) { - /* - * Casting a pointer to 'struct S' to a pointer to another struct that - * has 'struct S' as its first member is ok, see msg_247.c, 'struct - * counter'. - */ + if (nst == STRUCT && ost == STRUCT && - nstp->t_str->sou_first_member != NULL && - nstp->t_str->sou_first_member->s_type == ostp) + (struct_starts_with(nstp, ostp) || + struct_starts_with(ostp, nstp))) return false; if (is_incomplete(nstp) || is_incomplete(ostp))