<div dir="ltr">It seems this still causes undefined behavior after fixes.<br><br>This is the log with MC/Mips/micromips-loadstore-instructions.s.<br><div>==55344== Conditional jump or move depends on uninitialised value(s)</div><div>==55344==    at 0x54A6C5: (anonymous namespace)::MipsOperand::addRegPairOperands(llvm::MCInst&, unsigned int) const (MipsAsmParser.cpp:1010)</div><div>==55344==    by 0x56A55A: (anonymous namespace)::MipsAsmParser::convertToMCInst(unsigned int, llvm::MCInst&, unsigned int, llvm::SmallVectorImpl<std::unique_ptr<llvm::MCParsedAsmOperand, std::default_delete<llvm::MCParsedAsmOperand> > > const&) (MipsGenAsmMatcher.inc:1306)</div><div>==55344==    by 0x577314: (anonymous namespace)::MipsAsmParser::MatchInstructionImpl(llvm::SmallVectorImpl<std::unique_ptr<llvm::MCParsedAsmOperand, std::default_delete<llvm::MCParsedAsmOperand> > > const&, llvm::MCInst&, unsigned long&, bool, unsigned int) (MipsGenAsmMatcher.inc:6342)</div><div>==55344==    by 0x554808: (anonymous namespace)::MipsAsmParser::MatchAndEmitInstruction(llvm::SMLoc, unsigned int&, llvm::SmallVectorImpl<std::unique_ptr<llvm::MCParsedAsmOperand, std::default_delete<llvm::MCParsedAsmOperand> > >&, llvm::MCStreamer&, unsigned long&, bool) (MipsAsmParser.cpp:3671)</div><div>==55344==    by 0x84F03C: (anonymous namespace)::AsmParser::parseStatement((anonymous namespace)::ParseStatementInfo&, llvm::MCAsmParserSemaCallback*) (AsmParser.cpp:1838)</div><div>==55344==    by 0x848F11: (anonymous namespace)::AsmParser::Run(bool, bool) (AsmParser.cpp:675)</div><div>==55344==    by 0x405F2F: AssembleInput(char const*, llvm::Target const*, llvm::SourceMgr&, llvm::MCContext&, llvm::MCStreamer&, llvm::MCAsmInfo&, llvm::MCSubtargetInfo&, llvm::MCInstrInfo&, llvm::MCTargetOptions&) (llvm-mc.cpp:364)</div><div>==55344==    by 0x4070D8: main (llvm-mc.cpp:536)</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, May 9, 2016 at 10:27 PM Daniel Sanders via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> > @@ -4673,9 +4692,9 @@ MipsAsmParser::parseRegisterPair(Operand<br>
> ><br>
> >    SMLoc E = Parser.getTok().getLoc();<br>
> >    MipsOperand &Op = static_cast<MipsOperand &>(*Operands.back());<br>
> > -  unsigned Reg = Op.getGPR32Reg();<br>
> > +<br>
> >    Operands.pop_back();<br>
> > -  Operands.push_back(MipsOperand::CreateRegPair(Reg, S, E, *this));<br>
> > +  Operands.push_back(MipsOperand::CreateRegPair(Op, S, E, *this));<br>
><br>
> There's a use after free here because Op is still bound to<br>
> Operands.back().  I tried to fix in r268901, but it broke tests. Can you take a look?<br>
<br>
I've applied a quick fix for this in r268913. Op is now a copy of the last element so that Op isn't deleted when pop_back() causes std::unique_ptr<MipsOperand> to delete Operands.back().<br>
<br>
I'm not sure why your fix didn't work. It looked ok to me.<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>