Re: drivers/hwmon/pmbus/ibm-cffps.c:184:60: warning: '%04X' directive output may be truncated writing between 4 and 8 bytes into a region of size 5

From: Guenter Roeck
Date: Fri Dec 20 2024 - 13:27:52 EST


On 12/20/24 09:29, David Laight wrote:
On Fri, 20 Dec 2024 09:03:51 -0800
Guenter Roeck <linux@xxxxxxxxxxxx> wrote:

On 12/20/24 08:30, David Laight wrote:
...
drivers/hwmon/pmbus/ibm-cffps.c:171:60: warning: '%02X' directive output may be truncated writing between 2 and 8 bytes into a region of size 3 [-Wformat-truncation=]
171 | snprintf(&data[i * 2], 3, "%02X", rc);

The only ways I know are to bound check the value or to use
OPTIMISER_HIDE_VAR() on the length.

Actually, that doesn't work.

- snprintf(&data[i * 2], 3, "%02X", rc);
+ snprintf(&data[i * 2], OPTIMIZER_HIDE_VAR(3), "%02X", rc);

triggers:

drivers/hwmon/pmbus/ibm-cffps.c: In function ‘ibm_cffps_debugfs_read’:
./include/linux/compiler.h:186:9: error: expected expression before ‘__asm__’


- snprintf(&data[i * 2], 3, "%02X", rc);
+ snprintf(&data[i * 2], 3, "%02X", rc & 0xff);

works as well, at least with gcc 11 and 12, but I really dislike that kind of nonsense.

Ditto.
Using the result in some ways can also remove the warning.
But you have to try quite hard, a simple (void) really ought to be
enough to show you 'just don't care' but even 'if (snprintf(...)) {}'
isn't enough (it does silence 'warn-unused-result').

I mean, the whole point of snprintf() is that it truncates.


Using scnprintf() "fixes" the problem as well, but there are other patches
suggesting that snprintf() should be used if the return value is not
needed/checked because it is slightly simpler.

Guenter