Quuxplusone added inline comments.

================
Comment at: clang-tidy/obvious/InvalidRangeCheck.cpp:62
+  auto CallsAlgorithm = hasDeclaration(
+      functionDecl(Names.size() > 0 ? hasAnyName(Names) : anything()));
+
----------------
Prazek wrote:
> alexfh wrote:
> >  Does this check make sense without the names whitelist? What will is the 
> > use case?
> I would guess most of the functions that would be called like
> foo(v.begin(), v2.end(), ...) would take range as 2 first arguments. at least 
> I never saw code that this would be valid 
> (other case is something like foo(v.begin(), v2.begin(), ...), but I look 
> only for ranges [begin, end())
I wonder if there is any hope that STL implementations might one day carry 
source-level annotations as to what is expected to be a range and what isn't. 
That is, something like
```
template<typename _RandomAccessIterator>
inline void
sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
    __attribute__((__expect_range__(__first, __last)))
```
similar to how we have `__attribute__((__format__))` for printf-style format 
strings, and `__attribute__((__sentinel__))` for null sentinels, and so on. 
Then you could eliminate the heuristics concerned with detecting "what formal 
parameters expect a range" and just work on the heuristics for "what actual 
arguments are a range". (E.g., v.end() and v.begin() are unlikely to make a 
valid range in that order. v.begin() and v2.end() are unlikely to make a valid 
range together. And so on.)


================
Comment at: docs/ReleaseNotes.rst:120
+  code.
+- New `obvious-invalid-range
+  <http://clang.llvm.org/extra/clang-tidy/checks/obvious-invalid-range.html>`_ 
check
----------------
Prazek wrote:
> alexfh wrote:
> > The idea of the `obvious` module is interesting, but I'm not sure this 
> > check belongs here. At least, I would like to run it on our code and see 
> > whether it finds anything before calling this "obvious" ;)
> I runned it on LLVM and clang and as expected it didn't find anything (the 
> code would crash or would be dead)
As discussed more thoroughly in https://reviews.llvm.org/D27815 — I continue to 
think that this is a misuse of the word "obvious". Particularly, the phrase 
"while looking for an obvious bug" is an oxymoron: if the bug were obvious, you 
wouldn't need the compiler to help you look for it.
I'll pick the thread back up in D27815 rather than reopen it here.


================
Comment at: test/clang-tidy/obvious-invalid-range.cpp:35
+
+  std::copy(v.begin(), v.end(), v2.begin());
+}
----------------
I would expect this same check to warn on

    std::copy(v.begin(), v.begin(), v2.begin());
    std::copy(v.end(), v.begin(), v2.begin());

Mind you, I'm not sure *any* of these three warnings will come up in practice 
enough to be useful to anyone; for all the code it takes to implement them, it 
might be higher ROI to invest in a general-purpose 
common-subexpression-detector and/or trying to track "rangeness" through a 
dataflow analysis.


================
Comment at: test/clang-tidy/obvious-invalid-range.cpp:45
+  std::move(v.begin(), v.end(), v2.begin());
+  std::move(v.begin());
+  test_copy();
----------------
I would expect a warning on this line, in that the result of std::move() is 
unused.


https://reviews.llvm.org/D27806



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to