2012-01-20 2 views
0

Valgrind сообщает неиницализированную ошибку значения о sqlite3_prepare_v2 и sqlite3_step в следующих два методах обертки в .:отчетов, valgrind неиницализированного значения в sqlite3_step и sqlite3_prepare_v2

ExecQuery:

bool 
CSQLiteDB::execQuery(const char* szSQL,CSQLiteQuery& sqlite_query_out, string* error /*=NULL*/) 
{ 
    if(!checkDB()){ 
     return false; 
    } 

    //HERE IS THE ESSENCE 
    sqlite3_stmt* pVM = NULL; 
    if(!compile(szSQL,&pVM,error)) 
    { 
     return false; 
    } 
    int nRet = sqlite3_step(pVM); //Here is the second call with uninitialised value. 
    //HERE IS THE END OF THE ESSENCE   

    if (nRet == SQLITE_DONE) 
    { 
     sqlite_query_out = CSQLiteQuery(mpDB, pVM, true/*eof*/); 
     return true; 
    } 
    else if (nRet == SQLITE_ROW) 
    { 
     // at least 1 row 
     sqlite_query_out = CSQLiteQuery(mpDB, pVM, false/*eof*/); 
     return true; 
    } 
    else 
    { 
     nRet = sqlite3_finalize(pVM); 
     if(error) 
      *error= sqlite3_errmsg(mpDB); 
     return false; 
    } 
} 

компиляция (вызывается из ExecQuery)

bool 
CSQLiteDB::compile(const char* szSQL,sqlite3_stmt** pVM, string* error /*=NULL*/) 
{ 
    checkDB(); 
    const char* szTail = 0; 
    int nRet = sqlite3_prepare_v2(mpDB, szSQL, -1, pVM, &szTail); //Here is the first call with uninitialized error. 
    if (nRet != SQLITE_OK) 
    { 
     if(error) 
      *error = sqlite3_errmsg(mpDB); 
     return false; 
    } 
    return true; 
} 

Что может быть неправильным? В sqlite3_prepare_v2 значение pVM является выходным. И pVM int sqlite3_step не может быть унифицирован из-за sqlite3_prepare_v2.

+0

Действительно ли valgrind жалуется на строку кода внутри вызова SQLite? или что ваш код виноват? Иногда valgrind ложные срабатывания и могут быть проигнорированы ... – gravitron

+0

Есть много более глубокой линии в стеке Valgrind в этом сообщении об ошибке с ... sqlite3VdbeExec ... sqlite3Step ... sqlite3_step. К сожалению, мой компьютер-разработчик здесь не на выходные. Я не знаю, чем могу проигнорировать неудачу или нет. –

ответ

0

Ошибка была моей: в сгенерированном запросе INSERT произошла синтаксическая ошибка SQL. Я не знаю, почему sqlite не сказал мне синтаксическую ошибку, но после редизайна метода генератора INSERT больше нет информации о унифицированной ценности, о которой сообщал valgrind. Надеюсь, это сообщение может быть полезно для кого-то с той же проблемой.