Стек вокруг переменной поврежден
Он вылетает с ошибкой отладки и говорит, что стек вокруг переменной 'code' был поврежден. Это код для лаборатории кода Хэмминга, которую я делаю. Входной файл - это просто набор из 1 и 0 в одной строке. Почему это сбой?
void processFile(FILE* read, char* InMessage) {
int i = 0, count = 0;
for (i = 0; !feof(read); i++) {
InMessage[i] = fgetc(read);
count++;
}
InMessage[count] = '\0';
}
void hammingCode(char* InMessage) {
int len = strlen(InMessage), i = 0, j = 0;
char code[12], temp[1000];
temp[0] = '\0';
for (i = 0, j = 0; i < len; i++, j++) {
code[j] = InMessage[i];
if (j == 10) {
j = 0;
decode(code);
code[11] = '\0';
strcat_s(temp, sizeof(char)*1000, code);
}
}
strcpy_s(InMessage, sizeof(char)*1000, temp);
}
void decode(char* codeWord) {
int i = 0, j = 0, parity[4] = {0}, diffParity[4] = {0}, twoPower = 0, readNSkip = 0, bitSum = 0;
for (i = 0; i < 4; i++) {
twoPower = (int)pow((double)2, i);
for (j = twoPower; j <= 12; j++) {
if (readNSkip <= twoPower) {
if (j != twoPower) {
parity[i] += codeWord[j-2] - 48;
}
readNSkip++;
}
else {
if (readNSkip == twoPower*2)
readNSkip = 0;
readNSkip++;
}
}
if (parity[i] % 2 == 0)
parity[i] = 0;
else
parity[i] = 1;
if ((codeWord[twoPower-1] - 48) != parity[i])
diffParity[i] = 1;
}
for (i = 0; i < 4; i++) {
twoPower = (int)pow((double)2, i);
bitSum += diffParity[i]*twoPower;
}
codeWord[bitSum] = !codeWord[bitSum];
}
1 ответ
Здесь я вижу две проблемы:
Мне кажется, что вы рассчитываете размер
InMessage
Буфер неправильно в вашемhammingCode
функция:int len = strlen(InMessage), i = 0, j = 0;
strlen
Функция определяет длину строки, находя позицию первого нулевого терминатора. ЕслиInMessage
не очищается, тогда это может дать вам некоторые странные длины, поскольку оно будет содержать случайную последовательность байтов. И наоборот, если вы очистили буфер, тоlen
будет 0.Чтобы преодолеть эту проблему, для вызывающей стороны лучше указать размер буфера:
int hammingCode (char *InMessage, size_t messageSize)
И использовать
messageSize
на местеlen
,Рекомендуется использовать эту же стратегию для двух других функций, так как в настоящее время существует вероятность переполнения предоставленных буферов.
Исходя из предыдущей проблемы, может случиться так, что
decode
Функция пишет за пределами буфера. Предоставление длины буфераdecode
и было бы неплохо добавить соответствующие проверки, чтобы гарантировать, что функция не пишет вне заданных границ.