diff mbox series

kbuild: Enable -Wincompatible-function-pointer-types-strict in W=1

Message ID 20231002-enable-wincompatible-function-pointer-types-strict-w-1-v1-1-808ab955d42d@kernel.org (mailing list archive)
State New, archived
Headers show
Series kbuild: Enable -Wincompatible-function-pointer-types-strict in W=1 | expand

Commit Message

Nathan Chancellor Oct. 2, 2023, 10:19 p.m. UTC
-Wincompatible-function-pointer-types-strict aims to catch clang kernel
Control Flow Integrity (kCFI) violations at build time (rather than run
time) by validating function pointer assignments against the expected
prototype, similar to the existing -Wincompatible-function-pointer-types
that is considered a hard error in the kernel. The -strict variant
requires the types to match exactly, as opposed to just matching in
terms of ABI compatibility. This is primarily visible with int/unsigned
int in lieu of enum types or vice versa.

The tree is not completely clean, so this warning cannot currently be
enabled unconditionally. However, there are only warnings in one
subsystem ('drivers/counter'), so it is really close. In order to
benefit from CI infrastructure that tests with W=1, enable this warning
at that level, so that new instances have a chance of being caught and
fixed during development.

This should eventually be a hard error in a similar manner as
Wincompatible-function-pointer-types but some subsystems test
with W=1 + CONFIG_WERROR=n, so it would be rude to break their builds
when they do not care about warnings outside of their subsystem.

Link: https://github.com/ClangBuiltLinux/linux/issues/1750
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
 scripts/Makefile.extrawarn | 1 +
 1 file changed, 1 insertion(+)


---
base-commit: ce9ecca0238b140b88f43859b211c9fdfd8e5b70
change-id: 20231002-enable-wincompatible-function-pointer-types-strict-w-1-4a56b99b8c6f

Best regards,

Comments

kernel test robot Oct. 3, 2023, 5:53 a.m. UTC | #1
Hi Nathan,

kernel test robot noticed the following build warnings:

[auto build test WARNING on ce9ecca0238b140b88f43859b211c9fdfd8e5b70]

