Skip to content

Commit 3a28c2c

Browse files
committed
Merge tag 'unsigned-char-6.2-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/zx2c4/linux
Pull unsigned-char conversion from Jason Donenfeld: "Enable -funsigned-char and fix code affected by that flag. During the 6.1 cycle, several patches already made it into the tree, which were for code that was already broken on at least one architecture, where the naked char had a different sign than the code author anticipated, or were part of some bug fix for an existing bug that this initiative unearthed. These 6.1-era fixes are: 6480609 ("MIPS: pic32: treat port as signed integer") 5c26159 ("ipvs: use explicitly signed chars") e6cb876 ("wifi: airo: do not assign -1 to unsigned char") 937ec9f ("staging: rtl8192e: remove bogus ssid character sign test") 6770473 ("misc: sgi-gru: use explicitly signed char") 50895a5 ("ALSA: rme9652: use explicitly signed char") ee03c0f ("ALSA: au88x0: use explicitly signed char") 835bed1 ("fbdev: sisfb: use explicitly signed char") 50f1969 ("parisc: Use signed char for hardware path in pdc.h") 6606303 ("wifi: rt2x00: use explicitly signed or unsigned types") Regarding patches in this pull: - There is one patch in this pull that should have made it to you during 6.1 ("media: stv0288: use explicitly signed char"), but the maintainer was MIA during the cycle, so it's in here instead. - Two patches fix single architecture code affected by unsigned char ("perf/x86: Make struct p4_event_bind::cntr signed array" and "sparc: sbus: treat CPU index as integer"), while one patch fixes an unused typedef, in case it's ever used in the future ("media: atomisp: make hive_int8 explictly signed"). - Finally, there's the change to actually enable -funsigned-char ("kbuild: treat char as always unsigned") and then the removal of some no longer useful !__CHAR_UNSIGNED__ selftest code ("lib: assume char is unsigned"). The various fixes were found with a combination of diffing objdump output, a large variety of Coccinelle scripts, and plain old grep. In the end, things didn't seem as bad as I feared they would. But of course, it's also possible I missed things. However, this has been in linux-next for basically an entire cycle now, so I'm not overly worried. I've also been daily driving this on my laptop for all of 6.1. Still, this series, and the ones sent for 6.1 don't total in quantity to what I thought it'd be, so I will be on the lookout for breakage. We could receive a few reports that are quickly fixable. Hopefully we won't receive a barrage of reports that would result in a revert. And just maybe we won't receive any reports at all and nobody will even notice. Knock on wood" * tag 'unsigned-char-6.2-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/zx2c4/linux: lib: assume char is unsigned kbuild: treat char as always unsigned media: atomisp: make hive_int8 explictly signed media: stv0288: use explicitly signed char sparc: sbus: treat CPU index as integer perf/x86: Make struct p4_event_bind::cntr signed array
2 parents 74dc488 + 0445d1b commit 3a28c2c

File tree

7 files changed

+7
-24
lines changed

7 files changed

+7
-24
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ KBUILD_AFLAGS := -D__ASSEMBLY__ -fno-PIE
562562
KBUILD_CFLAGS := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \
563563
-fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
564564
-Werror=implicit-function-declaration -Werror=implicit-int \
565-
-Werror=return-type -Wno-format-security \
565+
-Werror=return-type -Wno-format-security -funsigned-char \
566566
-std=gnu11
567567
KBUILD_CPPFLAGS := -D__KERNEL__
568568
KBUILD_RUSTFLAGS := $(rust_common_flags) \

arch/x86/events/intel/p4.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ struct p4_event_bind {
2424
unsigned int escr_msr[2]; /* ESCR MSR for this event */
2525
unsigned int escr_emask; /* valid ESCR EventMask bits */
2626
unsigned int shared; /* event is shared across threads */
27-
char cntr[2][P4_CNTR_LIMIT]; /* counter index (offset), -1 on absence */
27+
signed char cntr[2][P4_CNTR_LIMIT]; /* counter index (offset), -1 on absence */
2828
};
2929

3030
struct p4_pebs_bind {

drivers/media/dvb-frontends/stv0288.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -440,9 +440,8 @@ static int stv0288_set_frontend(struct dvb_frontend *fe)
440440
struct stv0288_state *state = fe->demodulator_priv;
441441
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
442442

443-
char tm;
444-
unsigned char tda[3];
445-
u8 reg, time_out = 0;
443+
u8 tda[3], reg, time_out = 0;
444+
s8 tm;
446445

447446
dprintk("%s : FE_SET_FRONTEND\n", __func__);
448447

drivers/sbus/char/envctrl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,8 @@ static int envctrl_read_cpu_info(int cpu, struct i2c_child_t *pchild,
363363
char mon_type, unsigned char *bufdata)
364364
{
365365
unsigned char data;
366-
int i;
367-
char *tbl, j = -1;
366+
int i, j = -1;
367+
char *tbl;
368368

369369
/* Find the right monitor type and channel. */
370370
for (i = 0; i < PCF8584_MAX_CHANNELS; i++) {

drivers/staging/media/atomisp/pci/hive_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ typedef unsigned int hive_bool;
4242
#define hive_false 0
4343
#define hive_true 1
4444

45-
typedef char hive_int8;
45+
typedef signed char hive_int8;
4646
typedef short hive_int16;
4747
typedef int hive_int32;
4848
typedef long long hive_int64;

lib/is_signed_type_kunit.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,7 @@ static void is_signed_type_test(struct kunit *test)
2121
KUNIT_EXPECT_EQ(test, is_signed_type(bool), false);
2222
KUNIT_EXPECT_EQ(test, is_signed_type(signed char), true);
2323
KUNIT_EXPECT_EQ(test, is_signed_type(unsigned char), false);
24-
#ifdef __CHAR_UNSIGNED__
2524
KUNIT_EXPECT_EQ(test, is_signed_type(char), false);
26-
#else
27-
KUNIT_EXPECT_EQ(test, is_signed_type(char), true);
28-
#endif
2925
KUNIT_EXPECT_EQ(test, is_signed_type(int), true);
3026
KUNIT_EXPECT_EQ(test, is_signed_type(unsigned int), false);
3127
KUNIT_EXPECT_EQ(test, is_signed_type(long), true);

lib/test_printf.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -179,18 +179,6 @@ test_number(void)
179179
* behaviour.
180180
*/
181181
test("00|0|0|0|0", "%.2d|%.1d|%.0d|%.*d|%1.0d", 0, 0, 0, 0, 0, 0);
182-
#ifndef __CHAR_UNSIGNED__
183-
{
184-
/*
185-
* Passing a 'char' to a %02x specifier doesn't do
186-
* what was presumably the intention when char is
187-
* signed and the value is negative. One must either &
188-
* with 0xff or cast to u8.
189-
*/
190-
char val = -16;
191-
test("0xfffffff0|0xf0|0xf0", "%#02x|%#02x|%#02x", val, val & 0xff, (u8)val);
192-
}
193-
#endif
194182
}
195183

196184
static void __init

0 commit comments

Comments
 (0)