r193783 - [analyzer] Don't crash when a path goes through a 'delete' destructor call.
Jordan Rose
jordan_rose at apple.com
Thu Oct 31 11:54:42 PDT 2013
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 <jordan_rose at apple.com> 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 at -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 at -1 {{Dereference of null pointer}}
> + }
> + };
> +
> + class Outer {
> + public:
> + Inner *inner;
> + ~Outer() {
> + delete inner;
> + // expected-note at -1 {{Calling '~Inner'}}
> + }
> + };
> +
> + void test(Outer *outer) {
> + delete outer;
> + // expected-note at -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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list