lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202512090407.VxRO6xAS-lkp@intel.com>
Date: Tue, 9 Dec 2025 04:04:34 +0800
From: kernel test robot <lkp@...el.com>
To: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
Cc: llvm@...ts.linux.dev, oe-kbuild-all@...ts.linux.dev,
	linux-kernel@...r.kernel.org, Petr Mladek <pmladek@...e.com>,
	Kees Cook <kees@...nel.org>
Subject: kernel/sched/ext.c:6942:27: warning: diagnostic behavior may be
 improved by adding the 'format(printf, 4, 0)' attribute to the declaration
 of '__bstr_format'

Hi Andy,

First bad commit (maybe != root cause):

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   c2f2b01b74be8b40a2173372bcd770723f87e7b2
commit: 7bf819aa992faee980610e9021aec0c38aac53be vsnprintf: Mark binary printing functions with __printf() attribute
date:   9 months ago
config: sparc64-randconfig-001-20251209 (https://download.01.org/0day-ci/archive/20251209/202512090407.VxRO6xAS-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 6ec8c4351cfc1d0627d1633b02ea787bd29c77d8)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251209/202512090407.VxRO6xAS-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@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512090407.VxRO6xAS-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from kernel/sched/build_policy.c:63:
   kernel/sched/ext.c:1809:9: warning: default initialization of an object of type 'typeof (b->scx.dsq_vtime)' (aka 'const unsigned long long') leaves the object uninitialized [-Wdefault-const-init-var-unsafe]
    1809 |         return time_before64(a->scx.dsq_vtime, b->scx.dsq_vtime);
         |                ^
   include/linux/jiffies.h:212:28: note: expanded from macro 'time_before64'
     212 | #define time_before64(a,b)      time_after64(b,a)
         |                                 ^
   include/linux/jiffies.h:199:3: note: expanded from macro 'time_after64'
     199 |         (typecheck(__u64, a) && \
         |          ^
   include/linux/typecheck.h:11:12: note: expanded from macro 'typecheck'
      11 |         typeof(x) __dummy2; \
         |                   ^
   In file included from kernel/sched/build_policy.c:63:
   kernel/sched/ext.c:1809:9: warning: default initialization of an object of type 'typeof (a->scx.dsq_vtime)' (aka 'const unsigned long long') leaves the object uninitialized [-Wdefault-const-init-var-unsafe]
   include/linux/jiffies.h:212:28: note: expanded from macro 'time_before64'
     212 | #define time_before64(a,b)      time_after64(b,a)
         |                                 ^
   include/linux/jiffies.h:200:3: note: expanded from macro 'time_after64'
     200 |          typecheck(__u64, b) && \
         |          ^
   include/linux/typecheck.h:11:12: note: expanded from macro 'typecheck'
      11 |         typeof(x) __dummy2; \
         |                   ^
   In file included from kernel/sched/build_policy.c:63:
>> kernel/sched/ext.c:6942:27: warning: diagnostic behavior may be improved by adding the 'format(printf, 4, 0)' attribute to the declaration of '__bstr_format' [-Wmissing-format-attribute]
    6915 |                           bprintf_data.bin_args);
         |                                                ^
   kernel/sched/ext.c:6915:12: note: '__bstr_format' declared here
    6915 | static s32 __bstr_format(u64 *data_buf, char *line_buf, size_t line_size,
         |            ^
>> kernel/sched/ext.c:6957:28: warning: diagnostic behavior may be improved by adding the 'format(printf, 2, 0)' attribute to the declaration of 'bstr_format' [-Wmissing-format-attribute]
    6953 | static s32 bstr_format(struct scx_bstr_buf *buf,
         | __attribute__((format(printf, 2, 0))) 
    6954 |                        char *fmt, unsigned long long *data, u32 data__sz)
    6955 | {
    6956 |         return __bstr_format(buf->data, buf->line, sizeof(buf->line),
    6957 |                              fmt, data, data__sz);
         |                                                 ^
   kernel/sched/ext.c:6953:12: note: 'bstr_format' declared here
    6953 | static s32 bstr_format(struct scx_bstr_buf *buf,
         |            ^
>> kernel/sched/ext.c:6978:57: warning: diagnostic behavior may be improved by adding the 'format(printf, 2, 0)' attribute to the declaration of 'scx_bpf_exit_bstr' [-Wmissing-format-attribute]
    6972 | __bpf_kfunc void scx_bpf_exit_bstr(s64 exit_code, char *fmt,
         | __attribute__((format(printf, 2, 0))) 
    6973 |                                    unsigned long long *data, u32 data__sz)
    6974 | {
    6975 |         unsigned long flags;
    6976 | 
    6977 |         raw_spin_lock_irqsave(&scx_exit_bstr_buf_lock, flags);
    6978 |         if (bstr_format(&scx_exit_bstr_buf, fmt, data, data__sz) >= 0)
         |                                                                ^
   kernel/sched/ext.c:6972:18: note: 'scx_bpf_exit_bstr' declared here
    6972 | __bpf_kfunc void scx_bpf_exit_bstr(s64 exit_code, char *fmt,
         |                  ^
>> kernel/sched/ext.c:6999:57: warning: diagnostic behavior may be improved by adding the 'format(printf, 1, 0)' attribute to the declaration of 'scx_bpf_error_bstr' [-Wmissing-format-attribute]
    6993 | __bpf_kfunc void scx_bpf_error_bstr(char *fmt, unsigned long long *data,
         | __attribute__((format(printf, 1, 0))) 
    6994 |                                     u32 data__sz)
    6995 | {
    6996 |         unsigned long flags;
    6997 | 
    6998 |         raw_spin_lock_irqsave(&scx_exit_bstr_buf_lock, flags);
    6999 |         if (bstr_format(&scx_exit_bstr_buf, fmt, data, data__sz) >= 0)
         |                                                                ^
   kernel/sched/ext.c:6993:18: note: 'scx_bpf_error_bstr' declared here
    6993 | __bpf_kfunc void scx_bpf_error_bstr(char *fmt, unsigned long long *data,
         |                  ^
>> kernel/sched/ext.c:7031:59: warning: diagnostic behavior may be improved by adding the 'format(printf, 1, 0)' attribute to the declaration of 'scx_bpf_dump_bstr' [-Wmissing-format-attribute]
    7017 | __bpf_kfunc void scx_bpf_dump_bstr(char *fmt, unsigned long long *data,
         | __attribute__((format(printf, 1, 0))) 
    7018 |                                    u32 data__sz)
    7019 | {
    7020 |         struct scx_dump_data *dd = &scx_dump_data;
    7021 |         struct scx_bstr_buf *buf = &dd->buf;
    7022 |         s32 ret;
    7023 | 
    7024 |         if (raw_smp_processor_id() != dd->cpu) {
    7025 |                 scx_ops_error("scx_bpf_dump() must only be called from ops.dump() and friends");
    7026 |                 return;
    7027 |         }
    7028 | 
    7029 |         /* append the formatted string to the line buf */
    7030 |         ret = __bstr_format(buf->data, buf->line + dd->cursor,
    7031 |                             sizeof(buf->line) - dd->cursor, fmt, data, data__sz);
         |                                                                                ^
   kernel/sched/ext.c:7017:18: note: 'scx_bpf_dump_bstr' declared here
    7017 | __bpf_kfunc void scx_bpf_dump_bstr(char *fmt, unsigned long long *data,
         |                  ^
   7 warnings generated.


vim +6942 kernel/sched/ext.c

f0e1a0643a59bf Tejun Heo    2024-06-18  6914  
f0e1a0643a59bf Tejun Heo    2024-06-18  6915  static s32 __bstr_format(u64 *data_buf, char *line_buf, size_t line_size,
f0e1a0643a59bf Tejun Heo    2024-06-18  6916  			 char *fmt, unsigned long long *data, u32 data__sz)
f0e1a0643a59bf Tejun Heo    2024-06-18  6917  {
f0e1a0643a59bf Tejun Heo    2024-06-18  6918  	struct bpf_bprintf_data bprintf_data = { .get_bin_args = true };
f0e1a0643a59bf Tejun Heo    2024-06-18  6919  	s32 ret;
f0e1a0643a59bf Tejun Heo    2024-06-18  6920  
f0e1a0643a59bf Tejun Heo    2024-06-18  6921  	if (data__sz % 8 || data__sz > MAX_BPRINTF_VARARGS * 8 ||
f0e1a0643a59bf Tejun Heo    2024-06-18  6922  	    (data__sz && !data)) {
f0e1a0643a59bf Tejun Heo    2024-06-18  6923  		scx_ops_error("invalid data=%p and data__sz=%u",
f0e1a0643a59bf Tejun Heo    2024-06-18  6924  			      (void *)data, data__sz);
f0e1a0643a59bf Tejun Heo    2024-06-18  6925  		return -EINVAL;
f0e1a0643a59bf Tejun Heo    2024-06-18  6926  	}
f0e1a0643a59bf Tejun Heo    2024-06-18  6927  
f0e1a0643a59bf Tejun Heo    2024-06-18  6928  	ret = copy_from_kernel_nofault(data_buf, data, data__sz);
f0e1a0643a59bf Tejun Heo    2024-06-18  6929  	if (ret < 0) {
f0e1a0643a59bf Tejun Heo    2024-06-18  6930  		scx_ops_error("failed to read data fields (%d)", ret);
f0e1a0643a59bf Tejun Heo    2024-06-18  6931  		return ret;
f0e1a0643a59bf Tejun Heo    2024-06-18  6932  	}
f0e1a0643a59bf Tejun Heo    2024-06-18  6933  
f0e1a0643a59bf Tejun Heo    2024-06-18  6934  	ret = bpf_bprintf_prepare(fmt, UINT_MAX, data_buf, data__sz / 8,
f0e1a0643a59bf Tejun Heo    2024-06-18  6935  				  &bprintf_data);
f0e1a0643a59bf Tejun Heo    2024-06-18  6936  	if (ret < 0) {
f0e1a0643a59bf Tejun Heo    2024-06-18  6937  		scx_ops_error("format preparation failed (%d)", ret);
f0e1a0643a59bf Tejun Heo    2024-06-18  6938  		return ret;
f0e1a0643a59bf Tejun Heo    2024-06-18  6939  	}
f0e1a0643a59bf Tejun Heo    2024-06-18  6940  
f0e1a0643a59bf Tejun Heo    2024-06-18  6941  	ret = bstr_printf(line_buf, line_size, fmt,
f0e1a0643a59bf Tejun Heo    2024-06-18 @6942  			  bprintf_data.bin_args);
f0e1a0643a59bf Tejun Heo    2024-06-18  6943  	bpf_bprintf_cleanup(&bprintf_data);
f0e1a0643a59bf Tejun Heo    2024-06-18  6944  	if (ret < 0) {
f0e1a0643a59bf Tejun Heo    2024-06-18  6945  		scx_ops_error("(\"%s\", %p, %u) failed to format",
f0e1a0643a59bf Tejun Heo    2024-06-18  6946  			      fmt, data, data__sz);
f0e1a0643a59bf Tejun Heo    2024-06-18  6947  		return ret;
f0e1a0643a59bf Tejun Heo    2024-06-18  6948  	}
f0e1a0643a59bf Tejun Heo    2024-06-18  6949  
f0e1a0643a59bf Tejun Heo    2024-06-18  6950  	return ret;
f0e1a0643a59bf Tejun Heo    2024-06-18  6951  }
f0e1a0643a59bf Tejun Heo    2024-06-18  6952  
f0e1a0643a59bf Tejun Heo    2024-06-18 @6953  static s32 bstr_format(struct scx_bstr_buf *buf,
f0e1a0643a59bf Tejun Heo    2024-06-18  6954  		       char *fmt, unsigned long long *data, u32 data__sz)
f0e1a0643a59bf Tejun Heo    2024-06-18  6955  {
f0e1a0643a59bf Tejun Heo    2024-06-18  6956  	return __bstr_format(buf->data, buf->line, sizeof(buf->line),
f0e1a0643a59bf Tejun Heo    2024-06-18 @6957  			     fmt, data, data__sz);
f0e1a0643a59bf Tejun Heo    2024-06-18  6958  }
f0e1a0643a59bf Tejun Heo    2024-06-18  6959  
f0e1a0643a59bf Tejun Heo    2024-06-18  6960  __bpf_kfunc_start_defs();
f0e1a0643a59bf Tejun Heo    2024-06-18  6961  
f0e1a0643a59bf Tejun Heo    2024-06-18  6962  /**
f0e1a0643a59bf Tejun Heo    2024-06-18  6963   * scx_bpf_exit_bstr - Gracefully exit the BPF scheduler.
f0e1a0643a59bf Tejun Heo    2024-06-18  6964   * @exit_code: Exit value to pass to user space via struct scx_exit_info.
f0e1a0643a59bf Tejun Heo    2024-06-18  6965   * @fmt: error message format string
f0e1a0643a59bf Tejun Heo    2024-06-18  6966   * @data: format string parameters packaged using ___bpf_fill() macro
f0e1a0643a59bf Tejun Heo    2024-06-18  6967   * @data__sz: @data len, must end in '__sz' for the verifier
f0e1a0643a59bf Tejun Heo    2024-06-18  6968   *
f0e1a0643a59bf Tejun Heo    2024-06-18  6969   * Indicate that the BPF scheduler wants to exit gracefully, and initiate ops
f0e1a0643a59bf Tejun Heo    2024-06-18  6970   * disabling.
f0e1a0643a59bf Tejun Heo    2024-06-18  6971   */
f0e1a0643a59bf Tejun Heo    2024-06-18 @6972  __bpf_kfunc void scx_bpf_exit_bstr(s64 exit_code, char *fmt,
f0e1a0643a59bf Tejun Heo    2024-06-18  6973  				   unsigned long long *data, u32 data__sz)
f0e1a0643a59bf Tejun Heo    2024-06-18  6974  {
f0e1a0643a59bf Tejun Heo    2024-06-18  6975  	unsigned long flags;
f0e1a0643a59bf Tejun Heo    2024-06-18  6976  
f0e1a0643a59bf Tejun Heo    2024-06-18  6977  	raw_spin_lock_irqsave(&scx_exit_bstr_buf_lock, flags);
f0e1a0643a59bf Tejun Heo    2024-06-18 @6978  	if (bstr_format(&scx_exit_bstr_buf, fmt, data, data__sz) >= 0)
f0e1a0643a59bf Tejun Heo    2024-06-18  6979  		scx_ops_exit_kind(SCX_EXIT_UNREG_BPF, exit_code, "%s",
f0e1a0643a59bf Tejun Heo    2024-06-18  6980  				  scx_exit_bstr_buf.line);
f0e1a0643a59bf Tejun Heo    2024-06-18  6981  	raw_spin_unlock_irqrestore(&scx_exit_bstr_buf_lock, flags);
f0e1a0643a59bf Tejun Heo    2024-06-18  6982  }
f0e1a0643a59bf Tejun Heo    2024-06-18  6983  
f0e1a0643a59bf Tejun Heo    2024-06-18  6984  /**
f0e1a0643a59bf Tejun Heo    2024-06-18  6985   * scx_bpf_error_bstr - Indicate fatal error
f0e1a0643a59bf Tejun Heo    2024-06-18  6986   * @fmt: error message format string
f0e1a0643a59bf Tejun Heo    2024-06-18  6987   * @data: format string parameters packaged using ___bpf_fill() macro
f0e1a0643a59bf Tejun Heo    2024-06-18  6988   * @data__sz: @data len, must end in '__sz' for the verifier
f0e1a0643a59bf Tejun Heo    2024-06-18  6989   *
f0e1a0643a59bf Tejun Heo    2024-06-18  6990   * Indicate that the BPF scheduler encountered a fatal error and initiate ops
f0e1a0643a59bf Tejun Heo    2024-06-18  6991   * disabling.
f0e1a0643a59bf Tejun Heo    2024-06-18  6992   */
f0e1a0643a59bf Tejun Heo    2024-06-18 @6993  __bpf_kfunc void scx_bpf_error_bstr(char *fmt, unsigned long long *data,
f0e1a0643a59bf Tejun Heo    2024-06-18  6994  				    u32 data__sz)
f0e1a0643a59bf Tejun Heo    2024-06-18  6995  {
f0e1a0643a59bf Tejun Heo    2024-06-18  6996  	unsigned long flags;
f0e1a0643a59bf Tejun Heo    2024-06-18  6997  
f0e1a0643a59bf Tejun Heo    2024-06-18  6998  	raw_spin_lock_irqsave(&scx_exit_bstr_buf_lock, flags);
f0e1a0643a59bf Tejun Heo    2024-06-18 @6999  	if (bstr_format(&scx_exit_bstr_buf, fmt, data, data__sz) >= 0)
f0e1a0643a59bf Tejun Heo    2024-06-18  7000  		scx_ops_exit_kind(SCX_EXIT_ERROR_BPF, 0, "%s",
f0e1a0643a59bf Tejun Heo    2024-06-18  7001  				  scx_exit_bstr_buf.line);
f0e1a0643a59bf Tejun Heo    2024-06-18  7002  	raw_spin_unlock_irqrestore(&scx_exit_bstr_buf_lock, flags);
f0e1a0643a59bf Tejun Heo    2024-06-18  7003  }
f0e1a0643a59bf Tejun Heo    2024-06-18  7004  
07814a9439a3b0 Tejun Heo    2024-06-18  7005  /**
987ce79b5242c0 Randy Dunlap 2025-01-10  7006   * scx_bpf_dump_bstr - Generate extra debug dump specific to the BPF scheduler
07814a9439a3b0 Tejun Heo    2024-06-18  7007   * @fmt: format string
07814a9439a3b0 Tejun Heo    2024-06-18  7008   * @data: format string parameters packaged using ___bpf_fill() macro
07814a9439a3b0 Tejun Heo    2024-06-18  7009   * @data__sz: @data len, must end in '__sz' for the verifier
07814a9439a3b0 Tejun Heo    2024-06-18  7010   *
07814a9439a3b0 Tejun Heo    2024-06-18  7011   * To be called through scx_bpf_dump() helper from ops.dump(), dump_cpu() and
07814a9439a3b0 Tejun Heo    2024-06-18  7012   * dump_task() to generate extra debug dump specific to the BPF scheduler.
07814a9439a3b0 Tejun Heo    2024-06-18  7013   *
07814a9439a3b0 Tejun Heo    2024-06-18  7014   * The extra dump may be multiple lines. A single line may be split over
07814a9439a3b0 Tejun Heo    2024-06-18  7015   * multiple calls. The last line is automatically terminated.
07814a9439a3b0 Tejun Heo    2024-06-18  7016   */
07814a9439a3b0 Tejun Heo    2024-06-18  7017  __bpf_kfunc void scx_bpf_dump_bstr(char *fmt, unsigned long long *data,
07814a9439a3b0 Tejun Heo    2024-06-18  7018  				   u32 data__sz)
07814a9439a3b0 Tejun Heo    2024-06-18  7019  {
07814a9439a3b0 Tejun Heo    2024-06-18  7020  	struct scx_dump_data *dd = &scx_dump_data;
07814a9439a3b0 Tejun Heo    2024-06-18  7021  	struct scx_bstr_buf *buf = &dd->buf;
07814a9439a3b0 Tejun Heo    2024-06-18  7022  	s32 ret;
07814a9439a3b0 Tejun Heo    2024-06-18  7023  
07814a9439a3b0 Tejun Heo    2024-06-18  7024  	if (raw_smp_processor_id() != dd->cpu) {
07814a9439a3b0 Tejun Heo    2024-06-18  7025  		scx_ops_error("scx_bpf_dump() must only be called from ops.dump() and friends");
07814a9439a3b0 Tejun Heo    2024-06-18  7026  		return;
07814a9439a3b0 Tejun Heo    2024-06-18  7027  	}
07814a9439a3b0 Tejun Heo    2024-06-18  7028  
07814a9439a3b0 Tejun Heo    2024-06-18  7029  	/* append the formatted string to the line buf */
07814a9439a3b0 Tejun Heo    2024-06-18  7030  	ret = __bstr_format(buf->data, buf->line + dd->cursor,
07814a9439a3b0 Tejun Heo    2024-06-18 @7031  			    sizeof(buf->line) - dd->cursor, fmt, data, data__sz);
07814a9439a3b0 Tejun Heo    2024-06-18  7032  	if (ret < 0) {
07814a9439a3b0 Tejun Heo    2024-06-18  7033  		dump_line(dd->s, "%s[!] (\"%s\", %p, %u) failed to format (%d)",
07814a9439a3b0 Tejun Heo    2024-06-18  7034  			  dd->prefix, fmt, data, data__sz, ret);
07814a9439a3b0 Tejun Heo    2024-06-18  7035  		return;
07814a9439a3b0 Tejun Heo    2024-06-18  7036  	}
07814a9439a3b0 Tejun Heo    2024-06-18  7037  
07814a9439a3b0 Tejun Heo    2024-06-18  7038  	dd->cursor += ret;
07814a9439a3b0 Tejun Heo    2024-06-18  7039  	dd->cursor = min_t(s32, dd->cursor, sizeof(buf->line));
07814a9439a3b0 Tejun Heo    2024-06-18  7040  
07814a9439a3b0 Tejun Heo    2024-06-18  7041  	if (!dd->cursor)
07814a9439a3b0 Tejun Heo    2024-06-18  7042  		return;
07814a9439a3b0 Tejun Heo    2024-06-18  7043  
07814a9439a3b0 Tejun Heo    2024-06-18  7044  	/*
07814a9439a3b0 Tejun Heo    2024-06-18  7045  	 * If the line buf overflowed or ends in a newline, flush it into the
07814a9439a3b0 Tejun Heo    2024-06-18  7046  	 * dump. This is to allow the caller to generate a single line over
07814a9439a3b0 Tejun Heo    2024-06-18  7047  	 * multiple calls. As ops_dump_flush() can also handle multiple lines in
07814a9439a3b0 Tejun Heo    2024-06-18  7048  	 * the line buf, the only case which can lead to an unexpected
07814a9439a3b0 Tejun Heo    2024-06-18  7049  	 * truncation is when the caller keeps generating newlines in the middle
07814a9439a3b0 Tejun Heo    2024-06-18  7050  	 * instead of the end consecutively. Don't do that.
07814a9439a3b0 Tejun Heo    2024-06-18  7051  	 */
07814a9439a3b0 Tejun Heo    2024-06-18  7052  	if (dd->cursor >= sizeof(buf->line) || buf->line[dd->cursor - 1] == '\n')
07814a9439a3b0 Tejun Heo    2024-06-18  7053  		ops_dump_flush();
07814a9439a3b0 Tejun Heo    2024-06-18  7054  }
07814a9439a3b0 Tejun Heo    2024-06-18  7055  

:::::: The code at line 6942 was first introduced by commit
:::::: f0e1a0643a59bf1f922fa209cec86a170b784f3f sched_ext: Implement BPF extensible scheduler class

:::::: TO: Tejun Heo <tj@...nel.org>
:::::: CC: Tejun Heo <tj@...nel.org>

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