Module Name: src Committed By: rillig Date: Sun Mar 10 19:45:14 UTC 2024
Modified Files: src/tests/usr.bin/xlint/lint1: expr_fold.c msg_141.c platform_ilp32_int.c platform_ilp32_long.c platform_lp64.c src/usr.bin/xlint/lint1: err.c tree.c Log Message: lint: add details to the message about integer overflow Having only the operator was too unspecific to be actionable, so add the actual numbers and the data type. To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/tests/usr.bin/xlint/lint1/expr_fold.c cvs rdiff -u -r1.15 -r1.16 src/tests/usr.bin/xlint/lint1/msg_141.c cvs rdiff -u -r1.5 -r1.6 src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c cvs rdiff -u -r1.11 -r1.12 src/tests/usr.bin/xlint/lint1/platform_lp64.c cvs rdiff -u -r1.231 -r1.232 src/usr.bin/xlint/lint1/err.c cvs rdiff -u -r1.622 -r1.623 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/expr_fold.c diff -u src/tests/usr.bin/xlint/lint1/expr_fold.c:1.14 src/tests/usr.bin/xlint/lint1/expr_fold.c:1.15 --- src/tests/usr.bin/xlint/lint1/expr_fold.c:1.14 Sun Mar 10 14:32:30 2024 +++ src/tests/usr.bin/xlint/lint1/expr_fold.c Sun Mar 10 19:45:14 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: expr_fold.c,v 1.14 2024/03/10 14:32:30 rillig Exp $ */ +/* $NetBSD: expr_fold.c,v 1.15 2024/03/10 19:45:14 rillig Exp $ */ # 3 "expr_fold.c" /* @@ -59,9 +59,9 @@ fold_uminus(void) /* The '-' is an operator, it is not part of the integer constant. */ take_int(-2147483648); - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '2147483647 + 1' overflows 'int' [141] */ take_int(-(2147483647 + 1)); - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '-(-2147483648)' overflows 'int' [141] */ take_int(-(-2147483647 - 1)); /* expect+1: warning: conversion of 'long' to 'int' is out of range, arg #1 [295] */ take_int(-(4294967295)); @@ -99,14 +99,14 @@ void fold_mult(void) { take_int(32767 * 65536); - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '32768 * 65536' overflows 'int' [141] */ take_int(32768 * 65536); - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '65536 * 65536' overflows 'int' [141] */ take_int(65536 * 65536); take_uint(32767 * 65536U); take_uint(32768 * 65536U); - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '65536 * 65536' overflows 'unsigned int' [141] */ take_uint(65536 * 65536U); } @@ -138,13 +138,13 @@ fold_mod(void) void fold_plus(void) { - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '2147483647 + 1' overflows 'int' [141] */ take_int(2147483647 + 1); /* Assume two's complement, so no overflow. */ take_int(-2147483647 + -1); - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '-2147483647 + -2' overflows 'int' [141] */ take_int(-2147483647 + -2); /* @@ -161,25 +161,25 @@ fold_plus(void) void fold_minus(void) { - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '2147483647 - -1' overflows 'int' [141] */ take_int(2147483647 - -1); /* Assume two's complement. */ take_int(-2147483647 - 1); - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '-2147483647 - 2' overflows 'int' [141] */ take_int(-2147483647 - 2); take_int(0 - 2147483648); - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '0 - 2147483648' overflows 'unsigned int' [141] */ take_uint(0 - 2147483648U); } void fold_shl(void) { - /* expect+1: warning: operator '<<' produces integer overflow [141] */ + /* expect+1: warning: '16777216 << 24' overflows 'int' [141] */ take_int(1 << 24 << 24); - /* expect+1: warning: operator '<<' produces integer overflow [141] */ + /* expect+1: warning: '16777216 << 24' overflows 'unsigned int' [141] */ take_uint(1U << 24 << 24); /* expect+1: warning: shift amount 104 is greater than bit-size 32 of 'unsigned int' [122] */ Index: src/tests/usr.bin/xlint/lint1/msg_141.c diff -u src/tests/usr.bin/xlint/lint1/msg_141.c:1.15 src/tests/usr.bin/xlint/lint1/msg_141.c:1.16 --- src/tests/usr.bin/xlint/lint1/msg_141.c:1.15 Sun Mar 10 15:49:12 2024 +++ src/tests/usr.bin/xlint/lint1/msg_141.c Sun Mar 10 19:45:14 2024 @@ -1,7 +1,7 @@ -/* $NetBSD: msg_141.c,v 1.15 2024/03/10 15:49:12 rillig Exp $ */ +/* $NetBSD: msg_141.c,v 1.16 2024/03/10 19:45:14 rillig Exp $ */ # 3 "msg_141.c" -// Test for message: operator '%s' produces integer overflow [141] +// Test for message: '%s' overflows '%s' [141] /* lint1-extra-flags: -h -X 351 */ @@ -89,7 +89,7 @@ uplus_u64(void) void uminus_s32(void) { - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '-(-2147483648)' overflows 'int' [141] */ s32 = -(-0x7fffffff - 1); s32 = - -1; s32 = -0; @@ -108,7 +108,7 @@ uminus_u32(void) void uminus_s64(void) { - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '-(-9223372036854775808)' overflows 'long long' [141] */ s64 = -(-0x7fffffffffffffffLL - 1LL); s64 = - -1LL; s64 = -0LL; @@ -127,11 +127,11 @@ uminus_u64(void) void mult_s32(void) { - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '-65536 * 65536' overflows 'int' [141] */ s32 = -0x00010000 * +0x00010000; // -0x0100000000 - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '-3 * 715827883' overflows 'int' [141] */ s32 = -0x00000003 * +0x2aaaaaab; // -0x80000001 - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '715827883 * -3' overflows 'int' [141] */ s32 = +0x2aaaaaab * -0x00000003; // -0x80000001 s32 = -0x00000008 * +0x10000000; // -0x80000000 s32 = +0x10000000 * -0x00000008; // -0x80000000 @@ -139,13 +139,13 @@ mult_s32(void) s32 = +0x3fffffff * +0x00000002; // +0x7ffffffe s32 = +0x7fffffff * +0x00000001; // +0x7fffffff s32 = +0x00000001 * +0x7fffffff; // +0x7fffffff - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '2 * 1073741824' overflows 'int' [141] */ s32 = +0x00000002 * +0x40000000; // +0x80000000 - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '1073741824 * 2' overflows 'int' [141] */ s32 = +0x40000000 * +0x00000002; // +0x80000000 - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '65535 * 65537' overflows 'int' [141] */ s32 = +0x0000ffff * +0x00010001; // +0xffffffff - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '65536 * 65536' overflows 'int' [141] */ s32 = +0x00010000 * +0x00010000; // +0x0100000000 } @@ -153,18 +153,18 @@ void mult_u32(void) { u32 = 0xffffU * 0x10001U; // +0xffffffff - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '65536 * 65536' overflows 'unsigned int' [141] */ u32 = 0x10000U * 0x10000U; // +0x0100000000 } void mult_s64(void) { - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '-4294967296 * 4294967296' overflows 'long long' [141] */ s64 = -0x100000000LL * 0x100000000LL; // -0x010000000000000000 - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '-3 * 3074457345618258603' overflows 'long long' [141] */ s64 = -3LL * 0x2aaaaaaaaaaaaaabLL; // -0x8000000000000001 - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '3074457345618258603 * -3' overflows 'long long' [141] */ s64 = 0x2aaaaaaaaaaaaaabLL * -3LL; // -0x8000000000000001 s64 = -8LL * +0x1000000000000000LL; // -0x8000000000000000 s64 = +0x1000000000000000LL * -8LL; // -0x8000000000000000 @@ -172,13 +172,13 @@ mult_s64(void) s64 = +0x3fffffffffffffffLL * +2LL; // +0x7ffffffffffffffe s64 = +0x7fffffffffffffffLL * +1LL; // +0x7fffffffffffffff s64 = +1LL * +0x7fffffffffffffffLL; // +0x7fffffffffffffff - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '2 * 4611686018427387904' overflows 'long long' [141] */ s64 = +2LL * +0x4000000000000000LL; // +0x8000000000000000 - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '4611686018427387904 * 2' overflows 'long long' [141] */ s64 = +0x4000000000000000LL * +2LL; // +0x8000000000000000 - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '4294967295 * 4294967297' overflows 'long long' [141] */ s64 = +0xffffffffLL * +0x100000001LL; // +0xffffffffffffffff - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '4294967296 * 4294967296' overflows 'long long' [141] */ s64 = +0x100000000LL * +0x100000000LL; // +0x010000000000000000 } @@ -187,14 +187,14 @@ mult_u64(void) { u64 = 0xffffffffULL * 0x100000001ULL; // +0xffffffffffffffff u64 = 0x00010000ULL * 0x00010000ULL; // +0x0100000000 - /* expect+1: warning: operator '*' produces integer overflow [141] */ + /* expect+1: warning: '4294967296 * 4294967296' overflows 'unsigned long long' [141] */ u64 = 0x100000000ULL * 0x100000000ULL; // +0x010000000000000000 } void div_s32(void) { - /* expect+1: warning: operator '/' produces integer overflow [141] */ + /* expect+1: warning: '-2147483648 / -1' overflows 'int' [141] */ s32 = (-0x7fffffff - 1) / -1; s32 = (-0x7fffffff - 1) / 1; s32 = 0x7fffffff / -1; @@ -218,7 +218,7 @@ div_u32(void) void div_s64(void) { - /* expect+1: warning: operator '/' produces integer overflow [141] */ + /* expect+1: warning: '-9223372036854775808 / -1' overflows 'long long' [141] */ s64 = (-0x7fffffffffffffffLL - 1LL) / -1LL; s64 = (-0x7fffffffffffffffLL - 1LL) / 1LL; s64 = (-0x7fffffffffffffffLL - 1LL) / 0x7fffffffffffffffLL; @@ -247,7 +247,7 @@ mod_s32(void) { s32 = -1 % (-0x7fffffff - 1); s32 = -1 % 0x7fffffff; - /* expect+1: warning: operator '%' produces integer overflow [141] */ + /* expect+1: warning: '-2147483648 % -1' overflows 'int' [141] */ s32 = (-0x7fffffff - 1) % -1; s32 = 0x7fffffff % -1; } @@ -268,7 +268,7 @@ mod_s64(void) { s64 = -1LL % (-0x7fffffffffffffffLL - 1LL); s64 = -1LL % 0x7fffffffffffffffLL; - /* expect+1: warning: operator '%' produces integer overflow [141] */ + /* expect+1: warning: '-9223372036854775808 % -1' overflows 'long long' [141] */ s64 = (-0x7fffffffffffffffLL - 1LL) % -1LL; s64 = 0x7fffffffffffffffLL % -1LL; } @@ -287,11 +287,11 @@ mod_u64(void) void plus_s32(void) { - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '-2147483647 + -2147483647' overflows 'int' [141] */ s32 = -0x7fffffff + -0x7fffffff; - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '-2147483647 + -2' overflows 'int' [141] */ s32 = -0x7fffffff + -2; // INT_MIN - 1 - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '-2 + -2147483647' overflows 'int' [141] */ s32 = -2 + -0x7fffffff; // INT_MIN - 1 s32 = -0x7fffffff + -1; // INT_MIN s32 = -1 + -0x7fffffff; // INT_MIN @@ -303,13 +303,13 @@ plus_s32(void) s32 = 1 + 0x7ffffffe; // INT_MAX s32 = 0x7fffffff + 0; // INT_MAX s32 = 0 + 0x7fffffff; // INT_MAX - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '2147483647 + 1' overflows 'int' [141] */ s32 = 0x7fffffff + 1; // INT_MAX + 1 - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '1 + 2147483647' overflows 'int' [141] */ s32 = 1 + 0x7fffffff; // INT_MAX + 1 - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '1073741824 + 1073741824' overflows 'int' [141] */ s32 = 0x40000000 + 0x40000000; // INT_MAX + 1 - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '2147483647 + 2147483647' overflows 'int' [141] */ s32 = 0x7fffffff + 0x7fffffff; } @@ -321,22 +321,22 @@ plus_u32(void) u32 = 0xffffffffU + 0x00000000U; u32 = 0x00000000U + 0xffffffffU; u32 = 0xfffffffeU + 0x00000001U; - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '4294967295 + 1' overflows 'unsigned int' [141] */ u32 = 0xffffffffU + 0x00000001U; - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '1 + 4294967295' overflows 'unsigned int' [141] */ u32 = 0x00000001U + 0xffffffffU; - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '4294967295 + 4294967295' overflows 'unsigned int' [141] */ u32 = 0xffffffffU + 0xffffffffU; } void plus_s64(void) { - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '-9223372036854775807 + -2' overflows 'long long' [141] */ s64 = -0x7fffffffffffffffLL + -2LL; s64 = -0x7fffffffffffffffLL + -1LL; s64 = 0x7ffffffffffffffeLL + 1LL; - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '9223372036854775807 + 1' overflows 'long long' [141] */ s64 = 0x7fffffffffffffffLL + 1LL; } @@ -347,18 +347,18 @@ plus_u64(void) u64 = 0xffffffffffffffffULL + 0x0000000000000000ULL; u64 = 0x0000000000000000ULL + 0xffffffffffffffffULL; u64 = 0xfffffffffffffffeULL + 0x0000000000000001ULL; - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '18446744073709551615 + 1' overflows 'unsigned long long' [141] */ u64 = 0xffffffffffffffffULL + 0x0000000000000001ULL; - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '1 + 18446744073709551615' overflows 'unsigned long long' [141] */ u64 = 0x0000000000000001ULL + 0xffffffffffffffffULL; - /* expect+1: warning: operator '+' produces integer overflow [141] */ + /* expect+1: warning: '18446744073709551615 + 18446744073709551615' overflows 'unsigned long long' [141] */ u64 = 0xffffffffffffffffULL + 0xffffffffffffffffULL; } void minus_s32(void) { - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '-2147483647 - 2' overflows 'int' [141] */ s32 = -0x7fffffff - 2; s32 = -0x7fffffff - 1; s32 = -0x7fffffff - 1 - 0; @@ -366,7 +366,7 @@ minus_s32(void) s32 = 0x7fffffff - 0x7fffffff; s32 = 0x7fffffff - 1; s32 = 0x7fffffff - 0; - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '2147483647 - -1' overflows 'int' [141] */ s32 = 0x7fffffff - -1; } @@ -374,12 +374,12 @@ void minus_u32(void) { u32 = 0x00000000U - 0x00000000U; - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '0 - 1' overflows 'unsigned int' [141] */ u32 = 0x00000000U - 0x00000001U; - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '0 - 2147483648' overflows 'unsigned int' [141] */ u32 = 0x00000000U - 0x80000000U; u32 = 0x80000000U - 0x00000001U; - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '0 - 4294967295' overflows 'unsigned int' [141] */ u32 = 0x00000000U - 0xffffffffU; u32 = 0xffffffffU - 0x00000000U; u32 = 0xffffffffU - 0xffffffffU; @@ -388,18 +388,18 @@ minus_u32(void) void minus_s64(void) { - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '-9223372036854775807 - 9223372036854775807' overflows 'long long' [141] */ s64 = -0x7fffffffffffffffLL - 0x7fffffffffffffffLL; - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '-9223372036854775807 - 2' overflows 'long long' [141] */ s64 = -0x7fffffffffffffffLL - 2LL; s64 = -0x7fffffffffffffffLL - 1LL; s64 = -0x7fffffffffffffffLL - 0LL; s64 = -0x7fffffffffffffffLL - -1LL; s64 = 0x7fffffffffffffffLL - 1LL; s64 = 0x7fffffffffffffffLL - 0LL; - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '9223372036854775807 - -1' overflows 'long long' [141] */ s64 = 0x7fffffffffffffffLL - -1LL; - /* expect+1: warning: operator '-' produces integer overflow [141] */ + /* expect+1: warning: '9223372036854775807 - -9223372036854775807' overflows 'long long' [141] */ s64 = 0x7fffffffffffffffLL - -0x7fffffffffffffffLL; } @@ -412,9 +412,9 @@ minus_u64(void) void shl_s32(void) { - /* expect+1: warning: operator '<<' produces integer overflow [141] */ + /* expect+1: warning: '256 << 23' overflows 'int' [141] */ s32 = 0x0100 << 23; - /* expect+1: warning: operator '<<' produces integer overflow [141] */ + /* expect+1: warning: '256 << 24' overflows 'int' [141] */ s32 = 0x0100 << 24; /* expect+1: warning: shift amount 18446744073709551615 is greater than bit-size 32 of 'int' [122] */ s32 = 0 << 0xffffffffffffffff; @@ -424,7 +424,7 @@ void shl_u32(void) { u32 = 0x0100U << 23; - /* expect+1: warning: operator '<<' produces integer overflow [141] */ + /* expect+1: warning: '256 << 24' overflows 'unsigned int' [141] */ u32 = 0x0100U << 24; /* expect+1: warning: negative shift [121] */ u32 = 0x0000U << -1; Index: src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c diff -u src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c:1.5 src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c:1.6 --- src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c:1.5 Sun Mar 10 16:06:13 2024 +++ src/tests/usr.bin/xlint/lint1/platform_ilp32_int.c Sun Mar 10 19:45:14 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: platform_ilp32_int.c,v 1.5 2024/03/10 16:06:13 rillig Exp $ */ +/* $NetBSD: platform_ilp32_int.c,v 1.6 2024/03/10 19:45:14 rillig Exp $ */ # 3 "platform_ilp32_int.c" /* @@ -64,22 +64,22 @@ array_index(void) /* expect+1: warning: array subscript cannot be > 19: 16777215 [168] */ u64 += u64_buf[0x00ffffff]; - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '2147483647 * 8' overflows 'int' [141] */ /* expect+1: warning: array subscript cannot be > 19: 268435455 [168] */ u64 += u64_buf[0x7fffffff]; /* expect+3: warning: conversion of 'long long' to 'int' is out of range [119] */ - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '-2147483648 * 8' overflows 'int' [141] */ /* expect+1: warning: array subscript cannot be negative: -268435456 [167] */ u64 += u64_buf[2147483648]; /* expect+3: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '-2147483648 * 8' overflows 'int' [141] */ /* expect+1: warning: array subscript cannot be negative: -268435456 [167] */ u64 += u64_buf[0x80000000]; /* expect+2: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ /* expect+1: warning: array subscript cannot be negative: -1 [167] */ u64 += u64_buf[0xffffffff]; /* expect+3: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '-2147483648 * 8' overflows 'int' [141] */ /* expect+1: warning: array subscript cannot be negative: -268435456 [167] */ u64 += u64_buf[0x80000000]; /* expect+2: warning: conversion of 'unsigned int' to 'int' is out of range [119] */ Index: src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c diff -u src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c:1.7 src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c:1.8 --- src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c:1.7 Sun Mar 10 16:06:13 2024 +++ src/tests/usr.bin/xlint/lint1/platform_ilp32_long.c Sun Mar 10 19:45:14 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: platform_ilp32_long.c,v 1.7 2024/03/10 16:06:13 rillig Exp $ */ +/* $NetBSD: platform_ilp32_long.c,v 1.8 2024/03/10 19:45:14 rillig Exp $ */ # 3 "platform_ilp32_long.c" /* @@ -73,22 +73,22 @@ array_index(void) /* expect+1: warning: array subscript cannot be > 19: 16777215 [168] */ u64 += u64_buf[0x00ffffff]; - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '2147483647 * 8' overflows 'long' [141] */ /* expect+1: warning: array subscript cannot be > 19: 268435455 [168] */ u64 += u64_buf[0x7fffffff]; /* expect+3: warning: conversion of 'long long' to 'long' is out of range [119] */ - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '-2147483648 * 8' overflows 'long' [141] */ /* expect+1: warning: array subscript cannot be negative: -268435456 [167] */ u64 += u64_buf[2147483648]; /* expect+3: warning: conversion of 'unsigned int' to 'long' is out of range [119] */ - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '-2147483648 * 8' overflows 'long' [141] */ /* expect+1: warning: array subscript cannot be negative: -268435456 [167] */ u64 += u64_buf[0x80000000]; /* expect+2: warning: conversion of 'unsigned int' to 'long' is out of range [119] */ /* expect+1: warning: array subscript cannot be negative: -1 [167] */ u64 += u64_buf[0xffffffff]; /* expect+3: warning: conversion of 'unsigned int' to 'long' is out of range [119] */ - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '-2147483648 * 8' overflows 'long' [141] */ /* expect+1: warning: array subscript cannot be negative: -268435456 [167] */ u64 += u64_buf[0x80000000]; /* expect+2: warning: conversion of 'unsigned int' to 'long' is out of range [119] */ Index: src/tests/usr.bin/xlint/lint1/platform_lp64.c diff -u src/tests/usr.bin/xlint/lint1/platform_lp64.c:1.11 src/tests/usr.bin/xlint/lint1/platform_lp64.c:1.12 --- src/tests/usr.bin/xlint/lint1/platform_lp64.c:1.11 Sun Mar 10 16:06:13 2024 +++ src/tests/usr.bin/xlint/lint1/platform_lp64.c Sun Mar 10 19:45:14 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: platform_lp64.c,v 1.11 2024/03/10 16:06:13 rillig Exp $ */ +/* $NetBSD: platform_lp64.c,v 1.12 2024/03/10 19:45:14 rillig Exp $ */ # 3 "platform_lp64.c" /* @@ -91,13 +91,13 @@ array_index(void) u64 += u64_buf[0x00ffffffffffffff]; /* expect+1: warning: array subscript cannot be > 19: 1152921504606846975 [168] */ u64 += u64_buf[0x0fffffffffffffff]; - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '2305843009213693951 * 8' overflows 'long' [141] */ /* expect+1: warning: array subscript cannot be > 19: 1152921504606846975 [168] */ u64 += u64_buf[0x1fffffffffffffff]; - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '4611686018427387903 * 8' overflows 'long' [141] */ /* expect+1: warning: array subscript cannot be > 19: 1152921504606846975 [168] */ u64 += u64_buf[0x3fffffffffffffff]; - /* expect+2: warning: operator '*' produces integer overflow [141] */ + /* expect+2: warning: '9223372036854775807 * 8' overflows 'long' [141] */ /* expect+1: warning: array subscript cannot be > 19: 1152921504606846975 [168] */ u64 += u64_buf[0x7fffffffffffffff]; /* expect+1: warning: array subscript cannot be negative: -1 [167] */ Index: src/usr.bin/xlint/lint1/err.c diff -u src/usr.bin/xlint/lint1/err.c:1.231 src/usr.bin/xlint/lint1/err.c:1.232 --- src/usr.bin/xlint/lint1/err.c:1.231 Sun Mar 3 13:09:22 2024 +++ src/usr.bin/xlint/lint1/err.c Sun Mar 10 19:45:14 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: err.c,v 1.231 2024/03/03 13:09:22 rillig Exp $ */ +/* $NetBSD: err.c,v 1.232 2024/03/10 19:45:14 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.231 2024/03/03 13:09:22 rillig Exp $"); +__RCSID("$NetBSD: err.c,v 1.232 2024/03/10 19:45:14 rillig Exp $"); #endif #include <limits.h> @@ -196,7 +196,7 @@ static const char *const msgs[] = { "unknown operand size, op '%s'", // 138 "division by 0", // 139 "modulus by 0", // 140 - "operator '%s' produces integer overflow", // 141 + "'%s' overflows '%s'", // 141 "operator '%s' produces floating point overflow", // 142 "cannot take size/alignment of incomplete type", // 143 "cannot take size/alignment of function type '%s'", // 144 Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.622 src/usr.bin/xlint/lint1/tree.c:1.623 --- src/usr.bin/xlint/lint1/tree.c:1.622 Sun Mar 10 16:06:13 2024 +++ src/usr.bin/xlint/lint1/tree.c Sun Mar 10 19:45:14 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.622 2024/03/10 16:06:13 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.623 2024/03/10 19:45:14 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.622 2024/03/10 16:06:13 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.623 2024/03/10 19:45:14 rillig Exp $"); #endif #include <float.h> @@ -967,6 +967,19 @@ fold_constant_integer(tnode_t *tn) if (u_res > mask) overflow = true; res = (int64_t)u_res; + if (overflow && hflag) { + char buf[128]; + if (is_binary(tn)) { + snprintf(buf, sizeof(buf), "%ju %s %ju", + (uintmax_t)l, op_name(tn->tn_op), + (uintmax_t)r); + } else { + snprintf(buf, sizeof(buf), "%s%ju", + op_name(tn->tn_op), (uintmax_t)l); + } + /* '%s' overflows '%s' */ + warning(141, buf, type_name(tn->tn_type)); + } } else { int64_t max_value = (int64_t)(mask >> 1); int64_t min_value = -max_value - 1; @@ -974,12 +987,24 @@ fold_constant_integer(tnode_t *tn) l, r, min_value, max_value, &overflow); if (res < min_value || res > max_value) overflow = true; + if (overflow && hflag) { + char buf[128]; + if (is_binary(tn)) { + snprintf(buf, sizeof(buf), "%jd %s %jd", + (intmax_t)l, op_name(tn->tn_op), + (intmax_t)r); + } else if (tn->tn_op == UMINUS && l < 0) { + snprintf(buf, sizeof(buf), "-(%jd)", + (intmax_t)l); + } else { + snprintf(buf, sizeof(buf), "%s%jd", + op_name(tn->tn_op), (intmax_t)l); + } + /* '%s' overflows '%s' */ + warning(141, buf, type_name(tn->tn_type)); + } } - if (overflow && hflag) - /* operator '%s' produces integer overflow */ - warning(141, op_name(tn->tn_op)); - val_t *v = xcalloc(1, sizeof(*v)); v->v_tspec = tn->tn_type->t_tspec; v->u.integer = convert_integer(res, t, 0);