为什么会出现内存损坏...只有当我们不打印变量被破坏时?

时间:2016-07-12 18:24:37

标签: c memory-corruption

我在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);
...

1 个答案:

答案 0 :(得分:7)

不确定。添加对fprintf()的调用会将代码的其他部分移动到内存中并更改被覆盖的内容。

放回旧的破解代码并使用调试器逐步执行它,您可以查看被覆盖的内容。

同时打开所有可能的警告和错误并修复您的代码,这样您就不会得到任何警告和错误。