<div dir="ltr">Sorry, I've stated the problem incorrectly.<div>Turns out that I'm seeing false positives exactly because MSan fails to see that the inline assembly routine initializes its outputs.</div><div>E.g. for functions like __test_and_set_bit() in the kernel, there's a local variable holding the return value:</div><div><br></div><div><pre style="box-sizing:inherit;font-family:"Ubuntu Mono",monospace;font-size:0.9em;line-height:1.2;padding:1em 0px 4em 1em;color:rgb(0,0,0);margin:0px;min-height:100%;white-space:pre;word-spacing:0px;word-break:normal;word-wrap:normal;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration-style:initial;text-decoration-color:initial"><span class="gmail-k" style="box-sizing:inherit;color:rgb(0,136,0)">static</span> <span class="gmail-n" style="box-sizing:inherit"><a href="https://elixir.bootlin.com/linux/latest/ident/__always_inline" style="box-sizing:inherit;background-color:rgb(244,246,255);color:inherit;text-decoration:none;font-weight:700;border-radius:0.2em">__always_inline</a></span> <span class="gmail-kt" style="box-sizing:inherit;color:rgb(51,51,153)">bool</span> <span class="gmail-nf" style="box-sizing:inherit;color:rgb(0,102,187)"><a href="https://elixir.bootlin.com/linux/latest/ident/__test_and_set_bit" style="box-sizing:inherit;background-color:rgb(244,246,255);color:inherit;text-decoration:none;font-weight:700;border-radius:0.2em">__test_and_set_bit</a></span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">(</span><span class="gmail-kt" style="box-sizing:inherit;color:rgb(51,51,153)">long</span> <span class="gmail-n" style="box-sizing:inherit"><a href="https://elixir.bootlin.com/linux/latest/ident/nr" style="box-sizing:inherit;background-color:rgb(244,246,255);color:inherit;text-decoration:none;font-weight:700;border-radius:0.2em">nr</a></span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">,</span> <span class="gmail-n" style="box-sizing:inherit"><a href="https://elixir.bootlin.com/linux/latest/ident/volatile" style="box-sizing:inherit;background-color:rgb(244,246,255);color:inherit;text-decoration:none;font-weight:700;border-radius:0.2em">volatile</a></span> <span class="gmail-kt" style="box-sizing:inherit;color:rgb(51,51,153)">unsigned</span> <span class="gmail-kt" style="box-sizing:inherit;color:rgb(51,51,153)">long</span> <span class="gmail-o" style="box-sizing:inherit;color:rgb(102,102,102)">*</span><span class="gmail-n" style="box-sizing:inherit">addr</span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">)</span>
<span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">{</span>
        <span class="gmail-kt" style="box-sizing:inherit;color:rgb(51,51,153)">bool</span> <span class="gmail-n" style="box-sizing:inherit">oldbit</span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">;</span>

        <span class="gmail-n" style="box-sizing:inherit"><a href="https://elixir.bootlin.com/linux/latest/ident/asm" style="box-sizing:inherit;background-color:rgb(244,246,255);color:inherit;text-decoration:none;font-weight:700;border-radius:0.2em">asm</a></span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">(</span><span class="gmail-s" style="box-sizing:inherit;color:rgb(222,127,0)">"bts %2,%1"</span>
            <span class="gmail-n" style="box-sizing:inherit"><a href="https://elixir.bootlin.com/linux/latest/ident/CC_SET" style="box-sizing:inherit;background-color:rgb(244,246,255);color:inherit;text-decoration:none;font-weight:700;border-radius:0.2em">CC_SET</a></span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">(</span><span class="gmail-n" style="box-sizing:inherit">c</span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">)</span>
            <span class="gmail-o" style="box-sizing:inherit;color:rgb(102,102,102)">:</span> <span class="gmail-n" style="box-sizing:inherit"><a href="https://elixir.bootlin.com/linux/latest/ident/CC_OUT" style="box-sizing:inherit;background-color:rgb(244,246,255);color:inherit;text-decoration:none;font-weight:700;border-radius:0.2em">CC_OUT</a></span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">(</span><span class="gmail-n" style="box-sizing:inherit">c</span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">)</span> <span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">(</span><span class="gmail-n" style="box-sizing:inherit">oldbit</span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">),</span> <span class="gmail-nl" style="box-sizing:inherit;color:rgb(153,119,0)"><a href="https://elixir.bootlin.com/linux/latest/ident/ADDR" style="box-sizing:inherit;background-color:rgb(244,246,255);color:inherit;text-decoration:none;font-weight:700;border-radius:0.2em">ADDR</a></span>
            <span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">:</span> <span class="gmail-s" style="box-sizing:inherit;color:rgb(222,127,0)">"Ir"</span> <span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">(</span><span class="gmail-n" style="box-sizing:inherit"><a href="https://elixir.bootlin.com/linux/latest/ident/nr" style="box-sizing:inherit;background-color:rgb(244,246,255);color:inherit;text-decoration:none;font-weight:700;border-radius:0.2em">nr</a></span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">));</span>
        <span class="gmail-k" style="box-sizing:inherit;color:rgb(0,136,0)">return</span> <span class="gmail-n" style="box-sizing:inherit">oldbit</span><span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">;</span>
<span class="gmail-p" style="box-sizing:inherit;color:rgb(102,102,102)">}</span></pre>, which the tool treats as uninitialized, unless we explicitly set it to false before calling asm().</div><div><br><br><div class="gmail_quote"><div dir="ltr">On Fri, Mar 16, 2018 at 11:43 PM Evgenii Stepanov <<a href="mailto:eugeni.stepanov@gmail.com">eugeni.stepanov@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Could you provide an example where MSan checks an output parameter?<br>
<br>
On Fri, Mar 16, 2018 at 9:53 AM, Alexander Potapenko via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
> Hi all,<br>
><br>
> I'm trying to figure out which parameters of a given InlineAsm instruction<br>
> are its inputs, and which are the outputs (rationale: make sure MSan<br>
> doesn't check the output parameters of an asm() statement).<br>
><br>
> As far as I understand, this information is only available through the<br>
> ConstraintInfoVector for the InlineAsm. However there's no exact match<br>
> between the constraints and the InlineAsm params. In addition to clobber<br>
> constraints, which should be safe to ignore, there can be multiple<br>
> occurrences  of a single parameter having different constraints. Also, for<br>
> InlineAsm instructions returning non-void values there's one additional<br>
> constraint, but it's unclear whether it always goes first.<br>
><br>
> My current implementation is quite ad-hoc, so I'm wondering if there's any<br>
> code that already does what I'm trying to achieve.<br>
><br>
> Thanks in advance,<br>
> Alexander<br>
><br>
> --<br>
> Alexander Potapenko<br>
> Software Engineer<br>
><br>
> Google Germany GmbH<br>
> Erika-Mann-Straße, 33<br>
> 80636 München<br>
><br>
> Geschäftsführer: Paul Manicle, Halimah DeLaine Prado<br>
> Registergericht und -nummer: Hamburg, HRB 86891<br>
> Sitz der Gesellschaft: Hamburg<br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">Alexander Potapenko<br>Software Engineer<br><br>Google Germany GmbH<br>Erika-Mann-Straße, 33<br>80636 München<br><br>Geschäftsführer: Paul Manicle, Halimah DeLaine Prado<br>Registergericht und -nummer: Hamburg, HRB 86891<br>Sitz der Gesellschaft: Hamburg</div></div></div>