[cfe-dev] clang-tidy and static analysis for exception safety

Manuel Klimek via cfe-dev cfe-dev at lists.llvm.org
Thu Mar 16 05:32:16 PDT 2017


+mboehme, author of the use-after-move check

On Thu, Mar 16, 2017 at 12:52 PM Jonas Toth <jonas.toth at gmail.com> wrote:

> Ok. So i will try to start with a prototype that can the basic stuff i
> think of. Is there a reference/example i can look into for the flow
> sensitivity? I am not experienced with clang-tidy, but want to become. :)
>
> How would the analysis look like to see if a `catch` will actually catch
> all possible exceptions that could exist in the `try` block? Especially in
> destructors this is interesting for safety.
>
> Am Do, 16. Mär, 2017 um 12:42 schrieb Manuel Klimek <klimek at google.com>:
>
> Yea, none of these seem to be path sensitive, but only flow sensitive,
> which clang-tidy supports.
>
>
> On Thu, Mar 16, 2017 at 12:37 PM Jonas Toth via cfe-dev <
> cfe-dev at lists.llvm.org> wrote:
>
> Why would the second case not be possible?
> What i have in mind by example:
>
> ```
> void definitly_throws() { // should be marked noexcept(false), maybe as
> configuration option
> if (some_condition())
> throw std::logic_error{"Reasons"};
> else
> // do unproblematic stuff
> }
>
> void probably_throws() { // this needs more analysis then AST matching so
> leave it as is
> try {
> // operation
> if (op_failed())
> throw std::runtime_error{"Operation failed"};
> }
> catch (std::runtime_error& e)
> { /* handle */ }
> }
> ```
>
> The second one can be noexcept if the operation will not throw. It is not
> noexcept if operation is not noexcept.
> What did I miss?
>
> The deeper analysis will not happen if the analyser does not see all code,
> but if it can shouldnt there the possibility to decide? Maybe it has bad
> complexity and is therefor not practical. But maybe in some cases there can
> be insight gained?
>
> Am Do, 16. Mär, 2017 um 11:25 schrieb Daniel Marjamäki <
> Daniel.Marjamaki at evidente.se>:
>
> As far as I see:
>
>
>
> - a function calling only `noexcept` operations that does not throw can be
> marked noexcept
>
>
>
> possible
>
>
>
> - a function that has a `throw` statement not within a `try/catch` block
> can be marked noexcept(false)
>
>
>
> Not possible
>
>
>
> - a function calling a function that is not marked noexcept can not be
> marked noexcept
>
>    but it could be noexecpt with deeper analysis on what exception could
> be thrown and what exceptions are handled
>
>
>
> not possible
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170316/eb2891a0/attachment.html>


More information about the cfe-dev mailing list