sbarzowski marked 3 inline comments as done.
sbarzowski added inline comments.


================
Comment at: clang-tidy/misc/ThrowWithNoexceptCheck.cpp:25
+  Finder->addMatcher(
+      cxxThrowExpr(stmt(hasAncestor(functionDecl(isNoThrow()).bind("func"))))
+          .bind("throw"),
----------------
Prazek wrote:
> aaron.ballman wrote:
> > Prazek wrote:
> > > you can use forFunction instead of hasAncestor(functionDecl(
> > > cxxThrowExpr(stmt(forFunction(isNoThrow() or 
> > > cxxThrowExpr(stmt(forFunction(functionDecl(isNoThrow())))
> > > you can even try to remove stmt.
> > > 
> > > 
> > > Also add test case
> > > 
> > >   void getFunction() noexcept {
> > >    struct X { 
> > >     static void inner()
> > >     {
> > >         throw 42;
> > >     }
> > >    }; 
> > >   }
> > > 
> > Hmm, I wonder if it's trivial enough to filter out throw statements that 
> > are inside a try block scope (even without checking the expression and 
> > catch block types)?
> unless(hasAncestor(cxxTryStmt())) should do the work for almost all cases. 
> Maybe even something like this to catch only valid try blocks
> 
>  cxxThrowExpr(stmt(forFunction(functionDecl(isNoThrow()).bind("func"))),
> unless(hasAncestor(cxxTryStmt().bind("try"), 
> forFunction(hasBody(hasDescendant(equalsBoundNode("try")))))
> 
> + it should check that the throw is not in CXXCatchStmt (unless it is in 
> another try block).
> 
Now even the caught type is checked.


================
Comment at: clang-tidy/misc/ThrowWithNoexceptCheck.h:20
+///\brief Warns about using throw in function declared as noexcept.
+/// It complains about every throw, even if it is caught later.
+class ThrowWithNoexceptCheck : public ClangTidyCheck {
----------------
aaron.ballman wrote:
> sbarzowski wrote:
> > sbarzowski wrote:
> > > vmiklos wrote:
> > > > Prazek wrote:
> > > > > aaron.ballman wrote:
> > > > > > What is the false positive rate with this check over a large 
> > > > > > codebase that uses exceptions?
> > > > > Do you know any good project to check it?
> > > > LibreOffice might be a candidate, see 
> > > > <https://wiki.documentfoundation.org/Development/ClangTidy> for details 
> > > > on how to generate a compile database for it (since it does not use 
> > > > cmake), then you can start testing.
> > > Thanks. However it's not just about using exception. To be meaningful I 
> > > need a project that use noexcept in more than a few places.
> > > 
> > > Here are some projects that I found:
> > > https://github.com/facebook/hhvm/search?utf8=%E2%9C%93&q=noexcept
> > > https://github.com/facebook/folly/search?utf8=%E2%9C%93&q=noexcept
> > > https://github.com/Tencent/mars/search?utf8=%E2%9C%93&q=noexcept
> > > https://github.com/facebook/rocksdb/search?utf8=%E2%9C%93&q=noexcept
> > > https://github.com/CRYTEK-CRYENGINE/CRYENGINE/search?utf8=%E2%9C%93&q=noexcept
> > > https://github.com/SFTtech/openage/search?utf8=%E2%9C%93&q=noexcept
> > > https://github.com/facebook/watchman/search?utf8=%E2%9C%93&q=noexcept
> > > https://github.com/facebook/proxygen/search?utf8=%E2%9C%93&q=noexcept
> > > https://github.com/philsquared/Catch/search?utf8=%E2%9C%93&q=noexcept
> > > https://github.com/sandstorm-io/capnproto/search?utf8=%E2%9C%93&q=noexcept
> > > https://github.com/miloyip/rapidjson/search?utf8=%E2%9C%93&q=noexcept
> > > 
> > > I've tried HHVM so far, and ran into some problems compiling it. Anyway 
> > > I'm working on it.
> > Ok, I was able to run it on most of the HHVM  codebase + deps. There were 
> > some issues that looked like some autogenerated pieces missing, so it may 
> > have been not 100% covered.
> > 
> > The results:
> > 3 occurences in total
> > 1) rethrow in destructor (http://pastebin.com/JRNMZGev)
> > 2) false positive "throw and catch in the same function" 
> > (http://pastebin.com/14y1AJgM)
> > 3) noexcept decided during compilation (http://pastebin.com/1jZzRAbC)
> > 
> > That's not too many, but this is a kind of check that I guess would be most 
> > useful earlier in the development - ideally before the initial code review.
> > 
> > I'm not sure if we should count (3) as false positive. We could potentially 
> > eliminate it, by checking if the expression in noexcept is empty or true 
> > literal.
> > 
> > (2) is def. a false positive. The potential handling of this case was 
> > already proposed, but I'm not sure if it's worth it.  The code in example 
> > (2) is ugly and extracting these throwing parts to separate functions looks 
> > like a good way to start refactoring. 
> > 
> > What do you think?
> > 
> The fact that there's a false positive in the first large project you checked 
> suggests that the false positive is likely worth it to fix. The code may be 
> ugly, but it's not uncommon -- some coding guidelines explicitly disallow use 
> of gotos, and this is a reasonable(ish) workaround for that.
> 
> As for #3, I would consider that to be a false-positive as well. A computed 
> noexcept clause is going to be very common, especially in generic code. I 
> think it's probably more important to get this one right than #2.
I have fixed these issues.


https://reviews.llvm.org/D19201



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

Reply via email to