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