Issue 162622
Summary [LifetimeSafety] False-negative for std::unique_ptr::get()
Labels clang:temporal-safety
Assignees
Reporter usx95
    ```cpp
#include <iostream>
#include <memory>
#include <string>
#include <string_view>

void bar(bool cond) {
    std::string* ptr;
    if (cond) {
        std::unique_ptr<std::string> owner =
 std::make_unique<std::string>("abcd");
        ptr = owner.get(); // No error. BAD!
    }
    std::cout << *ptr;
}
```

https://godbolt.org/z/bdEcKqqfe

AST:
```
   | `-BinaryOperator <line:11:9, col:25> 'std::string *' lvalue '='
    | |-DeclRefExpr <col:9> 'std::string *' lvalue Var 0x268b1d30 'ptr' 'std::string *'
    |     `-CXXMemberCallExpr <col:15, col:25> 'pointer':'std::basic_string<char> *'
    |       `-MemberExpr <col:15, col:21> '<bound member function type>' .get 0x2693e4c8
    | `-ImplicitCastExpr <col:15> 'const std::unique_ptr<std::basic_string<char>>' lvalue <NoOp>
    |           `-DeclRefExpr <col:15> 'std::unique_ptr<std::string>':'std::unique_ptr<std::basic_string<char>>' lvalue Var 0x268b21c0 'owner' 'std::unique_ptr<std::string>':'std::unique_ptr<std::basic_string<char>>'
 ```
Relevant Facts:
```
    Issue (2 (Path: owner), ToOrigin: 3 (Expr: DeclRefExpr))
    OriginFlow (Dest: 4 (Expr: ImplicitCastExpr), Src: 3 (Expr: DeclRefExpr))
    Use (5 (Decl: ptr), Write)
    OriginFlow (Dest: 5 (Decl: ptr), Src: 6 (Expr: CXXMemberCallExpr))
    Expire (2 (Path: owner))
```
We are missing facts for `CXXMemberCallExpr` and `MemberExpr`. Maybe the `get()` is not being considered **implicitly `lifetimebound`**
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to