gpt4 book ai didi

c++ - malloc 和 snprintf 总线核心转储

转载 作者:行者123 更新时间:2023-11-30 18:42:37 25 4
gpt4 key购买 nike

之前运行的功能突然拒绝合作。更准确地说,这个片段:

    //If not, add to UIDS
printf("line 78\n");
free(s2);
printf("line 82\n");
char * ss = malloc(snprintf(NULL, 0, "%s:%d", myUIDs, userId) + 1);
printf("line 84\n");
sprintf(ss, "%s:%d", myUIDs, userId);
free(myUIDs);
myUIDs=ss;
free(buffer);

程序在“第 82 行”之后的一行(不再是第 82 行,但它只是调试停止)失败,并出现段错误(核心转储)。如果我改变

char * ss = malloc(snprintf(NULL, 0, "%s:%d", myUIDs, userId) + 1);

char * ss = malloc(snprintf(NULL, 0, "%s:%d", "", 1) + 1);

我收到总线错误:代码已转储。我在这个程序上工作了相当长的时间,我有一种感觉,这是显而易见的事情,我经常因为疲惫而忽视,但此时没有程序员 friend 寻求帮助。

上下文的整个函数:

char* myUIDs; //string containing all UID-s, separated by colon

void printProcessInformation(char pid[],int isSetP, int isSetN, int isSetU){
//find full path name to your "stat" file
//DIR *dir;
//struct dirent *ent;
//Creating string with /proc/PID
char * s = malloc(snprintf(NULL, 0, "%s%s", "/proc/", pid) + 1);
sprintf(s, "%s%s", "/proc/", pid);
//Creating string with /proc/PID/psinfo (full path)
char * fullPath = malloc(snprintf(NULL, 0, "%s%s", s, "/psinfo") + 1);
sprintf(fullPath, "%s%s", s, "/psinfo");
free(s);
//printf("%s\n",fullPath);

//Reading data from file
FILE* file = fopen(fullPath, "r");
printf("line 37\n");
char* buffer;
buffer = (char*) malloc(sizeof(psinfo_t));
printf("line 40\n");
if(file == NULL)
{
//perror("Error: Couldn't open file");
return;
}
fread((void *)buffer, sizeof(psinfo_t), 1, file);
psinfo_t* pData = (psinfo_t*) buffer;
time_t sTime=pData->pr_start.tv_sec;
int pr_pid=pData->pr_pid;
char* fname=pData->pr_fname;
free(buffer);
buffer = (char*) malloc(sizeof(stat));
stat(fullPath,buffer);
struct stat* fileStat=(struct stat*) buffer;
fclose(file);
int userId=fileStat->st_uid;
struct passwd* pw=getpwuid(userId);
char* uid=pw->pw_name;
printf("line 58\n");
if(isSetU<0){
//Print results
printf("%8s", uid);
if(isSetP>0)
printf(" %5d",pr_pid);
printf(" %16s %.24s\n", fname, ctime(&sTime));
free(buffer);
}else{
//Or else, add UID to UIDS if it didn't appear before
//check if UID is in UIDS
printf("line 70\n");
char * s2 = malloc(snprintf(NULL, 0, "%s:%d", "", userId) + 1);
printf("line 72\n");
snprintf(s2, "%s:%d", "", userId);
if(strstr(myUIDs,s2)!=NULL){
free(s2);
free(buffer);
return;
}
//If not, add to UIDS
printf("line 78\n");
free(s2);
printf("line 82\n");
char * ss = malloc(snprintf(NULL, 0, "%s:%d", "", 1) + 1);
printf("line 84\n");
sprintf(ss, "%s:%d", myUIDs, userId);
free(myUIDs);
myUIDs=ss;
free(buffer);
}
}

最佳答案

我在进一步审查中发现了几个问题...

简而言之,您收到的错误似乎不是您正在执行的行的结果,而是先前内存损坏的副作用。

  1. 在哪里初始化myUID?看起来您可以在尚未根据提供的代码定义它时访问它

  2. 您正在从 pData 分配 fname,它是指向动态分配的 buffer 的指针...您随后可以释放该缓冲区下一行执行,这意味着 fname 现在指向已释放的内存。然而,您稍后会尝试在代码中读取它......这很可能会导致您随机遍历内存。

  3. 代码中有多个实例,您可以动态分配内存,然后尝试使用它,而无需验证您是否确实获得了所请求的分配。

  4. 您正在根据 snprintf() 的返回值调用 malloc(),而无需验证 snprintf() 返回你是一个非负值。虽然我怀疑这是一个问题,但这是不明智的。

可以肯定的是,您所描述的症状是堆损坏的结果。问题是在哪里。我强烈推荐使用 valgrind。

此外,如果可用,请查看 asprintf() 而不是您正在执行的 malloc( snprintf() ) 工作。

关于c++ - malloc 和 snprintf 总线核心转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15905776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com