[cfe-dev] Analyzer - CXXDestructorCall functioning
Artem Dergachev via cfe-dev
cfe-dev at lists.llvm.org
Tue Aug 30 04:09:56 PDT 2016
In this case the call event is missing because A is Plain Old Data and
needs no destructor. Even in -ast-dump, i don't see the destructor
declaration, so assuming the dump is complete, i guess your
dyn_cast<CXXDestructorDecl> is bound to fail. If you add, say, "~A(){}"
to the class definition, the callback starts firing.
However, there might be more bugs in the area of destructors, especially
when it comes to temporary objects.
The documentation you quoted sounds strange - at least, i expect this
call event to work for *explicit* destructors.
On 8/30/16 12:06 PM, Péter Szécsi via cfe-dev wrote:
> Hi!
>
> I was implementing a SA checker when I ran into the next (problem?) :
> Whenever I write a callback PostCall/PreCall with the next body:
>
> {
> if (dyn_cast<CXXDestructorCall>(&Call))
> llvm::errs() << "DtorCall\n";
>
> if (dyn_cast<CXXDestructorDecl>(Call.getDecl()))
> llvm::errs() << "DtorDecl\n";
>
> return;
> }
>
> Then I could not find a case where the cast to CXXDestructorCall is
> successful.
> Running this simple "checker" on the *below example emitted no output*
> to errs:
>
> class A {
> };
> int main()
> {
> A a;
> {
> A b;
> }
> }
>
> However if change the inner block this way:
> {
> A b;
> b.~A();
> }
> then "DtorDecl" is displayed which makes sense.
>
> The detailed description of the CXXDestructorCall says:
>
> Represents an implicit call to a C++ destructor.
>
> This *can* occur at the end of a scope (for automatic objects), at
> the end of a full-expression (for temporaries), or as part of a
> delete.
>
> My question is: Does "can" mean in this context that the callback is
> quite unreliable even in trivial cases or is it a bug and the
> destructor call should trigger?
>
> Thanks,
>
> Peter
More information about the cfe-dev
mailing list