kbuild: Enable -Wincompatible-function-pointer-types-strict in W=1
Nathan Chancellor
maintainerPATCH 1/1 kbuild: Enable -Wincompatible-function-pointer-types-strict in W=1
-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.
--- scripts/Makefile.extrawarn | 1 + 1 file changed, 1 insertion(+)
scripts/Makefile.extrawarn +1 -0
@@ -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,
Signature · 1 line
Nathan Chancellor <[email protected]>
kernel test robot
build botkernel test robot noticed the following build warnings:
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/[email protected]/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/[email protected]/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 <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
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 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Nathan Chancellor
maintainerQuoted 20 lines · kernel test robot
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/[email protected]/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/[email protected]/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 <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/All warnings (new ones prefixed by >>):
...
Quoted 4 lines
Quoted 1 line
Quoted 1 line
arch/um/drivers/net_kern.c:353:21: warning: incompatible function pointer types initializing 'netdev_tx_t(*)(structsk_buff*, structnet_device*)' (aka 'enumnetdev_tx(*)(structsk_buff*, structnet_device*)') with an expression of type 'int (structsk_buff*, structnet_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/[email protected]/
Cheers,
Nathan
Quoted 17 lines · Nathan Chancellor
-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.
Quoted 7 lines
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.
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.
Quoted 25 lines
--- scripts/Makefile.extrawarn | 1 + 1 file changed, 1 insertion(+)scripts/Makefile.extrawarn +1
-1@@ -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-4a56b99b8c6fBest regards,
--
Nathan Chancellor <[email protected]>
Signature · 2 lines
Thanks, ~Nick Desaulniers