valgrind在sqlite3_step和sqlite3_prepare_v2中报告未初始化的值

时间:2012-01-20 14:51:45

标签: c++ sqlite valgrind initialization

Valgrind在包装器的以下两种方法中报告了关于sqlite3_prepare_v2和sqlite3_step的未初始化的值错误。:

使用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是输出值。并且由于sqlite3_prepare_v2,pVM int sqlite3_step无法进行单元化。

1 个答案:

答案 0 :(得分:0)

错误是我的:生成的INSERT查询中存在SQL语法错误。我不知道为什么sqlite没有告诉我语法错误,但是在重新设计INSERT生成器方法之后,valgrind没有报告更多的单元化值问题。 我希望这条消息对于遇到同样问题的人有用。