LINUX.ORG.RU

Повреждение данных после передачи структуры по указателю

 , , , ,


0

2

Уже весь мозг себе сломал, не могу понять что происходит.
Есть массив классов, каждый хранит в себе свою длину и размер, указатель на указатель на массив на стеке функции и смещение в нем.

В один прекрасный момент, в одной из функций, при передаче нескольких структур, данные во всех трех превращаются в тыкву.

void poly_mul(const Poly *p, const Poly *q, Poly *newp){
    newp->length = p->length + q->length - 1;
    memset(newp->ptr(), 0, newp->length * sizeof(uint8_t)); <-- Вот тут все ломается при попытке замемсетить левую область памяти.
    /* Compute the polynomial multiplication (just like the outer product of two vectors,
     * we multiply each coefficients of p with all coefficients of q) */
    for(uint8_t j = 0; j < q->length; j++){
        for(uint8_t i = 0; i < p->length; i++){
            newp->at(i+j) ^= mul(p->at(i), q->at(j)); /* == r[i + j] = gf_add(r[i+j], gf_mul(p[i], q[j])) */
        }
    }
}

void GeneratorPoly() {
    Poly *gen = polynoms + ID_GENERATOR;
    gen->at(0) = 1;
    gen->length = 1;

    Poly *mulp = polynoms + ID_TPOLY1;
    Poly *temp = polynoms + ID_TPOLY2;
    mulp->length = 2;

    for(int8_t i = 0; i < ecc_length; i++){
        mulp->at(0) = 1;
        mulp->at(1) = gf::pow(2, i);

        gf::poly_mul(gen, mulp, temp);
        *gen = *temp;
    }
}

int abstract_func() {
    /* Allocating memory on stack for polynomials storage */
    uint8_t stack_memory[MSG_CNT * msg_length + POLY_CNT * ecc_length * 2];
    
    // Каждый класс Poly хранит указатель на указатель memory и разыменовывает его для доступа к памяти на стеке.
    // Сам массив классов тоже расположен на стеке.
    this->memory = stack_memory;

    GeneratorPoly();
}

Алгоритм написанного описывать не буду, это в принципе не так уж важно, но если кому интересно, это кодирование Рида-Соломона.

Вывод дебаггера перед вызовом poly_mul:
gen: 0x41a7c2
gen->length: 1
gen->size: 16
gen->offset: 116
gen->memory: 0x41a7a0
*gen->memory: 0x7fffc1f67550
Для 2х других аналогично

Вывод дебаггера внутри poly_mul
gen: 0x41a7c2
gen->length: 1
gen->size: 2
gen->offset: 4
gen->memory: 0x403020000000000
*gen->memory: ------

Ошибка долго была незамечена, так как в дебаг-моде, несмотря на такую кашу, все работало, а релиз начал сыпаться.

Возможно это важно: отдельно модуль кодирования Рида-Соломона проходит все тесты в любых режимах, ошибки начали сыпаться при использовании кодирования внутри другого проекта.
Собственно, в дебаг режиме все пашет, а в релизе — куй.

★★★★★

Последнее исправление: mersinvald (всего исправлений: 2)

Ответ на: комментарий от anonymous

bzero уже давно deprecated
= {0} только при инициализации подходит (до C11, ЕМНИП, но оно таки для структур, а не для областей памяти)
mmap вообще при чем?

Короче, анонимуся, как обычно несут какой-то бессвязный бред

mersinvald ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.