Стек вокруг переменной поврежден

Он вылетает с ошибкой отладки и говорит, что стек вокруг переменной '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 ответ

Решение

Здесь я вижу две проблемы:

  1. Мне кажется, что вы рассчитываете размер InMessage Буфер неправильно в вашем hammingCode функция:

    int len = strlen(InMessage), i = 0, j = 0;
    

    strlen Функция определяет длину строки, находя позицию первого нулевого терминатора. Если InMessage не очищается, тогда это может дать вам некоторые странные длины, поскольку оно будет содержать случайную последовательность байтов. И наоборот, если вы очистили буфер, то len будет 0.

    Чтобы преодолеть эту проблему, для вызывающей стороны лучше указать размер буфера:

    int hammingCode (char *InMessage, size_t messageSize)
    

    И использовать messageSize на месте len,

    Рекомендуется использовать эту же стратегию для двух других функций, так как в настоящее время существует вероятность переполнения предоставленных буферов.

  2. Исходя из предыдущей проблемы, может случиться так, что decode Функция пишет за пределами буфера. Предоставление длины буфера decode и было бы неплохо добавить соответствующие проверки, чтобы гарантировать, что функция не пишет вне заданных границ.

Другие вопросы по тегам