堆栈损坏;用字符串进行位操作; MSVC ++

时间:2012-02-21 17:42:46

标签: c++ visual-c++ stack

编辑:已解决。 zvbra似乎是正确的。只给4个字符加密就会导致问题。要知道为什么会这样,因为我被告知getline丢弃了最后一个角色......

伙计堆垛机你好。

我想首先说我试图自己调试并解决我的问题但是(可能是由于我对装配知识不足以及几乎所有的事情)我没有这样做。 所以我来到这里是希望你能帮助我:)。

我决定编写一个简单的(我认为)加密程序,更多的是测试而不是其他任何东西。

它分为两部分:

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中返回一个值,但是我已经解决了这个问题并且问题没有改变一点)一条消息弹出 up(在编译器中运行时)在调试模式下[检查屏幕截图]和3在发布模式下;

他们中的大多数都警告说,由于Crypter'变量'周围的堆栈损坏而导致错误。

我甚至没有被认为是一位经验丰富的程序员,所以我来到这里寻求你的帮助。

由于错误只在程序结束时弹出,这是否意味着清理有问题?

我完全迷失在这里。任何回复都表示赞赏。

注意:我还包括te调试器提供的部分汇编代码(相关部分); 希望它有一些用处(检查我对错误的'位置'的asm代码的内联注释);

随意批评我糟糕的代码:)(似乎有问题,因为生成的加密字符串从调试到发布模式不同?:/?。

-João

屏幕:

在我按ENTER(调试)之前程序的样子http://i44.tinypic.com/3ert2.png

在按ENTER(发布)之前程序的样子 http://i42.tinypic.com/2nld45f.png

按ENTER(调试)后显示错误 http://i41.tinypic.com/bhltoy.png

按ENTER(释放)后显示第1个错误 http://i42.tinypic.com/28lchac.png

按下ENTER(释放)后显示

第二个错误 http://i40.tinypic.com/2h3ttmw.png

按ENTER(释放)后显示

第3错误 http://i41.tinypic.com/2lc5suw.png

由debbuger提供的ASM代码 http://pastebin.com/TTXUn0T2

1 个答案:

答案 0 :(得分:2)

至少有一个错误:您需要为Crypt变量保留5个字符:您需要额外的空格来终止字符串。