SIGABRT从函数返回
问题描述:
我的问题是,就像我在标题中提到的那样,我有一个函数,返回时会导致SIGABRT被引发。我在我的程序中运行了valgrind,并且在那个确切点上得到了这个结果。SIGABRT从函数返回
==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==
这是我正在执行的代码,堆栈错误会导致在返回RET语句中止从ADD_USER:
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;
}
}
函数执行正常,据我已经检查。我不知道会发生什么,如果你们中的任何一个人能够提供任何可能的解释,我会非常感激。也可以随时索取进一步的信息(这是我教过的唯一有用的信息,因此在这种情况下我可能需要一些指导)。
预先感谢您
答
此代码是危险的:
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);
你这样做完全没有边界检查,所以它会很容易溢出你的筹码。
+0
输入被检查不为NULL。我还没有添加param检查功能(我也检查了边界)。谢谢,那就是问题所在。 –
+0
@RobertoSánchez固定。抱歉。我与我正在审查的其他代码混淆。无论任何人告诉你什么,人的思想都不是为了一心多用 –
你能构建一个[mcve]吗? – HolyBlackCat
你正在粉碎函数堆栈*堆栈溢出*。 –
发生什么事是你的函数有一个错误,它会损坏堆栈,可能你的代码正在写入数组的边界。如果您需要进一步的帮助,您需要向我们显示该代码。 – nos