Hi Steven,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v6.13-rc2 next-20241211]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    
https://github.com/intel-lab-lkp/linux/commits/Steven-Rostedt/tracing-Fix-trace-output-when-pointer-hash-is-disabled/20241211-062827
base:   linus/master
patch link:    
https://lore.kernel.org/r/20241210172533.04bcd5f7%40batman.local.home
patch subject: [PATCH] tracing: Fix trace output when pointer hash is disabled
config: i386-buildonly-randconfig-003-20241211 
(https://download.01.org/0day-ci/archive/20241211/[email protected]/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project 
ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): 
(https://download.01.org/0day-ci/archive/20241211/[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 kernel/trace/trace.c:15:
   In file included from include/linux/ring_buffer.h:5:
   In file included from include/linux/mm.h:2223:
   include/linux/vmstat.h:518:36: warning: arithmetic between different 
enumeration types ('enum node_stat_item' and 'enum lru_list') 
[-Wenum-enum-conversion]
     518 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
>> kernel/trace/trace.c:3749:8: warning: variable 'p' is used uninitialized 
>> whenever 'if' condition is true [-Wsometimes-uninitialized]
    3749 |                         if (!trace_iter_expand_format(iter))
         |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   kernel/trace/trace.c:3900:7: note: uninitialized use occurs here
    3900 |         if (*p)
         |              ^
   kernel/trace/trace.c:3749:4: note: remove the 'if' if its condition is 
always false
    3749 |                         if (!trace_iter_expand_format(iter))
         |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    3750 |                                 goto print;
         |                                 ~~~~~~~~~~
   kernel/trace/trace.c:3739:6: warning: variable 'p' is used uninitialized 
whenever 'if' condition is true [-Wsometimes-uninitialized]
    3739 |         if (iter->fmt == static_fmt_buf)
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   kernel/trace/trace.c:3900:7: note: uninitialized use occurs here
    3900 |         if (*p)
         |              ^
   kernel/trace/trace.c:3739:2: note: remove the 'if' if its condition is 
always false
    3739 |         if (iter->fmt == static_fmt_buf)
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    3740 |                 goto print;
         |                 ~~~~~~~~~~
   kernel/trace/trace.c:3724:6: warning: variable 'p' is used uninitialized 
whenever 'if' condition is true [-Wsometimes-uninitialized]
    3724 |         if (static_branch_unlikely(&trace_no_verify))
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/jump_label.h:497:40: note: expanded from macro 
'static_branch_unlikely'
     497 | #define static_branch_unlikely(x)                                    
           \
         |                                                                      
           ^
     498 | ({                                                                   
           \
         | 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     499 |         bool branch;                                                 
           \
         |         
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     500 |         if (__builtin_types_compatible_p(typeof(*x), struct 
static_key_true))   \
         |         
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     501 |                 branch = arch_static_branch_jump(&(x)->key, false);  
           \
         |                 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     502 |         else if (__builtin_types_compatible_p(typeof(*x), struct 
static_key_false)) \
         |         
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     503 |                 branch = arch_static_branch(&(x)->key, false);       
           \
         |                 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     504 |         else                                                         
           \
         |         
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     505 |                 branch = ____wrong_branch_error();                   
           \
         |                 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     506 |         unlikely_notrace(branch);                                    
                   \
         |         
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     507 | })
         | ~~
   kernel/trace/trace.c:3900:7: note: uninitialized use occurs here
    3900 |         if (*p)
         |              ^
   kernel/trace/trace.c:3724:2: note: remove the 'if' if its condition is 
always false
    3724 |         if (static_branch_unlikely(&trace_no_verify))
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    3725 |                 goto print;
         |                 ~~~~~~~~~~
   kernel/trace/trace.c:3715:9: note: initialize the variable 'p' to silence 
this warning
    3715 |         char *p;
         |                ^
         |                 = NULL
   4 warnings generated.


vim +3749 kernel/trace/trace.c

  3696  
  3697  /**
  3698   * trace_check_vprintf - Check dereferenced strings while writing to 
the seq buffer
  3699   * @iter: The iterator that holds the seq buffer and the event being 
printed
  3700   * @fmt: The format used to print the event
  3701   * @ap: The va_list holding the data to print from @fmt.
  3702   *
  3703   * This writes the data into the @iter->seq buffer using the data from
  3704   * @fmt and @ap. If the format has a %s, then the source of the string
  3705   * is examined to make sure it is safe to print, otherwise it will
  3706   * warn and print "[UNSAFE MEMORY]" in place of the dereferenced string
  3707   * pointer.
  3708   */
  3709  void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
  3710                           va_list ap)
  3711  {
  3712          long text_delta = 0;
  3713          long data_delta = 0;
  3714          const char *str;
  3715          char *p;
  3716          char save_ch;
  3717          char *buf = NULL;
  3718          bool good;
  3719          int i, j;
  3720  
  3721          if (WARN_ON_ONCE(!fmt))
  3722                  return;
  3723  
  3724          if (static_branch_unlikely(&trace_no_verify))
  3725                  goto print;
  3726  
  3727          /*
  3728           * When the kernel is booted with the tp_printk command line
  3729           * parameter, trace events go directly through to printk().
  3730           * It also is checked by this function, but it does not
  3731           * have an associated trace_array (tr) for it.
  3732           */
  3733          if (iter->tr) {
  3734                  text_delta = iter->tr->text_delta;
  3735                  data_delta = iter->tr->data_delta;
  3736          }
  3737  
  3738          /* Don't bother checking when doing a ftrace_dump() */
  3739          if (iter->fmt == static_fmt_buf)
  3740                  goto print;
  3741  
  3742          if (fmt != iter->fmt) {
  3743                  int len = strlen(fmt);
  3744                  while (iter->fmt_size < len + 1) {
  3745                          /*
  3746                           * If we can't expand the copy buffer,
  3747                           * just print it.
  3748                           */
> 3749                          if (!trace_iter_expand_format(iter))
  3750                                  goto print;
  3751                  }
  3752                  strscpy(iter->fmt, fmt, iter->fmt_size);
  3753          }
  3754          p = iter->fmt;
  3755          while (*p) {
  3756                  bool star = false;
  3757                  int len = 0;
  3758  
  3759                  j = 0;
  3760  
  3761                  /*
  3762                   * We only care about %s and variants
  3763                   * as well as %p[sS] if delta is non-zero
  3764                   */
  3765                  for (i = 0; p[i]; i++) {
  3766  
  3767                          if (p[i] == '\\' && p[i+1]) {
  3768                                  i++;
  3769                                  continue;
  3770                          }
  3771                          if (p[i] == '%') {
  3772                                  /* Need to test cases like %08.*s */
  3773                                  for (j = 1; p[i+j]; j++) {
  3774                                          if (isdigit(p[i+j]) ||
  3775                                              p[i+j] == '.')
  3776                                                  continue;
  3777                                          if (p[i+j] == '*') {
  3778                                                  star = true;
  3779                                                  continue;
  3780                                          }
  3781                                          break;
  3782                                  }
  3783                                  if (p[i+j] == 's')
  3784                                          break;
  3785  
  3786                                  if (text_delta && p[i+1] == 'p' &&
  3787                                      ((p[i+2] == 's' || p[i+2] == 'S')))
  3788                                          break;
  3789  
  3790                                  star = false;
  3791                          }
  3792                          j = 0;
  3793                  }
  3794                  /* If no %s found then just print normally */
  3795                  if (!p[i])
  3796                          break;
  3797  
  3798                  /* Print up to the %s */
  3799                  save_ch = p[i];
  3800                  p[i] = '\0';
  3801                  trace_seq_vprintf(&iter->seq, p, ap);
  3802                  p[i] = save_ch;
  3803  
  3804                  /* Add delta to %pS pointers */
  3805                  if (p[i+1] == 'p') {
  3806                          unsigned long addr;
  3807                          char fmt[4];
  3808  
  3809                          fmt[0] = '%';
  3810                          fmt[1] = 'p';
  3811                          fmt[2] = p[i+2]; /* Either %ps or %pS */
  3812                          fmt[3] = '\0';
  3813  
  3814                          addr = va_arg(ap, unsigned long);
  3815                          addr += text_delta;
  3816                          trace_seq_printf(&iter->seq, fmt, (void *)addr);
  3817  
  3818                          p += i + 3;
  3819                          continue;
  3820                  }
  3821  
  3822                  /*
  3823                   * If iter->seq is full, the above call no longer 
guarantees
  3824                   * that ap is in sync with fmt processing, and further 
calls
  3825                   * to va_arg() can return wrong positional arguments.
  3826                   *
  3827                   * Ensure that ap is no longer used in this case.
  3828                   */
  3829                  if (iter->seq.full) {
  3830                          p = "";
  3831                          break;
  3832                  }
  3833  
  3834                  if (star)
  3835                          len = va_arg(ap, int);
  3836  
  3837                  /* The ap now points to the string data of the %s */
  3838                  str = va_arg(ap, const char *);
  3839  
  3840                  good = trace_safe_str(iter, str, star, len);
  3841  
  3842                  /* Could be from the last boot */
  3843                  if (data_delta && !good) {
  3844                          str += data_delta;
  3845                          good = trace_safe_str(iter, str, star, len);
  3846                  }
  3847  
  3848                  p += i;
  3849  
  3850                  /*
  3851                   * If you hit this warning, it is likely that the
  3852                   * trace event in question used %s on a string that
  3853                   * was saved at the time of the event, but may not be
  3854                   * around when the trace is read. Use __string(),
  3855                   * __assign_str() and __get_str() helpers in the 
TRACE_EVENT()
  3856                   * instead. See 
samples/trace_events/trace-events-sample.h
  3857                   * for reference.
  3858                   */
  3859                  if (WARN_ONCE(!good, "fmt: '%s' current_buffer: '%s'",
  3860                                fmt, seq_buf_str(&iter->seq.seq))) {
  3861                          int ret;
  3862  #define TEMP_BUFSIZ 1024
  3863  
  3864                          if (!buf) {
  3865                                  char *buf = kmalloc(TEMP_BUFSIZ, 
GFP_KERNEL);
  3866                                  if (!buf) {
  3867                                          /* Need buffer to read address 
*/
  3868                                          trace_seq_printf(&iter->seq, 
"(0x%px)[UNSAFE-MEMORY]", str);
  3869                                          goto print;
  3870                                  }
  3871                          }
  3872                          if (len >= TEMP_BUFSIZ)
  3873                                  len = TEMP_BUFSIZ - 1;
  3874  
  3875                          /* Try to safely read the string */
  3876                          if (star) {
  3877                                  ret = copy_from_kernel_nofault(buf, 
str, len);
  3878                                  buf[len] = 0;
  3879                          } else {
  3880                                  ret = strncpy_from_kernel_nofault(buf, 
str, 1024);
  3881                          }
  3882                          if (ret < 0)
  3883                                  trace_seq_printf(&iter->seq, "(0x%px)", 
str);
  3884                          else
  3885                                  trace_seq_printf(&iter->seq, 
"(0x%px:%s)", str, buf);
  3886                          trace_seq_puts(&iter->seq, "[UNSAFE-MEMORY]");
  3887                  } else {
  3888                          save_ch = p[j + 1];
  3889                          p[j + 1] = '\0';
  3890                          if (star)
  3891                                  trace_seq_printf(&iter->seq, p, len, 
str);
  3892                          else
  3893                                  trace_seq_printf(&iter->seq, p, str);
  3894                          p[j + 1] = save_ch;
  3895                  }
  3896  
  3897                  p += j + 1;
  3898          }
  3899   print:
  3900          if (*p)
  3901                  trace_seq_vprintf(&iter->seq, p, ap);
  3902          kfree(buf);
  3903  }
  3904  

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

Reply via email to