我在 C 中遇到了一个奇怪的错误。我们有以下代码,我首先在没有中间两个fprintf(f, "Passed PKLEN pklen: %u ,params->pklen: %u n", pklen, params->pklen);
函数的情况下尝试了它,并且得到了似乎是内存损坏的内容,pklen
停止等于params->pklen
。 当我添加这两个中间println
以确定实际损坏发生的位置时......两人在最后一个时相等。
void ntru_get_seed(uint8_t *msg, uint16_t msg_len, NtruIntPoly *h, uint8_t *b, const NtruEncParams *params, uint8_t *seed) {
FILE *f = fopen("log.txt", "a");
uint16_t oid_len = sizeof params->oid;
uint16_t pklen = params->pklen;
fprintf(f, "Passed PKLEN pklen: %u ,params->pklen: %u n", pklen, params->pklen);
fflush(f);
uint8_t bh[ntru_enc_len(params)];
fprintf(f, "Passed PKLEN pklen: %u ,params->pklen: %u n", pklen, params->pklen);
ntru_to_arr(h, params->q, (uint8_t*)&bh);
fprintf(f, "Passed PKLEN pklen: %u ,params->pklen: %u n", pklen, params->pklen);
uint8_t htrunc[pklen/8];
fprintf(f, "Passed PKLEN pklen: %u ,params->pklen: %u n", pklen, params->pklen);
fprintf(f, "bh: %u n", &bh);
fflush(f);
...
当然。添加对fprintf()
的调用会移动内存中代码的其他部分,并更改被覆盖的内容。
放回旧的损坏代码并使用调试器单步执行它,您可以看到被覆盖的内容。
还要打开所有可能的警告和错误,并修复您的代码,这样您就不会收到任何警告和错误。