[clang] [Clang] Fix stack-use-after-return in TryArrayCopy by allocating OpaqueValueExpr on the ASTContext (PR #192080)

via cfe-commits cfe-commits at lists.llvm.org
Sat May 2 23:54:07 PDT 2026


TPPPP72 wrote:

@AaronBallman

Test on `sqlite`
```
--------------------------------------------------------------------------------
Command:            ./llvm-project/llvm/build/bin/clang-old -c ./sqlite-amalgamation-3530000/sqlite3.c -O2
Massif arguments:   --stacks=yes --depth=20 --massif-out-file=massif.old
ms_print arguments: massif.old
--------------------------------------------------------------------------------


    MB
88.98^                                                                       #
     |   @@                         @                  @@                    #
     |   @                     : :  @::                @       :  :::@:::::::#
     |   @                     :::@@@::               :@     : ::::::@:::::::#
     |   @ :             @::::::::@ @::      ::       :@ :::::@::::::@:::::::#
     |   @ :           ::@::: ::::@ @::::::::: : ::::::@ ::: :@::::::@:::::::#
     |   @ :        ::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |   @ ::     ::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |   @ ::   ::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |   @ ::@@:::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |   @ ::@ :::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |   @ ::@ :::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |   @ ::@ :::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |   @ ::@ :::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |   @ ::@ :::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     | @@@ ::@ :::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |@@ @ ::@ :::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |@@ @ ::@ :::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |@@ @ ::@ :::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
     |@@ @ ::@ :::::::@::@::: ::::@ @:::::: :: :::: :::@ ::: :@::::::@:::::::#
   0 +----------------------------------------------------------------------->Gi
     0                                                                   64.65

Number of snapshots: 74
 Detailed snapshots: [1, 2, 3, 4, 7, 15, 19, 27, 28, 45, 51, 61, 71, 73 (peak)]

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  0              0                0                0             0            0
  1    924,908,989       19,056,504       18,850,990       135,754       69,760
```
```
--------------------------------------------------------------------------------
Command:            ./llvm-project/llvm/build/bin/clang-new -c ./sqlite-amalgamation-3530000/sqlite3.c -O2
Massif arguments:   --stacks=yes --depth=20 --massif-out-file=massif.new
ms_print arguments: massif.new
--------------------------------------------------------------------------------


    MB
88.98^                                                                       #
     |                              @                  @                     #
     |                         :::  @:::               @          :: ::@:::::#
     |                         : :::@: :              :@     :::@::::::@:::::#
     |                   :::::@: :: @: :             ::@:::@@:::@::::::@:::::#
     |                 ::: :: @: :: @: ::::::: : :@@:::@:: @ :::@::::::@:::::#
     |     :         ::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     |   @:::     ::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     |   @:::   ::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     |   @::: ::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     |   @:::@::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     |   @:::@::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     |   @:::@::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     |   @:::@::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     | ::@:::@::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     | : @:::@::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     | @ @:::@::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     | @ @:::@::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     | @ @:::@::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
     | @ @:::@::::::@::::: :: @: :: @: :::: : @:::@ :::@:: @ :::@::::::@:::::#
   0 +----------------------------------------------------------------------->Gi
     0                                                                   64.65

Number of snapshots: 71
 Detailed snapshots: [1, 3, 7, 14, 22, 26, 34, 38, 42, 46, 50, 60, 70 (peak)]

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  0              0                0                0             0            0
  1  1,121,269,254       21,627,304       21,357,911       194,721       74,672
```

Test on this code
```cpp
struct MassiveNode {
    int data[100][100];
};

struct Tester {
    MassiveNode nodes[50];
    Tester() = default;
    Tester(const Tester&) = default;
};

#define REPEAT_10(M, ID) \
    M(ID##0) M(ID##1) M(ID##2) M(ID##3) M(ID##4) \
    M(ID##5) M(ID##6) M(ID##7) M(ID##8) M(ID##9)

#define REPEAT_100(M, ID) \
    REPEAT_10(M, ID##0) REPEAT_10(M, ID##1) REPEAT_10(M, ID##2) REPEAT_10(M, ID##3) REPEAT_10(M, ID##4) \
    REPEAT_10(M, ID##5) REPEAT_10(M, ID##6) REPEAT_10(M, ID##7) REPEAT_10(M, ID##8) REPEAT_10(M, ID##9)

#define REPEAT_1000(M, ID) \
    REPEAT_100(M, ID##0) REPEAT_100(M, ID##1) REPEAT_100(M, ID##2) REPEAT_100(M, ID##3) REPEAT_100(M, ID##4) \
    REPEAT_100(M, ID##5) REPEAT_100(M, ID##6) REPEAT_100(M, ID##7) REPEAT_100(M, ID##8) REPEAT_100(M, ID##9)

#define REPEAT_10000(m, id) \
    REPEAT_1000(m, id##0) REPEAT_1000(m, id##1) REPEAT_1000(m, id##2) REPEAT_1000(m, id##3) REPEAT_1000(m, id##4) \
    REPEAT_1000(m, id##5) REPEAT_1000(m, id##6) REPEAT_1000(m, id##7) REPEAT_1000(m, id##8) REPEAT_1000(m, id##9)

#define TRIGGER_FUNC(ID) \
    Tester trigger_##ID(Tester t) { return t; }

REPEAT_10000(TRIGGER_FUNC, test)
```
```
--------------------------------------------------------------------------------
Command:            ./llvm-project/llvm/build/bin/clang-old -c stress.cpp -O2
Massif arguments:   --stacks=yes --depth=20 --massif-out-file=massif.old
ms_print arguments: massif.old
--------------------------------------------------------------------------------


    MB
56.88^                        #                                               
     |                      : #                                               
     |                    ::::#:                                              
     |        @         :@: ::#:                                              
     |        @        ::@: ::#::                                             
     |        @       :::@: ::#::                                             
     |        @      ::::@: ::#::                                            :
     |        @    ::::::@: ::#::                                            :
     |        @  @@::::::@: ::#::                                            :
     |        @  @ ::::::@: ::#::                                            :
     |        @::@ ::::::@: ::#::                                    ::::::@::
     |        @::@ ::::::@: ::#::                          ::@::::::@::::::@::
     |        @::@ ::::::@: ::#::               :::::::::::::@::::::@::::::@::
     |        @::@ ::::::@: ::#::   :::::::::::@:::: : ::::::@::::::@::::::@::
     |      @:@::@ ::::::@: ::#::::::::::::::::@:::: : ::::::@::::::@::::::@::
     |     @@:@::@ ::::::@: ::#::: ::::::::::::@:::: : ::::::@::::::@::::::@::
     |    :@@:@::@ ::::::@: ::#::: ::::::::::::@:::: : ::::::@::::::@::::::@::
     |   ::@@:@::@ ::::::@: ::#::: ::::::::::::@:::: : ::::::@::::::@::::::@::
     |  @::@@:@::@ ::::::@: ::#::: ::::::::::::@:::: : ::::::@::::::@::::::@::
     |::@::@@:@::@ ::::::@: ::#::: ::::::::::::@:::: : ::::::@::::::@::::::@::
   0 +----------------------------------------------------------------------->Gi
     0                                                                   14.35

Number of snapshots: 77
 Detailed snapshots: [2, 5, 6, 8, 11, 18, 22 (peak), 38, 53, 63, 73]

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  0              0                0                0             0            0
  1    186,864,557        3,485,296        3,336,946        95,382       52,968
  2    477,143,082        6,980,720        6,693,115       219,853       67,752
```
```
--------------------------------------------------------------------------------
Command:            ./llvm-project/llvm/build/bin/clang-new -c stress.cpp -O2
Massif arguments:   --stacks=yes --depth=20 --massif-out-file=massif.new
ms_print arguments: massif.new
--------------------------------------------------------------------------------


    MB
56.88^                        #                                               
     |                      ::#                                               
     |                    ::: #:                                              
     |                   :: : #:                                              
     |                 :::: : #:::                                            
     |                 : :: : #::                                            :
     |               ::: :: : #::                                            :
     |            :::: : :: : #::                                            :
     |            :: : : :: : #::                                            :
     |         :  :: : : :: : #::                                            :
     |         ::::: : : :: : #::                                    :::::@:::
     |         :: :: : : :: : #::                          ::::@::::@: :::@:::
     |         :: :: : : :: : #::              ::::::::::::: ::@::::@: :::@:::
     |         :: :: : : :: : #::    ::::::@@::: ::: : ::::: ::@::::@: :::@:::
     |       :::: :: : : :: : #:: ::::: :::@ ::: ::: : ::::: ::@::::@: :::@:::
     |     @:: :: :: : : :: : #:: :: :: :::@ ::: ::: : ::::: ::@::::@: :::@:::
     |     @:: :: :: : : :: : #:: :: :: :::@ ::: ::: : ::::: ::@::::@: :::@:::
     |   @@@:: :: :: : : :: : #:: :: :: :::@ ::: ::: : ::::: ::@::::@: :::@:::
     |  :@ @:: :: :: : : :: : #:: :: :: :::@ ::: ::: : ::::: ::@::::@: :::@:::
     | ::@ @:: :: :: : : :: : #:: :: :: :::@ ::: ::: : ::::: ::@::::@: :::@:::
   0 +----------------------------------------------------------------------->Gi
     0                                                                   14.40

Number of snapshots: 55
 Detailed snapshots: [3, 4, 16 (peak), 26, 41, 46, 51]

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  0              0                0                0             0            0
  1    286,291,056        4,757,792        4,573,558       138,186       46,048
  2    591,222,234        8,392,712        8,064,059       267,949       60,704
  3    822,224,951       10,865,504       10,439,613       365,299       60,592
```

https://github.com/llvm/llvm-project/pull/192080


More information about the cfe-commits mailing list