sql_varyingのcaseステートメントは、nodejsがセグメンテーション違反でクラッシュする原因となっています。これはなぜクラッシュするのですか?nodejs
case SQL_VARYING: var->sqldata = new char[var->sqllen + 3];
memset(var->sqldata, 0, 2);
memset(var->sqldata + 2, ' ', var->sqllen);
var->sqldata[var->sqllen + 2] = '\0';
break;
なぜclean_sqlda原因nodejsでラインがクラッシュするん:ここで
void FBResult::clean_sqlda(XSQLDA *sqlda)
{
int i;
XSQLVAR* var;
for(i = 0, var= sqlda->sqlvar; i < sqlda->sqld;i++,var++)
{
switch(var->sqltype & ~1)
{
case SQL_ARRAY:
case SQL_BLOB: delete (ISC_QUAD*) var->sqldata; break;
case SQL_TIMESTAMP: delete (ISC_TIMESTAMP*) var->sqldata; break;
case SQL_TYPE_TIME: delete (ISC_TIME*) var->sqldata; break;
case SQL_TYPE_DATE: delete (ISC_DATE*) var->sqldata; break;
case SQL_TEXT:
case SQL_VARYING: delete [] var->sqldata; break;
case SQL_SHORT: delete (int16_t *) var->sqldata; break;
case SQL_LONG: delete (int32_t *) var->sqldata; break;
case SQL_INT64: delete (int64_t *) var->sqldata; break;
case SQL_FLOAT: delete (float *) var->sqldata; break;
case SQL_DOUBLE: delete (double *) var->sqldata; break;
default: return;
}
if(var->sqlind != 0) delete var->sqlind;
}
}
はsqldataのがsql_varyingに割り当てられている方法ですか?私が行をコメントアウトして拡張機能を再構築すると、クラッシュしません。この行は、var-> sqldataに割り当てられたメモリをクリアすると仮定しています。どうすれば修正できますか?
EDIT:SQL_TEXTはこのように割り当てられている:
case SQL_TEXT: var->sqldata = new char[var->sqllen + 1];
memset(var->sqldata, ' ', var->sqllen);
//memset(var->sqldata, 0, var->sqllen);
var->sqldata[var->sqllen] = '\0';
break;
は、しかし、私は私が(ただし、わからない)どこでもSQL_TEXT使用していないと思います。
編集#2: さらにデバッグした後、私はエラーがラインによって引き起こされていると判断:どこかのコード、SQLINDで
if(var->sqltype & 1) delete var->sqlind;
:私はそれを交換する場合
if(var->sqlind != 0) delete var->sqlind;
if(var->sqltype & 1){
var->sqlind = new short(-1);
}
古い行を新しいliに置き換えますneは問題を修正し、nodejsはもはやクラッシュしません。 sqlindがnullのマーカーである新しいshort(-1)に割り当てられているため、古い行がクラッシュしたと思いますか?
sql_textの割り当てを表示するように編集されました。 – firebird