Поврежденный стек;Битовые манипуляции со строками;MSVC ++ - PullRequest
1 голос
/ 21 февраля 2012

РЕДАКТИРОВАТЬ: решено. Звбра, похоже, прав. предоставление только 4 символов для склепа было причиной проблемы. Должен понять почему, потому что мне сказали, что getline отбросил последний символ ...

Здравствуйте, товарищи по укладке.

Я хочу начать с того, что я пытался отладить и решить свою проблему самостоятельно, но (вероятно, из-за моего недостатка знаний по сборке и почти всего в целом) я потерпел неудачу при этом. Поэтому я пришел сюда в надежде, что вы сможете мне помочь :).

Я решил написать простую (я думаю) программу шифрования, скорее тест, чем все остальное.

Он разделен на 2 части:

Alghorithm.h (Да, я знаю, что это орфографическая ошибка.), Который содержит класс 'Crypter'

#include <iostream>
#include <cmath>
using namespace std;

class Crypter
{
private:
    char Crypt[4];

public:
    Crypter()
    {
        getCrypt:
        cout<<"\nEnter a 4 character password: ";
        cin.getline(Crypt,5);
        if (cin.fail())
        {
            cout<<"\n\nError while reading password. 4 CHARACTERS MAXIMUM.\n\n";
            cin.sync(); cin.clear();
            goto getCrypt;
        }
    }

    void Encrypt(string& data)
    {

        for (int i=0; i<data.size();i++)
        {
            int offset=i;
            if (offset>5)
            {
                while (offset>5)
                {
                    offset-=6;
                }
            }
            float base = 2.0f;
            int testbit=pow(base,offset);//gets bit to test. Ex: if offset= 1 (2^1=2=binary 10) test bit is the 2nd least significant bit

            if (data[i]!=(data[i]^testbit)) //if testbit is 1 (tested using xOR)  
                {
                    data[i]= data[i]^Crypt[2];  //-> encrypt using  xOR Crypt[2]

                    testbit=pow(base,offset+2);

                    if(data[i]!=data[i]^testbit)// then if testbit is 1 (tested using xOR)  
                    {
                        data[i]=(data[i]^Crypt[0])+Crypt[3]; //-> encrypt using  xOR Crypt[0] then adding crypt[3]
                    }
                    else
                    {
                        data[i]=(data[i]^Crypt[1])+Crypt[1];//-> encrypt using  xOR Crypt[1] then adding crypt[1]
                    }
                }
            else
            {
                data[i]=((data[i]^Crypt[3])^Crypt[0])+Crypt[2];//-> encrypt using  xOR Crypt[1] then xOR Crypt[0] and finally adding crypt[1]
            }
        }
        return;
    }
};  

и main.cpp

#include "Alghorithm.h"
int main()
{
    string data="This sentence is going to be encrypted";
    Crypter Crypter;
    cout<<"\nEncrypting...";
    Crypter.Encrypt(data);
    cout<<"\n\nEncryption Successful\n\nEncrypted string: "<<data<<endl;
    cin.sync(); cin.clear();
}

Теперь вы, эксперты по программированию, должны думать, насколько неуклюжий мой алгоритм и что большинство частей даже не имеют смысла для алгоритма шифрования (что возможно) но притворитесь, что это хороший алгоритм, который имеет смысл.

Это проблема:

Компилируется. Это работает. Он шифрует предложение и печатает зашифрованные версия. Но прямо перед окончанием программы (на скриншотах видно, что я забыл чтобы вернуть значение в main, но я исправил это, и проблема не изменилась немного) выскакивает сообщение вверх (во время работы через компилятор) в режиме отладки [Проверка снимков экрана] и 3 в режиме выпуска;

Большинство из них предупреждают об ошибке, вызванной повреждением стека вокруг переменной переменной Crypter.

Я даже не близок к тому, чтобы считаться опытным программистом, поэтому я пришел сюда с просьбой о помощи.

Так как ошибка появляется только после завершения программы, значит ли это, что это проблема очистки?

Я полностью потерян здесь. Любые ответы приветствуются.

ПРИМЕЧАНИЕ. Я также включил часть кода сборки (соответствующую часть), предоставляемую отладчиком; Надеюсь, что это имеет какое-то применение (проверьте «встроенный» комментарий в asm-коде, чтобы узнать «позицию» ошибки);

Критика моего дерьмового кода по желанию:) (Кажется, есть проблема, поскольку результирующая зашифрованная строка отличается от режима отладки до выпуска?: /?.

-João

Экраны:

Как выглядит программа до того, как я нажму ENTER (отладка) : http://i44.tinypic.com/3ert2.png

Как выглядит программа до того, как я нажму ENTER (Release) http://i42.tinypic.com/2nld45f.png

Ошибка отображается после нажатия ENTER (отладка) http://i41.tinypic.com/bhltoy.png

1-ая ошибка, отображаемая после нажатия ENTER (отпускание) http://i42.tinypic.com/28lchac.png

2-ая ошибка, отображаемая после нажатия ENTER (отпускание) http://i40.tinypic.com/2h3ttmw.png

3-я ошибка отображается после нажатия ENTER (Отпуск) http://i41.tinypic.com/2lc5suw.png

Код ASM, предоставленный отладчиком http://pastebin.com/TTXUn0T2

1 Ответ

2 голосов
/ 21 февраля 2012

По крайней мере, одна ошибка: вам нужно зарезервировать 5 символов для переменной Crypt: вам нужно дополнительное пространство для завершения строки нулем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...