2012-03-18 10 views
1

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)に割り当てられているため、古い行がクラッシュしたと思いますか?

+0

sql_textの割り当てを表示するように編集されました。 – firebird

答えて

1

バグが修正されました。 var-> sqldataが0で初期化されていなかったため、ノードがクラッシュする原因となるnull参照でもvar-> sqldataの削除が常に実行されました。

+0

ポインター言語のよくある間違い。常にポインタを初期化します。 –

0

あなたの決定は(var-> sqlind!= 0)でしたが、あなたの決定は(var-> sqltype & 1)でした。もし私があなただったら、それ以外のことが証明されるまで不一致が起こると思います。

考えられる原因:var-> sqlindは、割り当てを必要としないコードパスでは初期化されません。

0

sqltypeの値がであるかどうかを示すために、最下位ビットが使用されます。
設定されている場合は、sqlindが割り当てられ、その値はであるかどうかを示します(ヌルの場合は-1、ヌルの場合は0)。

したがって、割り当てまたは割り当て解除時にそのビットをテストする条件は、いずれの場合も(var->sqltype & 1)である必要があります。

関連する問題