From: Heiko Carstens > Sent: 28 August 2023 16:32 > > Building dasd_eckd.o with latest clang reveals this bug: > > CC drivers/s390/block/dasd_eckd.o > drivers/s390/block/dasd_eckd.c:1082:3: warning: 'snprintf' will always be truncated; > specified size is 1, but format string expands to at least 11 [-Wfortify-source] > 1082 | snprintf(print_uid, sizeof(*print_uid), > | ^ > drivers/s390/block/dasd_eckd.c:1087:3: warning: 'snprintf' will always be truncated; > specified size is 1, but format string expands to at least 10 [-Wfortify-source] > 1087 | snprintf(print_uid, sizeof(*print_uid), > | ^ > > Fix this by moving and using the existing UID_STRLEN for the arrays > that are being written to. Also rename UID_STRLEN to DASD_UID_STRLEN > to clarify its scope. If you embed that char[] in a struct and pass the address of the struct then sizeof will return the correct value and you get the size checked properly. ... > if (strlen(uid.vduit) > 0) Does the compiler know enough to optimise that brain-dead test? > - snprintf(print_uid, sizeof(*print_uid), > + snprintf(print_uid, DASD_UID_STRLEN, > "%s.%s.%04x.%02x.%s", > uid.vendor, uid.serial, uid.ssid, > uid.real_unit_addr, uid.vduit); > else > - snprintf(print_uid, sizeof(*print_uid), > + snprintf(print_uid, DASD_UID_STRLEN, > "%s.%s.%04x.%02x", > uid.vendor, uid.serial, uid.ssid, > uid.real_unit_addr); or: snprintf(print_uid, DASD_UID_STRLEN, "%s.%s.%04x.%02x%s%s", uid.vendor, uid.serial, uid.ssid, uid.real_unit_addr, uid.vduit[0] ? "." : "", uid.vduit); David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)