<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Fri, Aug 10, 2018 at 11:17 AM George Karpenkov <<a href="mailto:ekarpenkov@apple.com">ekarpenkov@apple.com</a>> wrote:<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">Iterating over unordered_map and unordered_set (or user-defined? llvm::DenseSet/DenseMap?) would seem like usual suspects for such checks.</div><div style="word-wrap:break-word;line-break:after-white-space"><div><br></div><div>> I don’t know of any nice way to track whether an ordered walk of an unordered container leaks out into the final output of the program</div><div><br></div></div><div style="word-wrap:break-word;line-break:after-white-space"><div>Precisely, so if it’s not doable for a checker, it’s probably not reliably doable for an engineer as well.</div></div></blockquote><div><br></div><div>I wouldn't think that was the case - you might iterate one hashed container and build another deep in other function calls - I've certainly debugged through many layers of that sort of thing when poking around in LLVM.</div><div> </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"><div>In my experience, most iterations over unordered containers tend to affect the final output,<br></div></div></blockquote><div><br>I'd be surprised if that was the case - though a bit hard to measure. I would guess LLVM has maybe O(hundreds) of iterations over hashed containers that don't effect the final output - but that's just a guess.<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"><div></div><div>and if project owners really care about avoiding non-determinism it would IMO make sense to ban those.</div></div></blockquote><div><br>Seems a bit severe to me. But I could be wrong.<br><br>- Dave<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"><div><div><br><blockquote type="cite"><div>On Aug 9, 2018, at 11:52 AM, Grang, Mandeep Singh via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="m_-2154885074259416349Apple-interchange-newline"><div>
  
    
  
  <div text="#000000" bgcolor="#FFFFFF"><p>Thanks for your response David.</p><p>1) I'm not sure it's do-able. I don't know of any nice way to
      track whether an ordered walk of an unordered container leaks out
      into the final output of the program. Only iterating over an
      unordered container is probably not a sufficient hint (it'd have a
      high false positive rate to warn on every instance of that) - and
      I don't have any great ideas about whether that false positive
      rate could be sufficiently reduced with maybe some heuristics
      about connecting one iteration to another container population,
      and to the final program output</p><p>The idea I had in mind was to check the commutativity of each
      operation inside the iteration of the unordered container. I
      realize we may not be able to do this for every operation and even
      if we could that would still be a heuristic and prone to false
      positives. Maybe we can start with a simpler problem to tackle
      instead of the iteration order. That's why in the patch I pushed I
      wrote a very simple checker for std::sort with raw pointers.<br>
    </p><p>> 2) Maybe - but I would think that'd still end up using
      heuristics to guess at whether one iteration order impacts the
      order of another container, etc.</p><p>Yes, maybe iteration order is more difficult to problem but we
      should be able to detect non-deterministic sorting order of keys
      with same values. The idea I had in mind is similar to what we do
      in llvm::sort (which is random shuffle of the container). We
      instrument the user code to sort a container twice - first is the
      user's normal std::sort, the second time we random shuffle the
      container and then sort again, and then check if there is a
      difference in the two outputs. The run time cost would be the cost
      of the shuffle + the extra sort + the cost of checking the two
      containers [O(n lg n)  + 2 O(n)].</p><p>--Mandeep<br>
    </p>
    <br>
    <div class="m_-2154885074259416349moz-cite-prefix">On 8/9/2018 11:13 AM, David Blaikie
      wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">1) I'm not sure it's do-able. I don't know of any
        nice way to track whether an ordered walk of an unordered
        container leaks out into the final output of the program. Only
        iterating over an unordered container is probably not a
        sufficient hint (it'd have a high false positive rate to warn on
        every instance of that) - and I don't have any great ideas about
        whether that false positive rate could be sufficiently reduced
        with maybe some heuristics about connecting one iteration to
        another container population, and to the final program
        output... <br>
        <br>
        2) Maybe - but I would think that'd still end up using
        heuristics to guess at whether one iteration order impacts the
        order of another container, etc.</div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr">On Wed, Aug 8, 2018 at 7:43 PM Grang, Mandeep
          Singh via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@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">In the past,
          I had added the ability in LLVM to uncover 2 types of <br>
          non-deterministic behaviors: iteration of unordered containers
          with <br>
          pointer-like keys and sorting of elements with the same keys.<br>
          <br>
          Now, I wanted to add checkers for these (and other types of <br>
          non-deterministic behaviors) so that they could be applied
          more widely. <br>
          I also realize that not all of these may be doable at
          compile-time.<br>
          <br>
          With that in mind, I have pushed a patch which I adds a new
          category of <br>
          checks for non-determinism: <a href="https://reviews.llvm.org/D50488" rel="noreferrer" target="_blank">https://reviews.llvm.org/D50488</a>.<br>
          <br>
          The first checker which I have pushed here will simply check
          if raw <br>
          pointers are being sorted. In subsequent patches, I will fine
          tune this <br>
          by handling more complex cases of sorting of pointer-like
          keys.<br>
          <br>
          I have another patch which checks for iteration of unordered
          containers <br>
          but that may be very noisy in its current form.<br>
          <br>
          I would like comments/suggestions from the community on:<br>
          <br>
          1. Are static analysis checks to detect non-determinism
          something worth <br>
          doing/doable?<br>
          <br>
          2. How about writing sanitizers to detect non-deterministic
          behavior? <br>
          Would that be too costly in terms of run time and
          instrumentation?<br>
          <br>
          --Mandeep<br>
          <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>
    </blockquote>
    <br>
  </div>

_______________________________________________<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" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br></div></blockquote></div><br></div></div></blockquote></div></div>