RedDocMD added a comment.

The current implementation of how notes are emitted in `handleSwap` is broken. 
Consider the following code:

  #include <memory>
  
  void foo() {
    auto ptr1 = std::unique_ptr<int>(new int(10));
    auto ptr2 = std::unique_ptr<int>(new int(13));
    ptr1.swap(ptr2);
    ptr1.reset();
    *ptr1;
  }

This yields the following  warning and notes:

  swap-and-reset.cpp:8:3: warning: Dereference of null smart pointer 'ptr1' 
[alpha.cplusplus.SmartPtr]
    *ptr1;
    ^~~~~
  swap-and-reset.cpp:4:36: note: Assigning 10
    auto ptr1 = std::unique_ptr<int>(new int(10));
                                     ^~~~~~~~~~~
  swap-and-reset.cpp:4:15: note: Smart pointer 'ptr1' is constructed
    auto ptr1 = std::unique_ptr<int>(new int(10));
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  swap-and-reset.cpp:5:36: note: Assigning 13
    auto ptr2 = std::unique_ptr<int>(new int(13));
                                     ^~~~~~~~~~~
  swap-and-reset.cpp:5:15: note: Smart pointer 'ptr2' is constructed
    auto ptr2 = std::unique_ptr<int>(new int(13));
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  swap-and-reset.cpp:6:3: note: Swapped null smart pointer 'ptr2' with smart 
pointer 'ptr1'
    ptr1.swap(ptr2);
    ^~~~~~~~~~~~~~~
  swap-and-reset.cpp:7:3: note: Smart pointer 'ptr1' reset using a null value
    ptr1.reset();
    ^~~~~~~~~~~~
  swap-and-reset.cpp:8:3: note: Dereference of null smart pointer 'ptr1'
    *ptr1;
    ^~~~~

But clearly, `ptr2` is not null.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D104300/new/

https://reviews.llvm.org/D104300

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to