为什么PQexecPrepared堆栈粉碎? C - Postgresql

时间:2016-01-10 19:55:33

标签: c postgresql pointers stack dynamic-memory-allocation

我有一个相当复杂的多线程应用程序。 PostgreSQL一直运行得非常好,直到我从PQexec切换到使用预准备语句。行为一直不稳定,有很多堆栈粉碎。在这里,我将主要功能浓缩为一个非常短的应用程序,它很快返回,但我仍然得到堆栈粉碎,主要是错误代码134和255.我可以发誓这个相同的应用程序之前工作(我有大部分数据库函数抽象进入自定义功能),但当我再次尝试时,它现在无法正常工作。

请帮忙!

#include <stdio.h>
#include <libpq-fe.h>
...

PGconn *psqldb;

int main()
{

psqldb = PQconnectdb("user=USERNAME password=PASSWORD dbname=DBNAME");
PQprepare(psqldb, "CreateUser", "INSERT into \"User\" (UserID, Email, PasswordHash, Salt, UserName) VALUES ($1, $2, $3, $4, $5)", 5, NULL);

const char *vals[5];
vals[0]="ccc";
vals[1]="aaa";
vals[2]="rrr";
vals[3]="ttt";
vals[4]="jjj";

int len[5];

len[0]=3;
len[1]=3;
len[2]=3;
len[3]=3;
len[4]=3;


PGresult *res = PQexecPrepared(psqldb,
                               "CreateUser",
                               5,
                               vals,
                               len,
                               NULL,
                               0);


if (PQresultStatus(res) != PGRES_COMMAND_OK) {
    fprintf(stderr, "%s\n", PQerrorMessage(psqldb));
    PQclear(res);
    PQfinish(psqldb);

    return -1;
}
PQclear(res);

fprintf(stderr, "returning\n");
PQfinish(psqldb);

return 0;
}

它确实会将数据插入到数据库中,因为我多次运行时会遇到唯一的键约束错误

ERROR:  duplicate key value violates unique constraint "User_pkey"
DETAIL:  Key (userid)=(ccc) already exists.


Process finished with exit code 255

在终端我得到了

*** stack smashing detected ***

有什么想法吗?

0 个答案:

没有答案