[cfe-dev] undefbehavior.ExitInDtor
Alexander Kornienko
alexfh at google.com
Tue Feb 10 19:00:36 PST 2015
On Tue, Feb 3, 2015 at 1:26 AM, Richard <legalize at xmission.com> wrote:
>
> In article <8761bjucor.fsf at fx.delysid.org>,
> Mario Lang <mlang at delysid.org> writes:
>
> > The List of potential checkers[1] posted recently contains this item,
> > which looked like a low hanging fruit, ideal for getting my feet wet
> > with matchers:
> >
> > Undefined behavior: std::exit() is called to end the program during
> > the destruction of an object with static storage duration.
> >
> > Source: C++11 3.6.1p4.
> >
> > #include <cstdlib>
> >
> > class A {
> > public:
> > ~A() {
> > std::exit(1); // warn
> > }
> > };
>
> Don't forget that you also need:
>
> static A a;
>
> > I took this as an exercise, and was very surprised to see how easy this
> > was to do, and how little time it took to get done, given that my
> > experience with the AST prior to yesterday was virtually zero.
>
> Yeah, it's fun playing with matchers and the AST!
>
> > I have two questions:
> >
> > 1. What would be an approriate name / category for this check?
> > 2. Is it worth submitting?
>
> The answer to your second question is yes.
>
> I'm unsure if this should be in clang-tidy or the static analyzer.
Proper implementation of this check needs some inter-function flow analysis
(consider exit() called indirectly from a destructor of a global object)
which may be non-trivial (if even possible) to implement statically. If you
want to limit the scope of the check to direct calls to exit() from a
global destructor, it should be easy to do in both clang-tidy and static
analyzer. I suspect, that an ast matcher-based implementation could be
easier to write, so it may be somewhat more convenient to add a check to
clang-tidy.
Maybe adding a dynamic check to ubsan (-fsanitize=undefined) also makes
sense. Richard, WDYT?
> I
> am still unclear which checks should go where. This one feels
> slightly more like the static analyzer should get it instead of
> clang-tidy.
>
> clang-tidy web page says:
>
> "clang-tidy is a clang-based C++ linter tool. Its purpose is to
> provide an extensible framework for diagnosing and fixing typical
> programming errors, like style violations, interface misuse, or
> bugs that can be deduced via static analysis."
>
> First, we don't have an automatic "fix" we can apply to correct the
> problem.
>
> Second, we are detecting undefined behavior, which isn't in the spirit
> of a style violation or interface misuse.
>
> Third, my gut feeling is that clang's static analyzer has more regular
> usage than clang-tidy and we'd like checks for undefined behavior to
> find their way into as many hands as possible.
>
> Finally, this is just my opinion so try and get some guidance from
> someone that is a regular contributor to the static analyzer for
> better advice :-).
>
I have a feeling that static analyzer is more suitable for path-sensitive
checks. Everything that is expressible in terms of AST is probably easier
to implement in clang-tidy. Also, static analyzer doesn't have a way to
provide automated fixes, so all checks that could provide fixes are usually
more suitable for clang-tidy.
> --
> "The Direct3D Graphics Pipeline" free book <
> http://tinyurl.com/d3d-pipeline>
> The Computer Graphics Museum <http://ComputerGraphicsMuseum.org>
> The Terminals Wiki <http://terminals.classiccmp.org>
> Legalize Adulthood! (my blog) <http://LegalizeAdulthood.wordpress.com>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
--
Alex
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150211/2a38087e/attachment.html>
More information about the cfe-dev
mailing list