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
