首页 > 解决方案 > 使用 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)

标签: csqlitegccvalgrindclion

解决方案


推荐阅读