使用libsqlite3的间歇段错误,“libsqlite3.so.0.8.6中的错误4”

时间:2014-02-07 13:25:11

标签: c linux sqlite embedded

我在嵌入式设备上运行了一些C代码,它在启动时初始化。该代码使用简单的名称/值表查询小型数据库。我注意到,在20年左右,代码无法运行,在添加一些日志记录后,我发现了以下消息:

 user.info kernel: [   47.983041] my_code[2237]: segfault at bf87601f ip b78b7115 sp bf8758f0 error 4 in libsqlite3.so.0.8.6[b7872000+51000]

处理数据库查询的函数是:

void my_db_query(char* my_setting, char* my_result)
{

sqlite3 *db;
if(sqlite3_open("/tmp/system.db", &db) != 0){
    printf("Failed to Open DB\n");
}

char query_string[100];
memset(query_string, 0, 100);
char* query_one = "select value from setting where name=\"";
char* query_two = "\";";
char db_result[256];
int ret;
strcat(query_string, query_one);
strcat(query_string, my_setting);
strcat(query_string, query_two);

sqlite3_stmt* stmt;
ret = sqlite3_prepare_v2(db, query_string, 1000, &stmt, 0);
if (ret != SQLITE_OK ){
    printf("Error preparing\n");
}

while (sqlite3_step(stmt) == SQLITE_ROW) {
    strcpy(db_result,(char*)sqlite3_column_text(stmt, 0));
    strncpy(my_result,db_result, strnlen(db_result, 256));

}
sqlite3_close(db);
}

我正在使用sqlite3版本3.6.11,我无法更改该版本,因为我没有权限。我们将非常感激地收到任何建议。

1 个答案:

答案 0 :(得分:1)

所以看起来用strncpy(my_result,db_result, strnlen(db_result, 256));替换行strcpy(my_result,db_result);已经成功了,因为db_result在复制之前没有归零。