[PATCH] D37525: [docs] Add a note on iteration of unordered containers to coding standards

Mandeep Singh Grang via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 6 12:31:48 PDT 2017


mgrang updated this revision to Diff 114047.
mgrang edited the summary of this revision.
mgrang added a comment.

Made changes in the text based on comments:

@dblaikie: "Might be worth pivoting this a bit differently to talk about ordering of pointers if that's the specific niche we're going to discourage/outlaw. (this could happen on std::set/map/etc too, when used with pointer keys)

Also "sort before iteration" is a bit too strong since it's only about when iterating to produce an ordered result (if it's an iteration to compute, say, a total or some order-agnostic summary/result, that's fine)."


Repository:
  rL LLVM

https://reviews.llvm.org/D37525

Files:
  docs/CodingStandards.rst


Index: docs/CodingStandards.rst
===================================================================
--- docs/CodingStandards.rst
+++ docs/CodingStandards.rst
@@ -811,6 +811,21 @@
   for (const auto *Ptr : Container) { observe(*Ptr); }
   for (auto *Ptr : Container) { Ptr->change(); }
 
+Beware of non-determinism due to iteration order of pointers
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In general, there is no relative ordering among pointers. As a result,
+when unordered containers like sets and maps are used with pointer keys
+the iteration order is undefined. Hence, iterating such containers may
+result in non-deterministic code generation. While the generated code
+might not necessarily be "wrong code", this non-determinism might result
+in unexpected runtime crashes or simply hard to reproduce bugs on the
+customer side making it harder to debug and fix.
+
+As a rule of thumb, in case an ordered result is expected, remember to
+sort an unordered container before iteration. Or use an ordered
+container like vector if the keys are pointers.
+
 Style Issues
 ============
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D37525.114047.patch
Type: text/x-patch
Size: 1116 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170906/359e2d86/attachment.bin>


More information about the llvm-commits mailing list