This issue is a result of a Codex global repository scan.
ESolver_OF::before_all_runners() deletes kedf_manager_ with delete[], but the pointer is allocated with scalar new KEDF_Manager() and the destructor uses scalar delete. Re-entering this setup path can therefore invoke undefined behavior / heap corruption.
Declaration:
|
protected: |
|
// ======================= variables ========================== |
|
// ---------- the kinetic energy density functionals ---------- |
|
KEDF_Manager* kedf_manager_ = nullptr; // KEDF manager, which will be initialized in before_all_runners |
|
|
Destructor and reinitialization path:
|
delete this->ptemp_rho_; |
|
|
|
delete this->kedf_manager_; |
|
|
|
delete[] this->kedf_manager_; |
|
this->kedf_manager_ = new KEDF_Manager(); |
|
this->kedf_manager_->init(inp, this->pw_rho, this->dV_, this->nelec_[0]); |
Relevant code:
KEDF_Manager* kedf_manager_ = nullptr;
...
delete this->kedf_manager_;
...
delete[] this->kedf_manager_;
this->kedf_manager_ = new KEDF_Manager();
Suggested fix:
Use scalar delete in before_all_runners(), set the pointer to nullptr after deletion, or replace this raw owner with std::unique_ptr<KEDF_Manager>.
This issue is a result of a Codex global repository scan.
ESolver_OF::before_all_runners()deleteskedf_manager_withdelete[], but the pointer is allocated with scalarnew KEDF_Manager()and the destructor uses scalardelete. Re-entering this setup path can therefore invoke undefined behavior / heap corruption.Declaration:
abacus-develop/source/source_esolver/esolver_of.h
Lines 30 to 34 in 84ca04b
Destructor and reinitialization path:
abacus-develop/source/source_esolver/esolver_of.cpp
Lines 51 to 54 in 84ca04b
abacus-develop/source/source_esolver/esolver_of.cpp
Lines 122 to 124 in 84ca04b
Relevant code:
Suggested fix:
Use scalar
deleteinbefore_all_runners(), set the pointer tonullptrafter deletion, or replace this raw owner withstd::unique_ptr<KEDF_Manager>.