为什么会发生堆栈崩溃?C-Postgresql

为什么会发生堆栈崩溃?C-Postgresql,c,postgresql,pointers,stack,dynamic-memory-allocation,C,Postgresql,Pointers,Stack,Dynamic Memory Allocation,我有一个相当复杂的多线程应用程序。PostgreSQL一直工作得非常出色,直到我从PQexec切换到使用准备好的语句。行为一直不稳定,大量的堆栈崩溃。在这里,我已经将main函数压缩成一个非常短的应用程序,该应用程序返回速度很快,但我仍然会遇到堆栈崩溃,主要是错误代码134和255。我可以发誓,这个应用程序以前可以工作(我将大多数db函数抽象为自定义函数),但当我再次尝试时,它现在不工作了 请帮忙 #include <stdio.h> #include <libpq-fe.h&

我有一个相当复杂的多线程应用程序。PostgreSQL一直工作得非常出色,直到我从PQexec切换到使用准备好的语句。行为一直不稳定,大量的堆栈崩溃。在这里,我已经将main函数压缩成一个非常短的应用程序,该应用程序返回速度很快,但我仍然会遇到堆栈崩溃,主要是错误代码134和255。我可以发誓,这个应用程序以前可以工作(我将大多数db函数抽象为自定义函数),但当我再次尝试时,它现在不工作了

请帮忙

#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;
}
在终点站我得到了

*** stack smashing detected ***

有什么想法吗?

您是否尝试过在函数调用中将len[]数组替换为NULL(字符串不需要,但应该不会造成伤害),或者将3s替换为4s(包括长度中的“\0”对于字符串来说似乎是公平的),将len替换为NULL也可以实现同样的效果。另外,我注意到,如果我在执行准备好的语句(比如charquery[1024])后立即声明一些堆栈数组,它似乎可以工作。我非常沮丧。因此,用4代替3仍然会破坏堆栈。{Versions,compilerflags,optimization,}可能会添加更多的金丝雀,甚至将所有变量移动到全局范围。使用clang-Wall-o3您是否尝试过在函数调用中将len[]数组替换为NULL(字符串不需要,但不应该造成伤害)或者用4s替换3s(包括长度中的“\0”对于字符串来说似乎是公平的)用NULL替换len做同样的事情。另外,我注意到如果我在执行准备好的语句后立即声明一些堆栈数组,比如char query[1024],它似乎起作用了。我非常沮丧。所以,用4而不是3替换len仍然会打破堆栈。{版本、编译器、优化,}可能会添加更多的金丝雀,甚至将所有变量移动到全局范围。使用叮当-墙-O3
*** stack smashing detected ***