2014-02-07 49 views
0

我有一些C代碼在啓動時初始化的嵌入式設備上運行。代碼使用簡單的名稱/值表查詢小型數據庫。我注意到,大約1時20代碼運行失敗,在一些記錄加入後,我發現了以下消息:間歇段錯誤使用libsqlite3,「錯誤4在libsqlite3.so.0.8.6」

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); 
} 

我m使用sqlite3版本3.6.11,並且我無法更改該版本,因爲我沒有權限。任何建議將受到感謝。

回答

1

所以它看起來像strncpy(my_result,db_result, strnlen(db_result, 256));替換strcpy(my_result,db_result);已經做到了把戲,因爲db_result沒有歸零之前複製。