*** 检测到堆栈粉碎 *** 在使用 FEAST 的函数的 return 处出现错误
*** stack smashing detected *** error at the return of a function using FEAST
我有一个很长的程序,其中有一个函数可以使用 FEAST 计算大型矩阵的特征值。就在该函数的 return 处,我收到 * stack smashing detected * 错误,我丢失了所有结果。这是我的函数
void Model::eigensolver(double* val, int* ia, int* ja, const int n, int m0, std::string outfilename)
{
// compute Eigenvalues and Eigenvectors by calling FEAST library from MKL
const char uplo='U';
MKL_INT fpm[128], loop;
feastinit(fpm);
//fpm[0]=1;
const double emin=-1,emax=100;
MKL_INT eig_found=0;
double res,epsout;
double *eigenvalues= new double [m0];
double *eig_vec = new double [m0*_dof];
int info;
std::cout << "Everything ready, making call to FEAST." << std::endl;
dfeast_scsrev(&uplo, &n, val, ia, ja, fpm, &epsout, &loop, &emin, &emax, &m0, eigenvalues, eig_vec, &eig_found, &res, &info );
if (info != 0) {
std::cout << "Something is wrong in eigensolver. Info=" << info << std::endl;
exit(0);
}
std::cout << loop << " iterations taken to converge." << std::endl;
std::cout << eig_found << " eigenvalues found in the interval." << std::endl;
std::ofstream evals;
evals.open("evals.dat");
std::cout<<"The eigenfrequencies are:"<<std::endl;
for (int i = 0; i < eig_found; i++)
evals << eigenvalues[i] << std::endl;
evals.close();
delete[] eigenvalues;
delete[] eig_vec;
std::cout << "Writen eigenvalues to file evals.dat." << std::endl;
return;
}
dfeast_scsrev 是来自 FEAST 库(也是英特尔 MKL 的一部分)的函数。错误发生在 return 处(即在 "Written eigenvalues to file evals.dat." 正在打印之后)。根据我遇到的问题 运行,有时我也会在同一点出现分段错误。
如果我删除 FEAST 函数调用,则没有错误。所以,我很困惑我做错了什么。我正在尝试 valgrind,但由于我的代码的大小,运行.
需要很长时间
查看 https://software.intel.com/en-us/node/521749 的文档,我发现 res
应该指向 "Array of length m0"。你的 res
只有一个 double
。当然,dfeast_scsrev不知道这一点,高兴地越界写,把你的栈给毁了。
所以修复是:
double *res = new double [m0];
而不是 double res;
我有一个很长的程序,其中有一个函数可以使用 FEAST 计算大型矩阵的特征值。就在该函数的 return 处,我收到 * stack smashing detected * 错误,我丢失了所有结果。这是我的函数
void Model::eigensolver(double* val, int* ia, int* ja, const int n, int m0, std::string outfilename)
{
// compute Eigenvalues and Eigenvectors by calling FEAST library from MKL
const char uplo='U';
MKL_INT fpm[128], loop;
feastinit(fpm);
//fpm[0]=1;
const double emin=-1,emax=100;
MKL_INT eig_found=0;
double res,epsout;
double *eigenvalues= new double [m0];
double *eig_vec = new double [m0*_dof];
int info;
std::cout << "Everything ready, making call to FEAST." << std::endl;
dfeast_scsrev(&uplo, &n, val, ia, ja, fpm, &epsout, &loop, &emin, &emax, &m0, eigenvalues, eig_vec, &eig_found, &res, &info );
if (info != 0) {
std::cout << "Something is wrong in eigensolver. Info=" << info << std::endl;
exit(0);
}
std::cout << loop << " iterations taken to converge." << std::endl;
std::cout << eig_found << " eigenvalues found in the interval." << std::endl;
std::ofstream evals;
evals.open("evals.dat");
std::cout<<"The eigenfrequencies are:"<<std::endl;
for (int i = 0; i < eig_found; i++)
evals << eigenvalues[i] << std::endl;
evals.close();
delete[] eigenvalues;
delete[] eig_vec;
std::cout << "Writen eigenvalues to file evals.dat." << std::endl;
return;
}
dfeast_scsrev 是来自 FEAST 库(也是英特尔 MKL 的一部分)的函数。错误发生在 return 处(即在 "Written eigenvalues to file evals.dat." 正在打印之后)。根据我遇到的问题 运行,有时我也会在同一点出现分段错误。
如果我删除 FEAST 函数调用,则没有错误。所以,我很困惑我做错了什么。我正在尝试 valgrind,但由于我的代码的大小,运行.
需要很长时间查看 https://software.intel.com/en-us/node/521749 的文档,我发现 res
应该指向 "Array of length m0"。你的 res
只有一个 double
。当然,dfeast_scsrev不知道这一点,高兴地越界写,把你的栈给毁了。
所以修复是:
double *res = new double [m0];
而不是 double res;