<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/139012>139012</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Bytecode Interpreter: Fix IntegralAP/Floating memory leaks
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang:frontend,
clang:bytecode
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
tbaederr
</td>
</tr>
</table>
<pre>
When creating new `IntegralAP` (or also `Floating`) values, they allocate heap memory, which _might_ not get cleaned up when we interrupt interpretation and the integral stays on the stack. We never call the destructor.
This code:
```c++
int ctz48 = __builtin_ctzg((unsigned __int128)0);
```
produces a memory leak:
```
Direct leak of 16 byte(s) in 1 object(s) allocated from:
#0 0x0000003e2c41 in operator new[](unsigned long) (/home/tbaeder/code/llvm-project/build/bin/clang-21+0x3e2c41) (BuildId: 616e3f3e5634af4d767394e4e2f35f78358eaebd)
#1 0x7f05a3cdb67e in getMemory(unsigned int) /home/tbaeder/code/llvm-project/llvm/lib/Support/APInt.cpp:43:10
#2 0x7f05a3cdb78f in llvm::APInt::initSlowCase(llvm::APInt const&) /home/tbaeder/code/llvm-project/llvm/lib/Support/APInt.cpp:87:12
#3 0x7f05dd9c27ea in llvm::APInt::APInt(llvm::APInt const&) /home/tbaeder/code/llvm-project/llvm/include/llvm/ADT/APInt.h:180:7
#4 0x7f05e007a03c in clang::interp::IntegralAP<false>::IntegralAP(llvm::APInt) /home/tbaeder/code/llvm-project/clang/lib/AST/ByteCode/IntegralAP.h:62:25
#5 0x7f05e04e4eb7 in clang::interp::IntegralAP<false> clang::interp::IntegralAP<false>::from<32u, true>(clang::interp::Integral<32u, true>, unsigned int) /home/tbaeder/code/llvm-project/clang/lib/AST/ByteCode/IntegralAP.h:115:12
#6 0x7f05e032b3fc in bool clang::interp::CastAP<(clang::interp::PrimType)4, clang::interp::Integral<32u, true>>(clang::interp::InterpState&, clang::interp::CodePtr, unsigned int) /home/tbaeder/code/llvm-project/clang/lib/AST/ByteCode/Interp.h:2266:7
#7 0x7f05e02679de in clang::interp::EvalEmitter::emitCastAPSint32(unsigned int, clang::interp::SourceInfo const&) /home/tbaeder/code/llvm-project/build/tools/clang/lib/AST/Opcodes.inc:6657:10
```
I think we should allocate the memory ourselves, like `APNumericStorage` does.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0Vk2P4ygT_jXkUpoIg79yyMFJT6Q-vO-2lJHmGGFcjtkmYAFOd-bXr7DztTPbM9ut2SiSMQVVz_NQLkp4r_YGcUmyFckeZmIInXXLUAts0LlZbZvT8muHBqRDEZTZg8EXIDl9NAH3TujqieQUCCutA6G9jbaNtuNaklPCFnAUekBP2BpChycQWlspAkKHoocDHqw7ReNLp2QHu4Pad2EHxgbYYwCpURhsYOjhJeJ4QVAmoHNDH6ZR7zCIoKwBYZoYYpyO2MAHcfJgzTjrg5DPc_iKYPCIDqTQejQ06IMbZLBuTmhFaPWlUx6kbZDw-BppjH9J2Cr-aaVMABm-pSUQ_gC7XT0oHZTZyfBtT1hJWDmYUdkGdjtlQhLnFlENwlf3LgmtemebQaIHcRYDNIrn70ITWj0ohzKMRrAtJDnUp4CElT6KrAwkYOs_UYbL1EXoBlpnD5NDAADCOAX6SscfRybTJG63PToRrIsnPKXDPQ1tzT46HdltOntAwjbnPCFsM6rFNlofD596ZycYmyhLE5_KxDVamP0nlhC2oq9T3LPHVVz32BBeQZ7kyFuOWc5T0aZNkRd8kWKKrOVZW5Q8K1Fg3UQpr3QSoK9FSzPBZVPnRcyAmDz_O-fWjYUyYQr5bxnE1_hQNWGb7dD31sXp6unRhLnse8KrlBNeJfSGht2jKco2ohn98Irwatw6DZVRYavty1r4eI7frQFpjQ-E5b8dcVlExOyGmJ8RN81CsgLFm4in4W-GqozUw9UesT58uSLuItSSEl4VN7zpGS9SWgjKZcQ7ZtdF11gWpvFdneLrVmiPhH_-wfQDo_cRmWJfRK-2Ef7qFHA9rb4FGunkjPCKZZEOYTy7colZXhfv5fIB4lM5WHM2jEXZDaOJlb_w9A9b1vDxT-t9oiVJdk1awnh-VY2zmrdjBtTW6rfUWAsfRiXepvnk1OHLqUfCFmlk9m41fqWh67dBxIqd_8R9ZP8U3H8uretHWRnL88u3RRgvrrKyvFg0-JNk_HwU-vNBhYBumsCDCpPMW2UCZz_U3Tc5b-3gJD6a1n6wkFzumWCt9m_w_6OPe_1cGRm_wTwrLmX7_pIltHqE0CnzHDsN39lBN7eOJXYL5zvaDs6jPk59jVbPGBuf6un_wwGdkttgndhjbI0ai34-a5a8WfCFmOEyKdI8L_IiyWbdMs1KXpQZbWTCsnpRJ20heVpmi5IjazGdqSWjLKMZLSnPSp7NW1qInCLNs5I2WNQkpXgQSs-jJnPr9jPl_YDLhC9owmZa1Kj92N8xdtG_ddYENA1hjLD1nSF2FJPELLaDbjkKXQ97T1KqlQ_-FiaooHG5Ou-Ax0svNuYDbNQr3BfYzaUpvG9y_GxwetmF0PuYCWxD2GavQjfUc2kPd5fZ3497JBjP-czxuGR_BQAA__-8C1Ys">