【发布时间】:2021-02-28 02:55:04
【问题描述】:
这里我写了一个简单的加密函数。
这个变量不知何故以一个意外的值开始,在 For 循环之后保持不变。
代码如下:
int sim_encrypt( char* PreEncMsg , int spaces) {
int MsgLen = strlen(PreEncMsg);
int PostEncMsg = 0;
for (int iter1 = 0; iter1 < 3; iter1++) {
for (int iter2 = 0; iter2 < MsgLen; iter2++) { //Get every 4 character in the string
if (iter2 % spaces == 0) {
printf("[PROCCESS|%d] = %d\n", iter1 + 1 ,PreEncMsg[iter2]);
int PostEncMsg = PostEncMsg + PreEncMsg[iter2];
printf("Encrypted code = [%d]\n" , PostEncMsg);
}
}
memmove(PreEncMsg, PreEncMsg+1, MsgLen); //Removes the first chracter of the string
}
printf("Final result = [%d]\n" , PostEncMsg);
return PostEncMsg;
}
以下是输出
[PROCCESS|1] = 72
Encrypted code = [21931]
.
.
.
[PROCCESS|3] = 116
Encrypted code = [23293]
[PROCCESS|3] = 0
Encrypted code = [23293]
Final Result = [0]
如您所见,“PostEncMsg”最初被指定为“0”,但不知何故以“21858”开头。
在最终结果中,变量不知何故为“0”。
【问题讨论】:
-
代码中其他地方可能存在未定义行为,请提供A Minimal, Complete, and Verifiable Example (MCVE)。
-
memmove(PreEncMsg, PreEncMsg+1, MsgLen);这看起来很危险。它尝试从PreEncMsg+1开始读取MsgLen字符,但这似乎可能超出PreEncMsg缓冲区的末尾。 -
@kaylum,乍一看我也有同样的想法,但缓冲区最后包含空字符,它被 memmove 拾取并在字符串字符向左移动时有效地拖动终止符.
-
因此,循环最终将处理零字节值。我怀疑对于正确的操作,您真的想在遍历这些循环时跟踪终端空字节的位置,以便您可以在正确的点终止。每次调用
memmove,减少MsgLen。一次一个错误。 -
那么我应该用更安全的东西替换
memmove还是以某种方式减少MsgLen?