<div dir="ltr"><div dir="ltr">Thanks you! This is a very good idea. I just wanted to rewrite the root of the visiting to prevent problems like that in the future, as the following (in BugReporter.cpp):<div><br></div><div><div>static std::unique_ptr<VisitorsDiagnosticsTy></div><div>generateVisitorsDiagnostics(BugReport *R, const ExplodedNode *ErrorNode,</div><div>                            BugReporterContext &BRC) {</div><div>  typedef std::vector<const ExplodedNode *> NodePath;</div><div><br></div><div>  auto Notes = llvm::make_unique<VisitorsDiagnosticsTy>();</div><div>  BugReport::VisitorList visitors;</div><div>  NodePath Path;</div><div><br></div><div>  // Run visitors on all nodes starting from the node *before* the last one.</div><div>  // The last node is reserved for notes generated with {@code getEndPath}.</div><div>  const ExplodedNode *Pred = ErrorNode;</div><div>  while (Pred) {</div><div>    Pred = Pred->getFirstPred();</div><div>    if (!Pred)</div><div>      break;</div><div><br></div><div>    if (!R->isValid())</div><div>      break;</div><div><br></div><div>    Path.push_back(Pred);</div><div>  }</div><div><br></div><div>  for (NodePath::reverse_iterator I = Path.rbegin(); I != Path.rend(); ++I) {</div><div>    const ExplodedNode *NextNode = *I;</div><div>    </div><div>    // At each iteration, move all visitors from report to visitor list.</div><div>    for (BugReport::visitor_iterator VI = R->visitor_begin(),</div><div>                                     E = R->visitor_end();</div><div>         VI != E; ++VI) {</div><div>      visitors.push_back(std::move(*VI));</div><div>    }</div><div>    R->clearVisitors();</div><div><br></div><div>    for (auto &V : visitors) {</div><div>      llvm::errs() << "\nbefore crash - it is written out";</div><div>      auto P = V->VisitNode(NextNode, BRC, *R);</div><div>      llvm::errs() << "\nafter crash";</div><div>      if (P)</div><div>        (*Notes)[NextNode].push_back(std::move(P));</div><div>    }</div><div><br></div><div>    if (!R->isValid())</div><div>      break;</div><div>  }</div><div><br></div><div>  std::shared_ptr<PathDiagnosticPiece> LastPiece;</div><div>  for (auto &V : visitors) {</div><div>    V->finalizeVisitor(BRC, ErrorNode, *R);</div><div><br></div><div>    if (auto Piece = V->getEndPath(BRC, ErrorNode, *R)) {</div><div>      assert(!LastPiece &&</div><div>             "There can only be one final piece in a diagnostic.");</div><div>      LastPiece = std::move(Piece);</div><div>      (*Notes)[ErrorNode].push_back(LastPiece);</div><div>    }</div><div>  }</div><div><br></div><div>  return Notes;</div><div>}</div></div><div><br></div><div>I think you are right about it I should change things locally, so I will drop that patch, because it is too difficult for me.</div></div></div><br><div class="gmail_quote"><div dir="ltr">George Karpenkov <<a href="mailto:ekarpenkov@apple.com">ekarpenkov@apple.com</a>> ezt írta (időpont: 2018. nov. 16., P, 19:25):<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space">I’m still not exactly sure what are you doing,<div>but you can store all the information you need in a vector inside the visitor,</div><div>and then iterate over it in the callback for the last node.</div><div>Is that what you’ve tried originally? Where does it crash?<br><div><br><blockquote type="cite"><div>On Nov 16, 2018, at 10:22 AM, Csaba Dabis <<a href="mailto:dabis.csaba98@gmail.com" target="_blank">dabis.csaba98@gmail.com</a>> wrote:</div><br class="m_2741239552702372421Apple-interchange-newline"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">The current way of bug reporting:<div>---</div><div><div>1 Assuming 'i' is not equal to 1</div><div>----</div><div>2 Assuming 'i' is not equal to 2</div><div>3 Taking false branch</div><div>4 Taking false branch</div><div>---</div></div><div><br></div><div>If I would like to hook extra information in the linear backwards way, this is going to be like the following:</div><div>---</div><div><div>1 Assuming 'i' is not equal to 1</div><div>----</div><div>2 Knowing 'i' is not equal to 2</div><div>3 Knowing 'i' is not equal to 1</div><div>4 Assuming 'i' is not equal to [1, 2]</div><div>---</div></div><div><br></div><div>And actually the proper approach would be:</div><div>---</div><div><div>1 Assuming 'i' is not equal to 1</div><div>---</div><div>2 Assuming 'i' is not equal to 2</div><div>3 Knowing 'i' is not equal to [1, 2]</div><div>4 Knowing 'i' is not equal to [1, 2]</div><div>---<br></div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr">George Karpenkov <<a href="mailto:ekarpenkov@apple.com" target="_blank">ekarpenkov@apple.com</a>> ezt írta (időpont: 2018. nov. 16., P, 19:04):<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Going forward is ambiguous, as there are many leafs, but only one root.<br>
What are you trying to achieve? Going backwards should never be a problem.<br>
<br>
> On Nov 16, 2018, at 8:21 AM, Csaba Dabis via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>> wrote:<br>
> <br>
> Hello!<br>
> <br>
> Why does the 'generateVisitorsDiagnostics()' function in BugReporter.cpp work backwards? It starts from the node of the error and iterate over the preds.<br>
> <br>
> I have tried to make it to work forward with storing the 'const ExplodedNode *' nodes in a vector, but 'auto P = V->VisitNode(NextNode, BRC, *R);' crashes. I just found out the 'LastPiece' checking could be moved out from the while-loop, that is it for now.<br>
> <br>
> Is it possible to achieve? What is could be problematic with that code snippet?<br>
> <br>
> Thanks you for the suggestions,<br>
> Csaba.<br>
> _______________________________________________<br>
> cfe-dev mailing list<br>
> <a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
<br>
</blockquote></div>
</div></blockquote></div><br></div></div></blockquote></div>