<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/137252>137252</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [StaticAnalyzer]  A Static Analyzer bug related to initializing [[__no_unique_address__]] fields
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:static analyzer
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          ziqingluo-90
      </td>
    </tr>
</table>

<pre>
    Hi Static Analyzer Developers,

I was investigating a downstream bug arose from C++ standard library changes. 
There is a minimal reproducer:
```
namespace std {
  struct default_delete {
  };

  template <class _Tp, class _Dp = default_delete >
  class unique_ptr {
    [[__no_unique_address__]]  _Tp * __ptr_;
 [[__no_unique_address__]] _Dp __deleter_;

  public:
    explicit unique_ptr(_Tp* __p) noexcept
      : __ptr_(__p),
        __deleter_() {}

    ~unique_ptr() {
      delete __ptr_;
    }
  };
}

struct X {};

int main()
{
    std::unique_ptr<X> a(new X());          // leak reported 
 return 0;
}
```

>From what I observed,  the two fields `__ptr_` and `__deleter_`  have overlapping `MemRegion`s (Same base and both have 0 offset) because of `[[no_unique_address]]`.    Then, at the `unique_ptr` constructor call, CSA simulates the following two steps: 
1. assigning `__p` to `__ptr_`; and then 
2. assigning `0` to `__deleter_`.  

Since the two fields have overlapping `MemRegion`s, the second assignment removes the binding of `__ptr_`.  So later the destructor is not able to `delete` the allocated object properly.  Resulting a false leak report.

If one removes `[[no_unique_address]]` from `__deleter_`'s declaration, the false report goes away.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMVUGT2jgT_TXi0hWXkMGGAwcDob4cvksmh9yottXY2pUlR5Ihk8P-9i1ZhmVmDomLKgqs7n7v9VM3eq9aQ7Rj6z1bHxc4hs663S_1Q5lWj_bTli9qK193_1PwEjCoBiqD-vUXOTjSlbQdyHkmDoxXjFdf4IYelLmSD6rFoEwLCNLejA-OsId6bAGd9QQXZ3s4MLFnYg8-oJHoJGhVO3Sv0HRoWvIZMF5968gRKA8IvTKqRw2OBmfl2JBjeazLCj5_eGWwJz9gQ-CDBFbuGa8AfHBjE0DSBUcdzpI0BXq8ZeWR5fvEASBQP2iMr_NDo9F7OH8bmDjA_OM4AMuPH3Lln6fodGg06sdI5yG4RxGASeT9-WzseX6PUjry_nxm6yNbHyFWAiYqOMfQcwL1B3ER03lGcg-big5jrVWTVIoQ6OegVaPCE0AmNhO_qSgTWzCWfjY0hDkEgOUPQGKTDqWWw_w8lRabmCJyLo93EAD_vCl3P3FPMCv4hjOkrrztzj3l3M3v9zp3vsoE6FGZVGOKuCfzQUYV8uoJSX74zvLPgExsDN3g-xwmtizfw-Nh4sTECTTh39F41gWS0ZfgKIzOAH8D7smJjFen6PJbhwG-gK09uSvJ6CQIHUG4Wbgo0tIDK_jMvuCARqY_HqIWHKDDK4G9ktM4DPFisYL_n_qv1CprWME9MLF5wZ6gRk9TktqGLsVxsJeLpxCVr6nB0RPYS0yRvPXBWclXrOBZlOBbRybCxjABZwV_UrHg0FiTWmIdNKh1PHt4qcCrfow3yU9hF6u1vUXokbkPNPjoLMarZQZpEs28oscKDsG-ESZ2JdIKHZkYJd5F8eeYJ-0ygNSNF2Uaei_9b3WNZGKMp8YaOZfsyQRw1NvrTK5WRsbopOoDcwbwYiFq4KZjkh5CKQ_GBsBa04w6YZ5YdASotW0wms3Wf1ETYHBx2urXDOAr-VHP4_WC2tOzPbN5GF_AGnqA_INep6H8Xj4mSg-SGo0OQ9Rk1iPVTSWhteQBb_iaLeQul9t8iwvaLcvVep3zslguul1NF07r1bLc5HUpl9SsikKUtaiXsiRqyoXaCS7WfCVWYplvxTKrS1GXBZWrzXpNPM_ZilOPSmdaX_vMunahvB9pt8xLsRYLjTVpP60yIRqNpmV55dPWwnlrMSHinnO7mOJTPbaerbhWPvj_kgYV9LQR08a7L7xpPlcf1mBcaY701KhgQRkVFGr1a7LSbwd3MuFidHrXhTBdiDRvWhW6sc4a2zNxitDmr0-Ds9ENTJwm8p6J08z_uhP_BgAA__9UF3YR">