Уже весь мозг себе сломал, не могу понять что происходит.
Есть массив классов, каждый хранит в себе свою длину и размер, указатель на указатель на массив на стеке функции и смещение в нем.
В один прекрасный момент, в одной из функций, при передаче нескольких структур, данные во всех трех превращаются в тыкву.
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: ------
Ошибка долго была незамечена, так как в дебаг-моде, несмотря на такую кашу, все работало, а релиз начал сыпаться.
Возможно это важно: отдельно модуль кодирования Рида-Соломона проходит все тесты в любых режимах, ошибки начали сыпаться при использовании кодирования внутри другого проекта.
Собственно, в дебаг режиме все пашет, а в релизе — куй.