Ошибка от Valgrind: «Неверная запись размером 8» и «Адрес ... ниже указателя стека» - PullRequest
0 голосов
/ 26 февраля 2020

Я модифицирую код Dar knet для дополнительной реализации. Итак, я добавил много динамических c кодов выделения памяти в исходный код. Но я обнаружил много утечек памяти. Итак, я использовал Valgrind для проверки их.

Но, есть неизвестное сообщение об ошибке от Valgrind.

==29993== Invalid write of size 8 
==29993==    at 0x184550: gemm_nt (gemm.c:95)
==29993==    by 0x184B03: gemm_cpu (gemm.c:164)
==29993==    by 0x1843EF: gemm (gemm.c:71)     
==29993==    by 0x1690B7: forward_connected_layer (connected_layer.c:180)
==29993==    by 0x16654B: forward_network (network.c:614)
==29993==    by 0x16766B: network_predict (network.c:957)     
==29993==    by 0x11C6AB: validate_classifier_single (classifier.c:619)
==29993==    by 0x11E9C3: run_classifier (classifier.c:1371)   
==29993==    by 0x12BCF3: main (darknet.c:449) 
==29993==  Address 0x1ffeffea00 is on thread 1's stack    
==29993==  80 bytes below stack pointer 
==29993==

Строка ошибки просто указывает на "{", которая начинает строку функции "gemm_nt". Но я не знаю, почему она указывает на эту строку.

void gemm_nt(int M, int N, int K, float ALPHA, float *A, int lda, float *B, int ldb, float *C, int ldc)
{ // <- error line pointed by Valgrind (line:95)
    int i,j,k;
    #pragma omp parallel for
    for(i = 0; i < M; ++i){
        for(j = 0; j < N; ++j){
            register float sum = 0;
            for(k = 0; k < K; ++k){
                sum += ALPHA*A[i*lda + k]*B[j*ldb + k];
            }
            C[i*ldc + j] += sum;
        }
    }
}

Кроме того, я уже проверил "ошибку из-за границы". Как я проверяю, они не выходят за пределы массива.

...