sqlite3 sqlite3_prepare_v2段错误

时间:2014-03-24 19:17:41

标签: c sqlite

在测试程序中:

#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>

int     main(void) 
{
   sqlite3        *conn;
   sqlite3_stmt   *res;
   int            rc          =   0;
   int            rec_count   =   0;
   const char     *errMSG;
   const char     *tail;
   const char     *sql;

   rc = sqlite3_open("ljdata.sl3", &conn);
   if (rc) 
   {   puts("Can not open database");
      exit(0);
   }
   printf ("database open\n");

   sql   =   "create table if not exists people (id int, firstname varchar(20), lastname varchar(20), phonenumber char(10))";
   rc   =   sqlite3_exec(conn, sql, 0, 0, 0);
   if   (rc != SQLITE_OK)
   {   printf   ("Cannot access table, rc = %d,\n%s\n", rc, sqlite3_errmsg (conn));
      printf   ("sql = %s", sql);
      return   -2;
   }
   printf("db table (?)created\n");

   rc = sqlite3_exec(conn,
               "update people set phonenumber=\'5055559999\' where id=3",
               0, 0, 0);
   //printf ("1st update done with rc = %d\n", rc);

   rc = sqlite3_prepare_v2(conn,
               "select lastname,firstname,phonenumber,id from people order by id",
               1000, &res, &tail);
   printf ("prepare statement executed\n");

   if (rc != SQLITE_OK) 
   {   puts("We did not get any data!");
      exit(0);
   }

   puts("==========================");

   while (sqlite3_step(res) == SQLITE_ROW) 
   {   printf("%s|", sqlite3_column_text(res, 0));
      printf("%s|", sqlite3_column_text(res, 1));
      printf("%s|", sqlite3_column_text(res, 2));
      printf("%u\n", sqlite3_column_int(res, 3));

      rec_count++;
   }

   puts("==========================");
   printf("We received %d records.\n", rec_count);

   sqlite3_finalize(res);

   sqlite3_close(conn);

   return 0;
}

如果我发表评论:
printf ("1st update done with rc = %d\n", rc); // <<== THIS STATEMENT
我得到一个段错误。否则我似乎正常完成。 gcc -v - &gt;
    使用内置规格。
    COLLECT_GCC = GCC
    COLLECT_LTO_WRAPPER = / usr / lib中/ GCC / x86_64的-Linux的GNU / 4.7 / LTO-包装
    目标:x86_64-linux-gnu
    配置为:../ src / configure -v --with-pkgversion =&#39; Debian 4.7.2-5&#39; --with-bugurl = file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages = c,c ++,go,fortran,objc,obj-c ++ --prefix = / usr - -program-suffix = -4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir = / usr / lib --without-included-gettext --enable-threads = posix --with-gxx-include-dir = / usr / include / c ++ / 4.7 --libdir = / usr / lib --enable-nls --with-sysroot = / --enable-clocale = gnu --enable-libstdcxx -debug --enable-libstdcxx-time = yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --with-arch-32 = i586 --with-tune = generic - enable-checking = release --build = x86_64-linux-gnu --host = x86_64-linux-gnu --target = x86_64-linux-gnu
    螺纹型号:posix
    gcc版本4.7.2(Debian 4.7.2-5)

但是,我也在Debian测试中得到了一个(分析较少的)段错误 有什么建议? (我注意到&#34回答了类似的错误;你需要为sql字符串分配空间,但我使用的是文字,所以不适用。)

1 个答案:

答案 0 :(得分:1)

在我的头顶上,sqlite3_prepare_v2调用失败,因为你对字符串长度撒谎:

rc = sqlite3_prepare_v2(conn,
           "select lastname,firstname,phonenumber,id from people order by id",
           1000, &res, &tail);

如果您包含printf调用,它似乎有效,因为字符串文字将放在与您所说长度的字符串相同的部分中,而sqlite3_prepare_v2正在执行的操作只会溢出其他字符串。

你所拥有的实际上是缓冲区溢出。