Karthik, this seems pretty obvious, but can you check that this is the intended way to get the location of the destructor call triggered by 'delete'? (And that that's the most appropriate location.)
Jordan On Oct 31, 2013, at 11:41 , Jordan Rose <[email protected]> wrote: > Author: jrose > Date: Thu Oct 31 13:41:15 2013 > New Revision: 193783 > > URL: http://llvm.org/viewvc/llvm-project?rev=193783&view=rev > Log: > [analyzer] Don't crash when a path goes through a 'delete' destructor call. > > This was just left unimplemnted from r191381; the fix is to report this call > location as the location of the 'delete' expr. > > PR17746 > > Modified: > cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp > cfe/trunk/test/Analysis/inlining/path-notes.cpp > > Modified: cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp?rev=193783&r1=193782&r2=193783&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp Thu Oct 31 13:41:15 > 2013 > @@ -560,7 +560,8 @@ getLocationForCaller(const StackFrameCon > SM, CallerCtx); > } > case CFGElement::DeleteDtor: { > - llvm_unreachable("not yet implemented!"); > + const CFGDeleteDtor &Dtor = Source.castAs<CFGDeleteDtor>(); > + return PathDiagnosticLocation(Dtor.getDeleteExpr(), SM, CallerCtx); > } > case CFGElement::BaseDtor: > case CFGElement::MemberDtor: { > > Modified: cfe/trunk/test/Analysis/inlining/path-notes.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/inlining/path-notes.cpp?rev=193783&r1=193782&r2=193783&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/inlining/path-notes.cpp (original) > +++ cfe/trunk/test/Analysis/inlining/path-notes.cpp Thu Oct 31 13:41:15 2013 > @@ -274,6 +274,30 @@ int callGenerateNoteOnDefaultArgument(in > //expected-note@-1 {{Passing the > value 0 via 2nd parameter 'two'}} > } > > +namespace PR17746 { > + class Inner { > + public: > + ~Inner() { > + *(volatile int *)0 = 1; // expected-warning {{Dereference of null > pointer}} > + // expected-note@-1 {{Dereference of null pointer}} > + } > + }; > + > + class Outer { > + public: > + Inner *inner; > + ~Outer() { > + delete inner; > + // expected-note@-1 {{Calling '~Inner'}} > + } > + }; > + > + void test(Outer *outer) { > + delete outer; > + // expected-note@-1 {{Calling '~Outer'}} > + } > +} > + > // CHECK: <key>diagnostics</key> > // CHECK-NEXT: <array> > // CHECK-NEXT: <dict> > @@ -4973,4 +4997,236 @@ int callGenerateNoteOnDefaultArgument(in > // CHECK-NEXT: <key>file</key><integer>0</integer> > // CHECK-NEXT: </dict> > // CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>path</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>kind</key><string>event</string> > +// CHECK-NEXT: <key>location</key> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>296</integer> > +// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <key>ranges</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>296</integer> > +// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>296</integer> > +// CHECK-NEXT: <key>col</key><integer>16</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: <key>depth</key><integer>0</integer> > +// CHECK-NEXT: <key>extended_message</key> > +// CHECK-NEXT: <string>Calling '~Outer'</string> > +// CHECK-NEXT: <key>message</key> > +// CHECK-NEXT: <string>Calling '~Outer'</string> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>kind</key><string>event</string> > +// CHECK-NEXT: <key>location</key> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>289</integer> > +// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <key>depth</key><integer>1</integer> > +// CHECK-NEXT: <key>extended_message</key> > +// CHECK-NEXT: <string>Entered call from 'test'</string> > +// CHECK-NEXT: <key>message</key> > +// CHECK-NEXT: <string>Entered call from 'test'</string> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>kind</key><string>control</string> > +// CHECK-NEXT: <key>edges</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>start</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>289</integer> > +// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>289</integer> > +// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: <key>end</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>290</integer> > +// CHECK-NEXT: <key>col</key><integer>7</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>290</integer> > +// CHECK-NEXT: <key>col</key><integer>12</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>kind</key><string>event</string> > +// CHECK-NEXT: <key>location</key> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>290</integer> > +// CHECK-NEXT: <key>col</key><integer>7</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <key>ranges</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>290</integer> > +// CHECK-NEXT: <key>col</key><integer>7</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>290</integer> > +// CHECK-NEXT: <key>col</key><integer>18</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: <key>depth</key><integer>1</integer> > +// CHECK-NEXT: <key>extended_message</key> > +// CHECK-NEXT: <string>Calling '~Inner'</string> > +// CHECK-NEXT: <key>message</key> > +// CHECK-NEXT: <string>Calling '~Inner'</string> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>kind</key><string>event</string> > +// CHECK-NEXT: <key>location</key> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>280</integer> > +// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <key>depth</key><integer>2</integer> > +// CHECK-NEXT: <key>extended_message</key> > +// CHECK-NEXT: <string>Entered call from '~Outer'</string> > +// CHECK-NEXT: <key>message</key> > +// CHECK-NEXT: <string>Entered call from '~Outer'</string> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>kind</key><string>control</string> > +// CHECK-NEXT: <key>edges</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>start</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>280</integer> > +// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>280</integer> > +// CHECK-NEXT: <key>col</key><integer>5</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: <key>end</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>281</integer> > +// CHECK-NEXT: <key>col</key><integer>7</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>281</integer> > +// CHECK-NEXT: <key>col</key><integer>7</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>kind</key><string>control</string> > +// CHECK-NEXT: <key>edges</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>start</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>281</integer> > +// CHECK-NEXT: <key>col</key><integer>7</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>281</integer> > +// CHECK-NEXT: <key>col</key><integer>7</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: <key>end</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>281</integer> > +// CHECK-NEXT: <key>col</key><integer>26</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>281</integer> > +// CHECK-NEXT: <key>col</key><integer>26</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>kind</key><string>event</string> > +// CHECK-NEXT: <key>location</key> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>281</integer> > +// CHECK-NEXT: <key>col</key><integer>26</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <key>ranges</key> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <array> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>281</integer> > +// CHECK-NEXT: <key>col</key><integer>7</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>281</integer> > +// CHECK-NEXT: <key>col</key><integer>28</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: <key>depth</key><integer>2</integer> > +// CHECK-NEXT: <key>extended_message</key> > +// CHECK-NEXT: <string>Dereference of null pointer</string> > +// CHECK-NEXT: <key>message</key> > +// CHECK-NEXT: <string>Dereference of null pointer</string> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </array> > +// CHECK-NEXT: <key>description</key><string>Dereference of null > pointer</string> > +// CHECK-NEXT: <key>category</key><string>Logic error</string> > +// CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> > +// CHECK-NEXT: <key>issue_hash</key><string>1</string> > +// CHECK-NEXT: <key>location</key> > +// CHECK-NEXT: <dict> > +// CHECK-NEXT: <key>line</key><integer>281</integer> > +// CHECK-NEXT: <key>col</key><integer>26</integer> > +// CHECK-NEXT: <key>file</key><integer>0</integer> > +// CHECK-NEXT: </dict> > +// CHECK-NEXT: </dict> > // CHECK-NEXT: </array> > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
