【问题标题】:SIGABRT when returning from function从函数返回时的 SIGABRT
【发布时间】:2017-08-24 19:42:09
【问题描述】:

我的问题是,正如我在标题中提到的那样,我有一个函数,在返回时会引发 SIGABRT。我在我的程序上运行了 valgrind,并在那个时候得到了这个。

==5807== Process terminating with default action of signal 6 (SIGABRT)
==5807==    at 0x52F5428: raise (raise.c:54)
==5807==    by 0x52F7029: abort (abort.c:89)
==5807==    by 0x53377E9: __libc_message (libc_fatal.c:175)
==5807==    by 0x53D911B: __fortify_fail (fortify_fail.c:37)
==5807==    by 0x53D90BF: __stack_chk_fail (stack_chk_fail.c:28)
==5807==    by 0x402E8B: foo (file.c:43)
==5807==    by 0x202C27323939312C: ???
==5807==    by 0x592D4D4D2D444426: ???
==5807==    by 0x66202C2927595958: ???
==5807==    by 0x2965736C60: ???
==5807==    by 0x505770F: ??? (in /usr/lib/x86_64-linux-gnu/libodbc.so.2.0.0)

==5807==

这是我正在执行的代码,堆栈错误导致 add_user 的 return ret 语句中止:

int add_user(SQLHDBC dbc, char * mail, char * password, char * name,  char * date) {

char query[TAM];
SQLHSTMT stmt;
SQLRETURN ret;

if (mail == NULL || password == NULL || name == NULL ||  date == NULL)
    return ERR;

sprintf(query, "INSERT INTO mms_user values (default,'%s',encrypt_password('%s'),set_type(),'%s',to_date('%s', 'DD-MM-YYYY'), false)", mail, password, name,date);

ret= DBExecuteQuery(dbc, query, &stmt);

DBFreeHandle(&stmt);
return ret;
}

int DBExecuteQuery(SQLHDBC dbc, char * query, SQLHSTMT *stmt) {

SQLRETURN ret;

/*Error control*/
if (query == NULL || stmt == NULL)
    return ERR;

/*Allocates memory for a new statement*/
ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, stmt);
if (!SQL_SUCCEEDED(ret)) {
    return ERR;
}

/*Executes query and stores result in stmt*/
ret = SQLExecDirect(*stmt, (SQLCHAR *)query, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
    return ERR;

return OK;

}

int DBFreeHandle(SQLHSTMT * stmt){

 int ret;
  /*Frees allocated memory*/
  ret = SQLFreeHandle(SQL_HANDLE_STMT, *stmt);
  if (!SQL_SUCCEEDED(ret)) {
      return ERR;
  }

}

据我检查,该函数正常执行。我不知道会发生什么,如果你们中的任何人都可以提供任何可能的解释,我将非常感激。也可以随时询问更多信息(这是我被教导要寻找的唯一有用信息,所以在这种情况下我可能需要一些指导)。

提前谢谢你

【问题讨论】:

  • 你能构造一个minimal reproducible example吗?
  • 你正在破坏函数中的堆栈... 堆栈溢出.
  • 发生的事情是你的函数有一个错误,它会损坏堆栈,很可能你的代码正在写入超出数组的边界。如果您需要进一步的帮助,您需要向我们展示该代码。
  • char query[TAM]; ... sprintf(query, "INSERT INTO mms_user values (default,'%s',encrypt_password('%s'),set_type(),'%s',to_date('%s', 'DD-MM-YYYY'), false)", mail, password, name,date);?!?!?!根本没有边界检查?
  • 每当您想编写一些从 C 代码运行 SQL 查询的代码时,都会停下来一秒钟,并考虑您在前世是否做出了错误的选择。

标签: c return callstack sigabrt


【解决方案1】:

这段代码很危险:

char query[TAM];
 .
 .
 .
sprintf(query, "INSERT INTO mms_user values"
    " (default,'%s',encrypt_password('%s'),set_type(),"
    "'%s',to_date('%s', 'DD-MM-YYYY'), false)",
     mail, password, name,date);

你绝对不做边界检查,所以它很容易溢出你的堆栈。

【讨论】:

  • 检查输入不为 NULL。我还没有添加参数检查功能(我还检查了边界)。谢谢,这就是问题所在。
  • @RobertoSánchez 已修复。对不起。我把它和我正在审查的其他代码混淆了。人类的思维并不意味着多任务,无论任何人告诉你什么......
猜你喜欢
  • 2020-09-22
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 2016-08-28
  • 2013-03-31
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
相关资源
最近更新 更多