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);