On Mon, Jul 4, 2022 at 3:44 PM Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > > On Mon, Jul 04, 2022 at 10:20:53AM +0200, Alexander Potapenko wrote: > > > What makes you think they are false positives? Is the scenario I > > described above: > > > > """ > > In particular, if the call to lookup_fast() in walk_component() > > returns NULL, and lookup_slow() returns a valid dentry, then the > > `seq` and `inode` will remain uninitialized until the call to > > step_into() > > """ > > > > impossible? > > Suppose step_into() has been called in non-RCU mode. The first > thing it does is > int err = handle_mounts(nd, dentry, &path, &seq); > if (err < 0) > return ERR_PTR(err); > > And handle_mounts() in non-RCU mode is > path->mnt = nd->path.mnt; > path->dentry = dentry; > if (nd->flags & LOOKUP_RCU) { > [unreachable code] > } > [code not touching seqp] > if (unlikely(ret)) { > [code not touching seqp] > } else { > *seqp = 0; /* out of RCU mode, so the value doesn't matter */ > } > return ret; > > In other words, the value seq argument of step_into() used to have ends up > being never fetched and, in case step_into() gets past that if (err < 0) > that value is replaced with zero before any further accesses. Oh, I see. That is actually what had been discussed here: https://lore.kernel.org/linux-toolchains/20220614144853.3693273-1-glider@xxxxxxxxxx/ Indeed, step_into() in its current implementation does not use `seq` (which is noted in the patch description ;)), but the question is whether we want to catch such cases regardless of that. One of the reasons to do so is standard compliance - passing an uninitialized value to a function is UB in C11, as Segher pointed out here: https://lore.kernel.org/linux-toolchains/20220614214039.GA25951@xxxxxxxxxxxxxxxxx/ The compilers may not be smart enough to take advantage of this _yet_, but I wouldn't underestimate their ability to evolve (especially that of Clang). I also believe it's fragile to rely on the callee to ignore certain parameters: it may be doing so today, but if someone changes step_into() tomorrow we may miss it. If I am reading Linus's message here (and the following one from him in the same thread): https://lore.kernel.org/linux-toolchains/CAHk-=whjz3wO8zD+itoerphWem+JZz4uS3myf6u1Wd6epGRgmQ@xxxxxxxxxxxxxx/ correctly, we should be reporting uninitialized values passed to functions, unless those values dissolve after inlining. While this is a bit of a vague criterion, at least for Clang we always know that KMSAN instrumentation is applied after inlining, so the reports we see are due to values that are actually passed between functions. > So it's a false positive; yes, strictly speaking compiler is allowd > to do anything whatsoever if it manages to prove that the value is > uninitialized. Realistically, though, especially since unsigned int > is not allowed any trapping representations... > > If you want an test stripped of VFS specifics, consider this: > > int g(int n, _Bool flag) > { > if (!flag) > n = 0; > return n + 1; > } > > int f(int n, _Bool flag) > { > int x; > > if (flag) > x = n + 2; > return g(x, flag); > } > > Do your tools trigger on it? Currently KMSAN has two modes of operation controlled by CONFIG_KMSAN_CHECK_PARAM_RETVAL. When enabled, that config enforces checks of function parameters at call sites (by applying Clang's -fsanitize-memory-param-retval flag). In that mode the tool would report the attempt to call `g(x, false)` if g() survives inlining. In the case CONFIG_KMSAN_CHECK_PARAM_RETVAL=n, KMSAN won't be reporting the error. Based on the mentioned discussion I decided to make CONFIG_KMSAN_CHECK_PARAM_RETVAL=y the default option. So far it only reported a handful of errors (i.e. enforcing this rule shouldn't be very problematic for the kernel), but it simplifies handling of calls between instrumented and non-instrumented functions that occur e.g. at syscall entry points: knowing that passed-by-value arguments are checked at call sites, we can assume they are initialized in the callees. HTH, Alex -- Alexander Potapenko Software Engineer Google Germany GmbH Erika-Mann-Straße, 33 80636 München Geschäftsführer: Paul Manicle, Liana Sebastian Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Diese E-Mail ist vertraulich. Falls Sie diese fälschlicherweise erhalten haben sollten, leiten Sie diese bitte nicht an jemand anderes weiter, löschen Sie alle Kopien und Anhänge davon und lassen Sie mich bitte wissen, dass die E-Mail an die falsche Person gesendet wurde. This e-mail is confidential. If you received this communication by mistake, please don't forward it to anyone else, please erase all copies and attachments, and please let me know that it has gone to the wrong person.