All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nathan Chancellor <nathan@kernel.org>
To: Justin Stitt <justinstitt@google.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Nick Desaulniers <ndesaulniers@google.com>,
	Tom Rix <trix@redhat.com>,
	linux-kernel@vger.kernel.org, llvm@lists.linux.dev
Subject: Re: [PATCH] eeprom: idt_89hpesx: fix clang -Wformat warnings
Date: Thu, 7 Jul 2022 11:03:49 -0700	[thread overview]
Message-ID: <YscgBZuT5/GVLdIs@dev-arch.thelio-3990X> (raw)
In-Reply-To: <20220701232031.2639134-1-justinstitt@google.com>

On Fri, Jul 01, 2022 at 04:20:31PM -0700, Justin Stitt wrote:
> see warnings:
> | drivers/misc/eeprom/idt_89hpesx.c:570:5: error: format specifies type
> | 'unsigned char' but the argument has type 'u16' (aka 'unsigned short')
> | [-Werror,-Wformat] memaddr);
> -
> | drivers/misc/eeprom/idt_89hpesx.c:579:5: error: format specifies type
> | 'unsigned char' but the argument has type 'u16' (aka 'unsigned short')
> | [-Werror,-Wformat] memaddr);
> -
> | drivers/misc/eeprom/idt_89hpesx.c:814:4: error: format specifies type
> | 'unsigned short' but the argument has type 'unsigned int'
> | [-Werror,-Wformat] CSR_REAL_ADDR(csraddr));
> 
> There's an ongoing movement to eventually enable the -Wformat flag for
> clang. See: https://github.com/ClangBuiltLinux/linux/issues/378
> 
> The format specifier for idt_89hpesx.c:570 and 579 was `0x%02hhx`. The
> part we care about `%hhx` describes a single byte format, wherein the
> leftmost byte of our u16 type (of which memaddr is) is truncated.
> 
> example:
> ```
> uint16_t x = 0xbabe;
> printf("%hhx\n", x);
> // output is: be
> // we lost 'ba'
> ```
> 
> There exists a similar issue at idt_89hpesx.c:814 which involves the
> CSR_REAL_ADDR macro. This macro returns a u16 but due to default
> argument promotion for variadic functions (printf-like) actually
> provides an int to the dev_err method.
> 
> My proposed solution is to expand the width of the format specifier to
> fully encompass the provided argument (which is promoted to an int, see
> below). I opted for '%x' as this specifies an unsigned hexadecimal
> integer which, with a guarantee, can represent all the values of a u16.

Additionally, this solution is in line with printk-formats.rst after
commit cbacb5ab0aa0 ("docs: printk-formats: Stop encouraging use of
unnecessary %h[xudi] and %hh[xudi]").

> As per C11 6.3.1.1:
> (https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf)
> `If an int can represent all values of the original type ..., the
> value is converted to an int; otherwise, it is converted to an
> unsigned int. These are called the integer promotions.`
> 
> Link: https://github.com/ClangBuiltLinux/linux/issues/378
> Signed-off-by: Justin Stitt <justinstitt@google.com>

Reviewed-by: Nathan Chancellor <nathan@kernel.org>

> ---
>  drivers/misc/eeprom/idt_89hpesx.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/misc/eeprom/idt_89hpesx.c b/drivers/misc/eeprom/idt_89hpesx.c
> index b0cff4b152da..42eac114edd7 100644
> --- a/drivers/misc/eeprom/idt_89hpesx.c
> +++ b/drivers/misc/eeprom/idt_89hpesx.c
> @@ -566,7 +566,7 @@ static int idt_eeprom_read_byte(struct idt_89hpesx_dev *pdev, u16 memaddr,
>  		eeseq.memaddr = cpu_to_le16(memaddr);
>  		ret = pdev->smb_write(pdev, &smbseq);
>  		if (ret != 0) {
> -			dev_err(dev, "Failed to init eeprom addr 0x%02hhx",
> +			dev_err(dev, "Failed to init eeprom addr 0x%02x",
>  				memaddr);
>  			break;
>  		}
> @@ -575,7 +575,7 @@ static int idt_eeprom_read_byte(struct idt_89hpesx_dev *pdev, u16 memaddr,
>  		smbseq.bytecnt = EEPROM_RD_CNT;
>  		ret = pdev->smb_read(pdev, &smbseq);
>  		if (ret != 0) {
> -			dev_err(dev, "Failed to read eeprom data 0x%02hhx",
> +			dev_err(dev, "Failed to read eeprom data 0x%02x",
>  				memaddr);
>  			break;
>  		}
> @@ -810,7 +810,7 @@ static int idt_csr_read(struct idt_89hpesx_dev *pdev, u16 csraddr, u32 *data)
>  	smbseq.bytecnt = CSR_RD_CNT;
>  	ret = pdev->smb_read(pdev, &smbseq);
>  	if (ret != 0) {
> -		dev_err(dev, "Failed to read csr 0x%04hx",
> +		dev_err(dev, "Failed to read csr 0x%04x",
>  			CSR_REAL_ADDR(csraddr));
>  		goto err_mutex_unlock;
>  	}
> -- 
> 2.37.0.rc0.161.g10f37bed90-goog
> 

      reply	other threads:[~2022-07-07 18:03 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-01 23:20 [PATCH] eeprom: idt_89hpesx: fix clang -Wformat warnings Justin Stitt
2022-07-07 18:03 ` Nathan Chancellor [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YscgBZuT5/GVLdIs@dev-arch.thelio-3990X \
    --to=nathan@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=justinstitt@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=llvm@lists.linux.dev \
    --cc=ndesaulniers@google.com \
    --cc=trix@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.