<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/83040>83040</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Crash in install_bad_alloc_error_handler
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
fabianbs96
</td>
</tr>
</table>
<pre>
The function `install_bad_alloc_error_handler` asserts that a bad_alloc error handler is not already installed.
However, it actually checks for the fatal-error handler, not for the bad_alloc error handler, causing an assertion failure if a fatal-error handler is already installed.
Correct behavior would be to only crash if a bad_alloc handler is already installed, making it independent from fatal-error handlers.
Minimal working example:
```C++
#include <llvm/Support/ErrorHandling.h>
int main() {
llvm::install_fatal_error_handler([](void*,const char*,bool){});
llvm::install_bad_alloc_error_handler([](void*,const char*,bool){}); // <-- Crash occurs here
}
```
Propsed Fix:
```Diff
diff --git a/llvm/lib/Support/ErrorHandling.cpp b/llvm/lib/Support/ErrorHandling.cpp
index b8b3b7424ac6..c268543eb1fd 100644
--- a/llvm/lib/Support/ErrorHandling.cpp
+++ b/llvm/lib/Support/ErrorHandling.cpp
@@ -130,7 +130,7 @@ void llvm::install_bad_alloc_error_handler(fatal_error_handler_t handler,
#if LLVM_ENABLE_THREADS == 1
std::lock_guard<std::mutex> Lock(BadAllocErrorHandlerMutex);
#endif
- assert(!ErrorHandler && "Bad alloc error handler already registered!\n");
+ assert(!BadAllocErrorHandler && "Bad alloc error handler already registered!\n");
BadAllocErrorHandler = handler;
BadAllocErrorHandlerUserData = user_data;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVV9v6rgT_TTDywiU2EkgDzwAAfWh_emnvXf3FU1ih3hrbGQ7_fPtV07Slr1L76pXK1koOMdnjmfOTMh7dTJSriHfQl7NqA-ddeuWakWm9mUxq614XX_vJLa9aYKyBqFIlPGBtD7WJI6ktW2O0jnrjh0ZoaWDIkHyXrrgMXQUkPAdiQMSJyQqj8YGJO0kiVeciKVYICQVJJs7-yyfpAO2QxWQmtCT1q_YdLJ59NhahyFqo0B6_jfmeCIyv0E-ERBhDfVemROSmVTHW7akdO8kqhbpFn9U_k_Vo-iddU42AWvZ0ZOyDp9trwXWEoNFa6J-R74buT-E_Yw56jzTY5SpAioj5EUaIU3A1tnzLYF-EjP-PiijzqTx2bqBRL7Q-aIl8A1ew6BIxrUDto1r3GVcmUb3QiLwndZPZ2CHb_3lYl0AdtjHsHcxqjKnRQd8f02pTMAzKQNsBaxEWE6kOPDwDfDNm52GW_xgJbYarQls9WSVALYBtmus8QGbjtz4v7ZWAysj97KKD_zzIJ959lcDIbADsEPMzHyOu6Gwtml657GTTk6pWFY_JPg6Rf939uKlwIN6iVpv1aNSbTtuCdW2OJ-fYjsAO0zV0Kr-SU2aywXrL4DfKifkC9armtfLjGXUFItFw4pVnnFZp63ANEmKLBvB8_n8S3renLUd1y_IgyyBLMF5yhNguyUC274_jq9iHb_kgBsGPIarUTGZKvZDi_f3fzwc9__bbO_3x-93v-031TcEXgGvMJ2AiD6IMbi2zePx1JMTwHfvu-c-yBfge7y3zSOw1ZbEJir7uLJ0DwPm2tTAuDRCTYaY4zS2hg5Lr48isAJYgcDYlgTeGsBvk8bJk_JBujhqUsh3Bhi7DhprdB3mltL_MBwi3o7Aq_d6vGNvIX_30lUUaDjRe-mOggJd5fCTjpyJNRclL2km1-kyWZVFWaZs1q1XiRSsTMss50XO0jwvJKs5FZQ1JU8Lmqk1S1iWMFakyzzN00VeUtKskpRywfNccMgSeSalF9GSC-tOM-V9L9crnmTJTFMttR8-xIwZ-YzDy5iWvJq5dTwzr_uThyzRygf_wRJU0HI9Th5l8F9sPuudXnchXHy04DC7Tip0fb1o7PmqCWO8i7N_yib24CDGAzsMYv8KAAD__8hKllE">