Module Name: src Committed By: rillig Date: Sat Mar 30 17:12:26 UTC 2024
Modified Files: src/tests/usr.bin/xlint/lint1: msg_168.c platform_ilp32_int.c platform_lp64.c queries.c src/usr.bin/xlint/lint1: err.c init.c tree.c Log Message: lint: do not convert array subscripts from size_t to ptrdiff_t The C standards do not specify a fixed type for an array subscript, it just has to be an integer type. Previously, query 4 fired for the ubiquitous expression 'ptr[sz]' when sz had type 'size_t'. The test platform_ilp32_long is unaffected by this change, as the integer constant 0x80000000 has type 'unsigned int', while size_t is 'unsigned long' on those platforms, and even though the types 'unsigned int' and 'unsigned long' have the same value space, there's still a conversion, at least for now. To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/tests/usr.bin/xlint/lint1/msg_168.c cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c cvs rdiff -u -r1.13 -r1.14 src/tests/usr.bin/xlint/lint1/platform_lp64.c cvs rdiff -u -r1.24 -r1.25 src/tests/usr.bin/xlint/lint1/queries.c cvs rdiff -u -r1.237 -r1.238 src/usr.bin/xlint/lint1/err.c cvs rdiff -u -r1.267 -r1.268 src/usr.bin/xlint/lint1/init.c cvs rdiff -u -r1.630 -r1.631 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_168.c diff -u src/tests/usr.bin/xlint/lint1/msg_168.c:1.12 src/tests/usr.bin/xlint/lint1/msg_168.c:1.13 --- src/tests/usr.bin/xlint/lint1/msg_168.c:1.12 Sat Mar 30 16:47:45 2024 +++ src/tests/usr.bin/xlint/lint1/msg_168.c Sat Mar 30 17:12:26 2024 @@ -1,7 +1,7 @@ -/* $NetBSD: msg_168.c,v 1.12 2024/03/30 16:47:45 rillig Exp $ */ +/* $NetBSD: msg_168.c,v 1.13 2024/03/30 17:12:26 rillig Exp $ */ # 3 "msg_168.c" -// Test for message: array subscript %jd cannot be > %d [168] +// Test for message: array subscript %ju cannot be > %d [168] /* lint1-extra-flags: -X 351 */ Index: src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c diff -u src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c:1.7 src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c:1.8 --- src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c:1.7 Sat Mar 30 16:47:45 2024 +++ src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c Sat Mar 30 17:12:26 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: platform_ilp32_int.c,v 1.7 2024/03/30 16:47:45 rillig Exp $ */ +/* $NetBSD: platform_ilp32_int.c,v 1.8 2024/03/30 17:12:26 rillig Exp $ */ # 3 "platform_ilp32_int.c" /* @@ -44,17 +44,13 @@ array_index(void) /* expect+2: warning: conversion of 'long long' to 'int' is out of range [119] */ /* expect+1: warning: array subscript -2147483648 cannot be negative [167] */ u8 += u8_buf[2147483648]; - /* expect+2: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ - /* expect+1: warning: array subscript -2147483648 cannot be negative [167] */ + /* expect+1: warning: array subscript 2147483648 cannot be > 19 [168] */ u8 += u8_buf[0x80000000]; - /* expect+2: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ - /* expect+1: warning: array subscript -1 cannot be negative [167] */ + /* expect+1: warning: array subscript 4294967295 cannot be > 19 [168] */ u8 += u8_buf[0xffffffff]; - /* expect+2: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ - /* expect+1: warning: array subscript -2147483648 cannot be negative [167] */ + /* expect+1: warning: array subscript 2147483648 cannot be > 19 [168] */ u8 += u8_buf[0x80000000]; - /* expect+2: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ - /* expect+1: warning: array subscript -1 cannot be negative [167] */ + /* expect+1: warning: array subscript 4294967295 cannot be > 19 [168] */ u8 += u8_buf[0xffffffff]; /* expect+2: warning: conversion of 'long long' to 'int' is out of range [119] */ /* expect+1: warning: array subscript -1 cannot be negative [167] */ @@ -71,19 +67,15 @@ array_index(void) /* expect+2: warning: '-2147483648 * 8' overflows 'int' [141] */ /* expect+1: warning: array subscript -268435456 cannot be negative [167] */ u64 += u64_buf[2147483648]; - /* expect+3: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ - /* expect+2: warning: '-2147483648 * 8' overflows 'int' [141] */ - /* expect+1: warning: array subscript -268435456 cannot be negative [167] */ + /* expect+1: warning: '2147483648 * 8' overflows 'unsigned int' [141] */ u64 += u64_buf[0x80000000]; - /* expect+2: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ - /* expect+1: warning: array subscript -1 cannot be negative [167] */ + /* expect+2: warning: '4294967295 * 8' overflows 'unsigned int' [141] */ + /* expect+1: warning: array subscript 536870911 cannot be > 19 [168] */ u64 += u64_buf[0xffffffff]; - /* expect+3: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ - /* expect+2: warning: '-2147483648 * 8' overflows 'int' [141] */ - /* expect+1: warning: array subscript -268435456 cannot be negative [167] */ + /* expect+1: warning: '2147483648 * 8' overflows 'unsigned int' [141] */ u64 += u64_buf[0x80000000]; - /* expect+2: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ - /* expect+1: warning: array subscript -1 cannot be negative [167] */ + /* expect+2: warning: '4294967295 * 8' overflows 'unsigned int' [141] */ + /* expect+1: warning: array subscript 536870911 cannot be > 19 [168] */ u64 += u64_buf[0xffffffff]; /* expect+2: warning: conversion of 'long long' to 'int' is out of range [119] */ /* expect+1: warning: array subscript -1 cannot be negative [167] */ Index: src/tests/usr.bin/xlint/lint1/platform_lp64.c diff -u src/tests/usr.bin/xlint/lint1/platform_lp64.c:1.13 src/tests/usr.bin/xlint/lint1/platform_lp64.c:1.14 --- src/tests/usr.bin/xlint/lint1/platform_lp64.c:1.13 Sat Mar 30 16:47:45 2024 +++ src/tests/usr.bin/xlint/lint1/platform_lp64.c Sat Mar 30 17:12:26 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: platform_lp64.c,v 1.13 2024/03/30 16:47:45 rillig Exp $ */ +/* $NetBSD: platform_lp64.c,v 1.14 2024/03/30 17:12:26 rillig Exp $ */ # 3 "platform_lp64.c" /* @@ -70,7 +70,7 @@ array_index(void) u8 += u8_buf[0xffffffff]; /* expect+1: warning: array subscript 72057594037927935 cannot be > 19 [168] */ u8 += u8_buf[0x00ffffffffffffff]; - /* expect+1: warning: array subscript -1 cannot be negative [167] */ + /* expect+1: warning: array subscript 18446744073709551615 cannot be > 19 [168] */ u8 += u8_buf[0xffffffffffffffff]; /* expect+1: warning: array subscript 16777215 cannot be > 19 [168] */ @@ -100,6 +100,7 @@ array_index(void) /* expect+2: warning: '9223372036854775807 * 8' overflows 'long' [141] */ /* expect+1: warning: array subscript 1152921504606846975 cannot be > 19 [168] */ u64 += u64_buf[0x7fffffffffffffff]; - /* expect+1: warning: array subscript -1 cannot be negative [167] */ + /* expect+2: warning: '18446744073709551615 * 8' overflows 'unsigned long' [141] */ + /* expect+1: warning: array subscript 2305843009213693951 cannot be > 19 [168] */ u64 += u64_buf[0xffffffffffffffff]; } Index: src/tests/usr.bin/xlint/lint1/queries.c diff -u src/tests/usr.bin/xlint/lint1/queries.c:1.24 src/tests/usr.bin/xlint/lint1/queries.c:1.25 --- src/tests/usr.bin/xlint/lint1/queries.c:1.24 Fri Feb 2 19:07:58 2024 +++ src/tests/usr.bin/xlint/lint1/queries.c Sat Mar 30 17:12:26 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: queries.c,v 1.24 2024/02/02 19:07:58 rillig Exp $ */ +/* $NetBSD: queries.c,v 1.25 2024/03/30 17:12:26 rillig Exp $ */ # 3 "queries.c" /* @@ -34,6 +34,7 @@ typedef double _Complex c64_t; typedef char *str_t; typedef const char *cstr_t; typedef volatile char *vstr_t; +typedef typeof(sizeof 0) size_t; _Bool cond; @@ -101,7 +102,7 @@ Q3(int i, unsigned u) } unsigned long long -Q4(signed char *ptr, int i, unsigned long long ull) +Q4(signed char *ptr, int i, unsigned long long ull, size_t sz) { /* @@ -126,6 +127,8 @@ Q4(signed char *ptr, int i, unsigned lon /* expect+1: implicit conversion changes sign from 'int' to 'unsigned int' [Q3] */ u32 = u32 & u8; + s8 = ptr[sz]; + /* * The conversion from 'signed char' to 'int' is done by the integer * promotions (C11 6.3.1.1p2), not by the usual arithmetic @@ -351,9 +354,9 @@ Q9(int x) return (0.0); case 9: return -# 355 "queries.c" 3 4 +# 358 "queries.c" 3 4 ((void *)0) -# 357 "queries.c" +# 360 "queries.c" /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to void' [183] */ ; case 10: Index: src/usr.bin/xlint/lint1/err.c diff -u src/usr.bin/xlint/lint1/err.c:1.237 src/usr.bin/xlint/lint1/err.c:1.238 --- src/usr.bin/xlint/lint1/err.c:1.237 Sat Mar 30 16:47:44 2024 +++ src/usr.bin/xlint/lint1/err.c Sat Mar 30 17:12:26 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: err.c,v 1.237 2024/03/30 16:47:44 rillig Exp $ */ +/* $NetBSD: err.c,v 1.238 2024/03/30 17:12:26 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: err.c,v 1.237 2024/03/30 16:47:44 rillig Exp $"); +__RCSID("$NetBSD: err.c,v 1.238 2024/03/30 17:12:26 rillig Exp $"); #endif #include <limits.h> @@ -223,7 +223,7 @@ static const char *const msgs[] = { "constant truncated by assignment", // 165 "precision lost in bit-field assignment", // 166 "array subscript %jd cannot be negative", // 167 - "array subscript %jd cannot be > %d", // 168 + "array subscript %ju cannot be > %d", // 168 "precedence confusion possible: parenthesize!", // 169 "first operand of '?' must have scalar type", // 170 "cannot assign to '%s' from '%s'", // 171 Index: src/usr.bin/xlint/lint1/init.c diff -u src/usr.bin/xlint/lint1/init.c:1.267 src/usr.bin/xlint/lint1/init.c:1.268 --- src/usr.bin/xlint/lint1/init.c:1.267 Sat Mar 30 16:47:44 2024 +++ src/usr.bin/xlint/lint1/init.c Sat Mar 30 17:12:26 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: init.c,v 1.267 2024/03/30 16:47:44 rillig Exp $ */ +/* $NetBSD: init.c,v 1.268 2024/03/30 17:12:26 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: init.c,v 1.267 2024/03/30 16:47:44 rillig Exp $"); +__RCSID("$NetBSD: init.c,v 1.268 2024/03/30 17:12:26 rillig Exp $"); #endif #include <stdlib.h> @@ -801,8 +801,8 @@ initialization_add_designator_subscript( } if (!tp->t_incomplete_array && subscript >= (size_t)tp->u.dimension) { - /* array subscript %jd cannot be > %d */ - error(168, (intmax_t)subscript, tp->u.dimension - 1); + /* array subscript %ju cannot be > %d */ + error(168, (uintmax_t)subscript, tp->u.dimension - 1); subscript = 0; /* suppress further errors */ } Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.630 src/usr.bin/xlint/lint1/tree.c:1.631 --- src/usr.bin/xlint/lint1/tree.c:1.630 Sat Mar 30 16:47:44 2024 +++ src/usr.bin/xlint/lint1/tree.c Sat Mar 30 17:12:26 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.630 2024/03/30 16:47:44 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.631 2024/03/30 17:12:26 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.630 2024/03/30 16:47:44 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.631 2024/03/30 17:12:26 rillig Exp $"); #endif #include <float.h> @@ -1183,14 +1183,17 @@ build_plus_minus(op_t op, bool sys, tnod } /* pointer +- integer */ - if (ln->tn_type->t_tspec == PTR && rn->tn_type->t_tspec != PTR) { - lint_assert(is_integer(rn->tn_type->t_tspec)); + tspec_t lt = ln->tn_type->t_tspec; + tspec_t rt = rn->tn_type->t_tspec; + if (lt == PTR && rt != PTR) { + lint_assert(is_integer(rt)); check_ctype_macro_invocation(ln, rn); check_enum_array_index(ln, rn); tnode_t *elsz = subt_size_in_bytes(ln->tn_type); - if (rn->tn_type->t_tspec != elsz->tn_type->t_tspec) + tspec_t szt = elsz->tn_type->t_tspec; + if (rt != szt && rt != unsigned_type(szt)) rn = convert(NOOP, 0, elsz->tn_type, rn); tnode_t *prod = build_op(MULT, sys, rn->tn_type, rn, elsz); @@ -1201,8 +1204,8 @@ build_plus_minus(op_t op, bool sys, tnod } /* pointer - pointer */ - if (rn->tn_type->t_tspec == PTR) { - lint_assert(ln->tn_type->t_tspec == PTR); + if (rt == PTR) { + lint_assert(lt == PTR); lint_assert(op == MINUS); type_t *ptrdiff = gettyp(PTRDIFF_TSPEC); @@ -4438,7 +4441,7 @@ proceed:; /* array subscript %jd cannot be negative */ warning(167, (intmax_t)con); else if (dim > 0 && (uint64_t)con >= (uint64_t)dim) - /* array subscript %jd cannot be > %d */ + /* array subscript %ju cannot be > %d */ warning(168, (uintmax_t)con, dim - 1); }