programing

크기 8 - Valgrind + C의 잘못된 판독값

goodsources 2023. 10. 23. 21:46
반응형

크기 8 - Valgrind + C의 잘못된 판독값

Valgrind가 오류를 보고합니다.Invalid read of size 8아래와 같은 암호로

제게 이런 배열이 있다고 선언했어요

struct symbol *st[PARSER_HASH_SIZE];

내 프로그램이 초기화되면 이 배열의 모든 요소는 0으로 초기화됩니다.

memset(&st[0], 0, sizeof(st));

내 프로그램은 의 인스턴스를 만듭니다.struct symbol해쉬 값에 따라 상기 배열에 삽입합니다.따라서 이 배열의 요소 중 NULL이 되는 요소는 거의 없고 다른 요소는 유효한 값이 됩니다.

다음 코드는 할당된 항목을 삭제하려고 하고 라인에서 valgrind 불만 사항을 제기합니다.sym = st[i]; sym != NULL; sym = sym->next

struct symbol *sym = NULL;

/* cleaning the symbol table entries */
for(i = 0; i < PARSER_HASH_SIZE; i++) {
    for(sym = st[i]; sym != NULL; sym = sym->next) { /* <-- Valgrind complains here */
        free(sym);
    }
}

저는 이 오류의 이유를 이해하려고 합니다.

어떤 도움이라도 주시면 감사하겠습니다!

문제는 당신이 그들을 자유롭게 한다는 것입니다.sym, 그런 다음 (지금은 사용할 수 없는) 데이터에서 값에 액세스하려고 시도합니다.sym->next.

내부 루프에 대해 다음과 같은 것을 원할 것입니다.

struct symbol *next_sym = NULL;

for(sym = st[i]; sym != NULL; ) {
    next_sym = sym->next;
    free(sym);
    sym = next_sym;
}

배열이 구조체 또는 구조체에 대한 포인터를 포함하도록 의도되었는지 여부도 명확하지 않습니다.

struct symbol *st[PARSER_HASH_SIZE];

구조물에 대한 포인터들의 배열이라고 합니다.하지만 당신은 말합니다.

"내 프로그램이 초기화되면, 이 배열의 모든 요소는 0으로 초기화됩니다."

memset(&st[0], 0, sizeof(st));

이것은 그 항목들을 구조물처럼 취급하는 것입니다.

배열을 없애다

for (int i = 0; i < PARSER_HASH_SIZE; i++)
{
    st[i] = 0;
}

언급URL : https://stackoverflow.com/questions/4035769/invalid-read-of-size-8-valgrind-c

반응형