在 C 中使用指针时出现分段错误
Getting segmentation fault when using pointers in C
我目前正在做一个项目,我想在其中使用 SQLite 来存储一些数据。除了我想将新数据插入 table 之外,一切都运行良好。当我 运行 应用程序时,出现分段错误,但我找不到问题所在。
void sqlite(char *id, char *sensorname, char *sensorvalue){
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data = "Callback function called";
/* Open database */
rc = sqlite3_open("/home/macho/Documents/sensor_database.db", &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
exit(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
sql = "INSERT INTO sensors (id,sensorname,sensorvalue) VALUES(";
char* split = ",";
strcat(sql, id);
strcat(sql, ",");
strcat(sql, sensorname);
strcat(sql, ",");
strcat(sql, sensorvalue);
strcat(sql, ");");
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
}
主要是调用 sqlite() 函数:
sqlite("1","sensor","sensor1");
知道问题出在哪里吗?
谢谢!
您分配 sql
一个静态(只读)字符串,然后尝试附加到它。相反,在堆栈上创建一个大型可写数组或使用 malloc
然后 assemble 您的查询。所以
char sql[4096];
strcpy(sql, "INSERT INTO sensors ...
...
请注意,您应该根据值的长度检查缓冲区是否溢出。
顺便说一句,如果用户可以访问,所编写的代码只是要求 SQL 注入攻击。查找鲍比表。
我目前正在做一个项目,我想在其中使用 SQLite 来存储一些数据。除了我想将新数据插入 table 之外,一切都运行良好。当我 运行 应用程序时,出现分段错误,但我找不到问题所在。
void sqlite(char *id, char *sensorname, char *sensorvalue){
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data = "Callback function called";
/* Open database */
rc = sqlite3_open("/home/macho/Documents/sensor_database.db", &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
exit(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
sql = "INSERT INTO sensors (id,sensorname,sensorvalue) VALUES(";
char* split = ",";
strcat(sql, id);
strcat(sql, ",");
strcat(sql, sensorname);
strcat(sql, ",");
strcat(sql, sensorvalue);
strcat(sql, ");");
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
}
主要是调用 sqlite() 函数:
sqlite("1","sensor","sensor1");
知道问题出在哪里吗?
谢谢!
您分配 sql
一个静态(只读)字符串,然后尝试附加到它。相反,在堆栈上创建一个大型可写数组或使用 malloc
然后 assemble 您的查询。所以
char sql[4096];
strcpy(sql, "INSERT INTO sensors ...
...
请注意,您应该根据值的长度检查缓冲区是否溢出。
顺便说一句,如果用户可以访问,所编写的代码只是要求 SQL 注入攻击。查找鲍比表。