url:    https://github.com/intel-lab-lkp/linux/commits/Nathan-Chancellor/kbuild-Enable-Wincompatible-function-pointer-types-strict-in-W-1/20231003-062107
base:   ce9ecca0238b140b88f43859b211c9fdfd8e5b70
patch link:    https://lore.kernel.org/r/20231002-enable-wincompatible-function-pointer-types-strict-w-1-v1-1-808ab955d42d%40kernel.org
patch subject: [PATCH] kbuild: Enable -Wincompatible-function-pointer-types-strict in W=1
config: um-allnoconfig (https://download.01.org/0day-ci/archive/20231003/202310031340.v1vPh207-lkp@intel.com/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231003/202310031340.v1vPh207-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202310031340.v1vPh207-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from arch/um/drivers/net_kern.c:9:
   In file included from include/linux/memblock.h:13:
   In file included from arch/um/include/asm/dma.h:5:
   In file included from arch/um/include/asm/io.h:24:
   include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     547 |         val = __raw_readb(PCI_IOBASE + addr);
         |                           ~~~~~~~~~~ ^
   include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     560 |         val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
         |                                                         ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu'
      37 | #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
         |                                                   ^
   In file included from arch/um/drivers/net_kern.c:9:
   In file included from include/linux/memblock.h:13:
   In file included from arch/um/include/asm/dma.h:5:
   In file included from arch/um/include/asm/io.h:24:
   include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     573 |         val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
         |                                                         ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu'
      35 | #define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
         |                                                   ^
   In file included from arch/um/drivers/net_kern.c:9:
   In file included from include/linux/memblock.h:13:
   In file included from arch/um/include/asm/dma.h:5:
   In file included from arch/um/include/asm/io.h:24:
   include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     584 |         __raw_writeb(value, PCI_IOBASE + addr);
         |                             ~~~~~~~~~~ ^
   include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     594 |         __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
         |                                                       ~~~~~~~~~~ ^
   include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     604 |         __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
         |                                                       ~~~~~~~~~~ ^
   include/asm-generic/io.h:692:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     692 |         readsb(PCI_IOBASE + addr, buffer, count);
         |                ~~~~~~~~~~ ^
   include/asm-generic/io.h:700:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     700 |         readsw(PCI_IOBASE + addr, buffer, count);
         |                ~~~~~~~~~~ ^
   include/asm-generic/io.h:708:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     708 |         readsl(PCI_IOBASE + addr, buffer, count);
         |                ~~~~~~~~~~ ^
   include/asm-generic/io.h:717:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     717 |         writesb(PCI_IOBASE + addr, buffer, count);
         |                 ~~~~~~~~~~ ^
   include/asm-generic/io.h:726:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     726 |         writesw(PCI_IOBASE + addr, buffer, count);
         |                 ~~~~~~~~~~ ^
   include/asm-generic/io.h:735:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     735 |         writesl(PCI_IOBASE + addr, buffer, count);
         |                 ~~~~~~~~~~ ^
>> arch/um/drivers/net_kern.c:353:21: warning: incompatible function pointer types initializing 'netdev_tx_t (*)(struct sk_buff *, struct net_device *)' (aka 'enum netdev_tx (*)(struct sk_buff *, struct net_device *)') with an expression of type 'int (struct sk_buff *, struct net_device *)' [-Wincompatible-function-pointer-types-strict]
     353 |         .ndo_start_xmit         = uml_net_start_xmit,
         |                                   ^~~~~~~~~~~~~~~~~~
   13 warnings generated.


vim +353 arch/um/drivers/net_kern.c

2e3f5251ac7168 Jeff Dike          2007-05-06  349  
8bb95b39a16ed5 Stephen Hemminger  2009-03-26  350  static const struct net_device_ops uml_netdev_ops = {
8bb95b39a16ed5 Stephen Hemminger  2009-03-26  351  	.ndo_open 		= uml_net_open,
8bb95b39a16ed5 Stephen Hemminger  2009-03-26  352  	.ndo_stop 		= uml_net_close,
8bb95b39a16ed5 Stephen Hemminger  2009-03-26 @353  	.ndo_start_xmit 	= uml_net_start_xmit,
afc4b13df14312 Jiri Pirko         2011-08-16  354  	.ndo_set_rx_mode	= uml_net_set_multicast_list,
8bb95b39a16ed5 Stephen Hemminger  2009-03-26  355  	.ndo_tx_timeout 	= uml_net_tx_timeout,
9337057d433505 Boaz Harrosh       2010-09-29  356  	.ndo_set_mac_address	= eth_mac_addr,
8bb95b39a16ed5 Stephen Hemminger  2009-03-26  357  	.ndo_validate_addr	= eth_validate_addr,
dd71dc4c335a89 Richard Weinberger 2011-07-25  358  #ifdef CONFIG_NET_POLL_CONTROLLER
dd71dc4c335a89 Richard Weinberger 2011-07-25  359  	.ndo_poll_controller = uml_net_poll_controller,
dd71dc4c335a89 Richard Weinberger 2011-07-25  360  #endif
8bb95b39a16ed5 Stephen Hemminger  2009-03-26  361  };
8bb95b39a16ed5 Stephen Hemminger  2009-03-26  362
Nathan Chancellor Oct. 3, 2023, 6:38 p.m. UTC | #2
On Tue, Oct 03, 2023 at 01:53:34PM +0800, kernel test robot wrote:
> Hi Nathan,
> 
> kernel test robot noticed the following build warnings:
> 
> [auto build test WARNING on ce9ecca0238b140b88f43859b211c9fdfd8e5b70]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Nathan-Chancellor/kbuild-Enable-Wincompatible-function-pointer-types-strict-in-W-1/20231003-062107
> base:   ce9ecca0238b140b88f43859b211c9fdfd8e5b70
> patch link:    https://lore.kernel.org/r/20231002-enable-wincompatible-function-pointer-types-strict-w-1-v1-1-808ab955d42d%40kernel.org
> patch subject: [PATCH] kbuild: Enable -Wincompatible-function-pointer-types-strict in W=1
> config: um-allnoconfig (https://download.01.org/0day-ci/archive/20231003/202310031340.v1vPh207-lkp@intel.com/config)
> compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231003/202310031340.v1vPh207-lkp@intel.com/reproduce)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202310031340.v1vPh207-lkp@intel.com/
> 
> All warnings (new ones prefixed by >>):

...

> >> arch/um/drivers/net_kern.c:353:21: warning: incompatible function pointer types initializing 'netdev_tx_t (*)(struct sk_buff *, struct net_device *)' (aka 'enum netdev_tx (*)(struct sk_buff *, struct net_device *)') with an expression of type 'int (struct sk_buff *, struct net_device *)' [-Wincompatible-function-pointer-types-strict]
>      353 |         .ndo_start_xmit         = uml_net_start_xmit,
>          |                                   ^~~~~~~~~~~~~~~~~~
>    13 warnings generated.

I have sent a patch to resolve this, thanks for the report!

https://lore.kernel.org/20231003-um-net-wifpts-v1-1-02888c634ee7@kernel.org/

Cheers,
Nathan
Nick Desaulniers Oct. 5, 2023, 6:38 p.m. UTC | #3
On Mon, Oct 2, 2023 at 3:20 PM Nathan Chancellor <nathan@kernel.org> wrote:
>
> -Wincompatible-function-pointer-types-strict aims to catch clang kernel
> Control Flow Integrity (kCFI) violations at build time (rather than run
> time) by validating function pointer assignments against the expected
> prototype, similar to the existing -Wincompatible-function-pointer-types
> that is considered a hard error in the kernel. The -strict variant
> requires the types to match exactly, as opposed to just matching in
> terms of ABI compatibility. This is primarily visible with int/unsigned
> int in lieu of enum types or vice versa.
>
> The tree is not completely clean, so this warning cannot currently be
> enabled unconditionally. However, there are only warnings in one
> subsystem ('drivers/counter'), so it is really close. In order to
> benefit from CI infrastructure that tests with W=1, enable this warning
> at that level, so that new instances have a chance of being caught and
> fixed during development.
>
> This should eventually be a hard error in a similar manner as
> Wincompatible-function-pointer-types but some subsystems test
> with W=1 + CONFIG_WERROR=n, so it would be rude to break their builds
> when they do not care about warnings outside of their subsystem.
>
> Link: https://github.com/ClangBuiltLinux/linux/issues/1750
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>

Sounds like we're pretty close to just enabling this by default.
Getting it on in W=1 for a cycle will help prevent any backslide.
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

> ---
>  scripts/Makefile.extrawarn | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
> index 2fe6f2828d37..9662f7fd6e39 100644
> --- a/scripts/Makefile.extrawarn
> +++ b/scripts/Makefile.extrawarn
> @@ -108,6 +108,7 @@ KBUILD_CFLAGS += $(call cc-option, -Wformat-overflow)
>  KBUILD_CFLAGS += $(call cc-option, -Wformat-truncation)
>  KBUILD_CFLAGS += $(call cc-option, -Wstringop-overflow)
>  KBUILD_CFLAGS += $(call cc-option, -Wstringop-truncation)
> +KBUILD_CFLAGS += $(call cc-option, -Wincompatible-function-pointer-types-strict)
>
>  KBUILD_CPPFLAGS += -Wundef
>  KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN1
>
> ---
> base-commit: ce9ecca0238b140b88f43859b211c9fdfd8e5b70
> change-id: 20231002-enable-wincompatible-function-pointer-types-strict-w-1-4a56b99b8c6f
>
> Best regards,
> --
> Nathan Chancellor <nathan@kernel.org>
>
diff mbox series

Patch

diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
index 2fe6f2828d37..9662f7fd6e39 100644
--- a/scripts/Makefile.extrawarn
+++ b/scripts/Makefile.extrawarn
@@ -108,6 +108,7 @@  KBUILD_CFLAGS += $(call cc-option, -Wformat-overflow)
 KBUILD_CFLAGS += $(call cc-option, -Wformat-truncation)
 KBUILD_CFLAGS += $(call cc-option, -Wstringop-overflow)
 KBUILD_CFLAGS += $(call cc-option, -Wstringop-truncation)
+KBUILD_CFLAGS += $(call cc-option, -Wincompatible-function-pointer-types-strict)
 
 KBUILD_CPPFLAGS += -Wundef
 KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN1