2017-08-24 3 views
0

私の問題は、私がタイトルに言及したのと同じように、私は返された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== 

これは私が実行していたコードでは、スタックエラーがADD_USERからの戻り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; 
    } 

} 

機能が正常に限り私がチェックしてきたように実行されます。私は何が起こっているのか分かりませんが、あなたの説明があれば、本当に感謝しています。また、私が探し求めた唯一の有用な情報ですので、私はその場合にいくつかのガイダンスが必要かもしれません。

は事前

+1

[mcve]を作成できますか? – HolyBlackCat

+0

あなたは関数のスタックを壊しています... *スタックオーバーフロー*。 –

+0

何が起こっているのは、あなたの関数がスタックにダメージを与えるバグを持っていて、おそらくあなたのコードが配列の境界を越えて書いている可能性があるということです。さらに助けが必要な場合は、コードを表示する必要があります。 – nos

答えて

3

にこのコードをありがとうござい危険です:

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でないことがチェックされます。私はまだパラメータチェック機能を追加していない(私は境界をチェックする)。ありがとう、それは問題でした。 –

+0

@ RobertoSanchezが修正されました。ごめんなさい。私はそれを私が見直している他のコードと混同しました。人間の心は誰でもあなたに話していてもマルチタスクを意味するものではありません... –

関連する問題