<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Mon, Nov 28, 2016 at 11:47 AM Mehdi Amini <<a href="mailto:mehdi.amini@apple.com">mehdi.amini@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" class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Nov 28, 2016, at 11:40 AM, Chandler Carruth <<a href="mailto:chandlerc@gmail.com" class="gmail_msg" target="_blank">chandlerc@gmail.com</a>> wrote:</div><br class="m_-1452860792538336179Apple-interchange-newline gmail_msg"><div class="gmail_msg"><div dir="ltr" class="gmail_msg"><div class="gmail_msg">Hash functions of *pointers* cannot be consistent in the face of ASLR.</div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">I was answering the fact that “it cannot be tested”. So I meant, for the purpose of writing a unittest that checks if you can pass a flag that reverse the iteration order, I don’t expect that you need *valid* pointers.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">What I had in mind is something along these lines (I haven’t looked at the patch either):</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">SmallPtrSet<void *, 4> Set;</div><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">void *Ptrs[] = { (void *)0x1, (void *)0x2, (void *)0x3,(void *)0x4 };</div></div><div class="gmail_msg"><div class="gmail_msg">void *ExpectedExperimentalOrder[] = { (void *)0x4, (void *)0x2, (void *)0x3,(void *)0x1 };</div></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><div class="gmail_msg">for (auto *Ptr : Ptrs) </div><div class="gmail_msg">  Set.insert(Ptr);</div></div><div class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">for (auto &Tuple : zip(Set, ExpectedExperimentalOrder)) </div></div><div class="gmail_msg">  ASSERT_EQ(std::get<0>(Tuple), std::get<1>(Tuple));</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Set.setReverseIterationOrder();</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">for (auto &Tuple : zip(Set, reverse_order(ExpectedExperimentalOrder))) </div></div><div class="gmail_msg">  ASSERT_EQ(std::get<0>(Tuple), std::get<1>(Tuple));</div></div></div></div></div></div></div></blockquote><div><br></div><div>I see. Sorry for introducing noise. I don't feel strongly either way, happy to let you and Dave sort this out.</div><div><br></div><div>-Chandler</div></div></div>