c - 使用 Valgrind 的 mysqlite3 方法中大小为 8 的无效读取
问题描述
我编写了一个从共享缓冲区读取数据并将其放入 sqlite3 数据库的函数。一切正常,除了在我运行 Valgrind 时出现两条“无效读取大小为 8”的消息。我看到无效读取来自哪些方法,但我很难弄清楚如何解决它们。
我已经复制了 Valgrind 消息和下面的代码。这些是我用来编译和运行代码的命令:
gcc -o 线程 threading.c -pthread -lsqlite3
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-origins=yes ./threading
void * insert_sensor(void * argument) {
storagemgr_insert_argument_t * storagemgr_insert_argument = (storagemgr_insert_argument_t *) argument;
DBCONN *conn = storagemgr_insert_argument->db_connection;
sqlite3_stmt * res = NULL;
uint16_t sensor_id_read;
double temperature_value_read;
time_t timestamp_read;
sensor_data_t data;
int buffer_working_check;
data.id = 0;
data.value = 0;
data.ts = 0;
buffer_working_check = 1;
while (connmgr_loopt_bool == 1 || buffer_working_check == 0) { //connmgr aan -> moet blijven lopen, connmgr uit maar nog data beschikbaar -> moet blijven lopen
pthread_mutex_lock(&lock);
buffer_working_check = sbuffer_read(shared_buffer, &data, 0, 1);
pthread_mutex_unlock(&lock);
if(data.id != 0 && buffer_working_check != -1 && buffer_working_check != 1) {
res = NULL;
sensor_id_read = data.id;
temperature_value_read = data.value;
timestamp_read = data.ts;
char *sql = "INSERT INTO "TO_STRING(TABLE_NAME)" (sensor_id, sensor_value, timestamp) VALUES (@sensor_id, @sensor_value, @timestamp)";
rc = sqlite3_prepare_v2(conn, sql, -1, &res, 0);
if (rc == SQLITE_OK) {
int idx1 = sqlite3_bind_parameter_index(res, "@sensor_id");
sqlite3_bind_int(res, idx1, sensor_id_read);
int idx2 = sqlite3_bind_parameter_index(res, "@sensor_value");
sqlite3_bind_double(res, idx2, temperature_value_read);
int idx = sqlite3_bind_parameter_index(res, "@timestamp");
sqlite3_bind_int(res, idx, timestamp_read);
} else {
char *err_msg = 0;
fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(conn));
sqlite3_free(err_msg);
sqlite3_close(conn);
return NULL;
}
}
int step = sqlite3_step(res);
if (step == 1) {
step = 1;
}
sqlite3_finalize(res);
}
return NULL;
}
.
Invalid read of size 8
==4585== at 0x4E892BB: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4ED4268: sqlite3_step (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x10C04D: insert_sensor (in /home/jens/Desktop/CLion_projects/Labo9/threading)
==4585== by 0x514C6DA: start_thread (pthread_create.c:463)
==4585== by 0x5485A3E: clone (clone.S:95)
==4585== Address 0x5d27678 is 8 bytes inside a block of size 296 free'd
==4585== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4585== by 0x4E575C2: sqlite3_free (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EC4F95: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EC4FE0: sqlite3_finalize (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x10C069: insert_sensor (in /home/jens/Desktop/CLion_projects/Labo9/threading)
==4585== by 0x514C6DA: start_thread (pthread_create.c:463)
==4585== by 0x5485A3E: clone (clone.S:95)
==4585== Block was alloc'd at
==4585== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4585== by 0x4E89233: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4E57223: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4E5909F: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4E7BE70: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4ED808E: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EE2AD7: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EE57ED: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EE5D4D: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EE6075: sqlite3_prepare_v2 (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x10BF4E: insert_sensor (in /home/jens/Desktop/CLion_projects/Labo9/threading)
==4585== by 0x514C6DA: start_thread (pthread_create.c:463)
==4585== by 0x5485A3E: clone (clone.S:95)
==4585==
==4585== Invalid read of size 8
==4585== at 0x4EC4FBB: sqlite3_finalize (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x10C069: insert_sensor (in /home/jens/Desktop/CLion_projects/Labo9/threading)
==4585== by 0x514C6DA: start_thread (pthread_create.c:463)
==4585== by 0x5485A3E: clone (clone.S:95)
==4585== Address 0x5d27678 is 8 bytes inside a block of size 296 free'd
==4585== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4585== by 0x4E575C2: sqlite3_free (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EC4F95: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EC4FE0: sqlite3_finalize (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x10C069: insert_sensor (in /home/jens/Desktop/CLion_projects/Labo9/threading)
==4585== by 0x514C6DA: start_thread (pthread_create.c:463)
==4585== by 0x5485A3E: clone (clone.S:95)
==4585== Block was alloc'd at
==4585== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4585== by 0x4E89233: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4E57223: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4E5909F: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4E7BE70: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4ED808E: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EE2AD7: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EE57ED: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EE5D4D: ??? (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x4EE6075: sqlite3_prepare_v2 (in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6)
==4585== by 0x10BF4E: insert_sensor (in /home/jens/Desktop/CLion_projects/Labo9/threading)
==4585== by 0x514C6DA: start_thread (pthread_create.c:463)
==4585== by 0x5485A3E: clone (clone.S:95)
解决方案
推荐阅读
- specflow - Hooks 方法 AfterTestRun 不执行
- python - py_run_file_impl 中的错误:系统退出:没有这样的文件或目录
- node.js - 谷歌地图距离矩阵 Nodejs 超时
- vuejs2 - 将 Font Awesome 5 与 Bootstrap 3 折叠组件一起使用——在折叠时更改箭头图标?
- c - 包含文件似乎被忽略了
- arduino - 串行监视器没有输出
- google-apps-script - 非管理员使用目录 api 在 google 组中添加成员
- c# - SSIS Outputbuffer错误“脚本组件上的primeoutput方法返回成功,但没有报告行集结束”
- java - 正则表达式未从 html 标记中提取图像 url
- macos - 防止 apache 用 localhost 替换完全限定的服务器名称?