Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C代码似乎可以工作,但valgrind说数组没有初始化_C_Token_Valgrind - Fatal编程技术网

C代码似乎可以工作,但valgrind说数组没有初始化

C代码似乎可以工作,但valgrind说数组没有初始化,c,token,valgrind,C,Token,Valgrind,我目前正在做一个项目,在这个项目中我制作了自己的标记器。我的代码编译良好,但valgrind给出了错误: ==2572== Conditional jump or move depends on uninitialised value(s) ==2572== at 0x4C2B308: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==2572== by 0x400FCB: strdup (Lex1

我目前正在做一个项目,在这个项目中我制作了自己的标记器。我的代码编译良好,但valgrind给出了错误:

==2572== Conditional jump or move depends on uninitialised value(s)
==2572==    at 0x4C2B308: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==2572==    by 0x400FCB: strdup (Lex1.c:173)
==2572==    by 0x400EBA: lex (Lex1.c:140)
==2572==    by 0x400A3B: main (mainLex.c:34)
==2572== 
==2572== Conditional jump or move depends on uninitialised value(s)
==2572==    at 0x4C2B35B: strcpy (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==2572==    by 0x400FFC: strdup (Lex1.c:177)
==2572==    by 0x400EBA: lex (Lex1.c:140)
lex中的第140行是以下代码中的“temp->text”行:

token *head, *temp, *right, *temp1;
char *line1 = strdup(line);
char *curr = separatebetter(line1);
temp = (token *)malloc(sizeof(token));
temp->text=strdup(curr);
奇怪的是,我可以打印curr的值,但是根据我的假设,valgrind说curr在任何时候都没有初始化,尽管我清楚地初始化了它

valgrind在strdup中引用的两行是:

int n = strlen(str) + 1;
strcpy(dup, str);
分离器的相关代码为:

char *separatebetter (char *arr)
{
    int status=0;
    static char* perm;
    if (arr!=NULL)
    {
        perm=arr;
    }
    if((perm[0]=='\0')||(perm[0]=='\n'))
    {
        return NULL;
    }
    if (strcspn(perm, "<|>&")==0)
    {
        status=1;
    }
    if (strcspn(perm, ";()")==0)
    {
        status=2;
    }
    char *toke = perm;
    char *temp;
    //Status is set to 1 or 2
    if (status==1)
    {
        printf("here\n");
        temp=toke;
        char *temp1=malloc(strlen(temp)*sizeof(char));
        temp1=temp;
        char *final = malloc(3*sizeof(char));
        temp1++;
        if(temp[0]==temp1[0])
        {
            final[0]=temp[0];
            final[1]=temp[0];
            *temp='\0';
            temp++;
            *temp='\0';
            perm=temp+1;
            return final;
        }
        else
        {
            final[0]=temp[0];
            final[1]='\0';
            *temp='\0';
            perm=temp+1;
            return final;
        }
    }
    else if (status==2)
    {
        temp=toke;
        char *final = malloc(2*sizeof(char));
        final[0]=temp[0];
        final[1]='\0';
        *temp='\0';
        perm=temp+1;
        return final;
    }
    perm[0]='\0';
    return toke;
}

我认为curr的初始化是问题所在,这是错误的吗?

这段代码显然是错误的:

char *curr = malloc(100*sizeof(char));
curr = separatebetter(line1);
分配内存,然后用
separatebetter()
中的值覆盖指向它的唯一指针。这是一个即时泄漏。也许您打算使用strcpy()

我需要看看
separatebetter()
做了什么-但这不是您正在运行的代码,因为它不会编译:

if (strcspn(perm, ";()")==0)
{
    status=2;
}
char *toke = perm;
char *temp;
//Status is set to 1 or 2
else if (status==1)
else
无法在那里编译;前面的语句是一个变量声明。这使得我们很难知道到底出了什么问题。给不可编译的代码声称正在运行是非常烦人的。这使得人们很难知道什么是可信的

但是,您的函数可以在此代码之前返回
NULL
strdup(NULL)
的行为是未定义的,
strcpy()的行为也是未定义的,当被告知从
NULL
指针复制(或复制到
NULL
指针时。在确保
separatebetter()
的返回值不为null之前,您无法使用它

以下代码还会重复内存泄漏问题:

{
    printf("here\n");
    temp=toke;
    char *temp1=malloc(strlen(temp)*sizeof(char));
    temp1=temp;
同样,您可能打算使用strcpy()


separatebetter()
的顶部,您有:

static char* perm;
if (arr!=NULL)
{
    perm=arr;
}
if((perm[0]=='\0')||(perm[0]=='\n'))
{
    return NULL;
}
if (strcspn(perm, "<|>&")==0)
{
    status=1;
}
if (strcspn(perm, ";()")==0)
{
    status=2;
}
char *toke = perm;
静态字符*perm;
如果(arr!=NULL)
{
perm=arr;
}
如果((perm[0]='\0')| |(perm[0]='\n'))
{
返回NULL;
}
如果(strcspn(perm,“&”)==0)
{
状态=1;
}
if(strcspn(perm,;()”==0)
{
状态=2;
}
char*toke=perm;
静态字符*perm
令人费解。将
arr
分配给它有时令人费解。使用
char*toke=perm确实令人费解。先前的代码并不总是设置
perm
,因此有时它会从先前对分配给它的函数的调用中得到一个指针。该指针可能有效,也可能无效。我认为您需要重新思考整个
separatebetter()


相信你的工具!(尤其是相信瓦尔格林)

这是错误的:
char*curr=malloc(100*sizeof(char));curr=分隔符(第1行)。您立即泄漏分配的内存,并将
curr
设置为指向其他位置。在
temp1
中也会发生同样的情况。显示实际测试的代码。为了获得更好的帮助,发布了一个MCVE。我编辑了上面的curr初始化,然后尝试打印f curr,valgrind告诉我curr没有初始化。我认为curr中的初始化是问题所在,这是不是错了?您需要修复代码,以便显示一个可编译的
separatebetter()
函数。很抱歉,为了简洁起见,我省略了很多separatebetter代码(例如,在else-if之前有一个if)。我感谢你的帮助。
{
    printf("here\n");
    temp=toke;
    char *temp1=malloc(strlen(temp)*sizeof(char));
    temp1=temp;
    strcpy(temp1, temp);
static char* perm;
if (arr!=NULL)
{
    perm=arr;
}
if((perm[0]=='\0')||(perm[0]=='\n'))
{
    return NULL;
}
if (strcspn(perm, "<|>&")==0)
{
    status=1;
}
if (strcspn(perm, ";()")==0)
{
    status=2;
}
char *toke = perm;