簡體   English   中英

線程C ++,訪問沖突讀取位置x錯誤

[英]Threads C++, Access Violation reading location x error

平台:Windows 7
我正在開發一個針對已知文本密碼攻擊的項目,其中:

  • 主流程創建n個子流程
  • 子進程解密一個加密的字符串,根據子進程的數量對密鑰子空間進行分區
  • 子進程之間的通信是通過靜態變量進行的

for(int i = 0; i<info.totalNumberOfChildren; i++)
{       
  startChild( &info.childInfoList[i]);
  //_beginthread(startChild, 0, &info.childInfoList[i]);        
}

上面的代碼可以正常工作,因為:

  • 第一個孩子開始執行,出於測試目的,將密鑰設置為數字(例如8),該數字位於第一個孩子的分區內,因此第一個孩子找到該密鑰,報告並設置為killSwitch為真。
  • 由於killSwitch為true,因此即使在檢查第一個鍵之前,也會關閉所有其他創建的子項。

但是,當我這樣做時:

for(int i = 0; i<info.totalNumberOfChildren; i++)
{

    //startChild( &info.childInfoList[i]);
    _beginthread(startChild, 0, &info.childInfoList[i]);

}

我收到訪問沖突錯誤。 我的錯誤來源可能是什么?

編輯:我將嘗試共享盡可能相關的代碼

startChild執行以下操作:

void startChild( void* pParams)
{
    ChildInfo *ci = (ChildInfo*)pParams;
    // cout<<"buraya geldi"<<endl;
    ChildProcess cp(*ci);
    // write to log
    cp.completeNextJob();
}

childInfo保存以下內容://頭文件

class ChildInfo
{
public:

    ChildInfo();
    ChildInfo(char * encrypted, char * original, static bool killSwitch, int totalNumOfChildren, int idNum, int orjLen);
    void getNextJob();
    bool keyIsFound();
    Des des;
    void printTest();
    bool stopExecution;
    bool allIsChecked;
    char * encyptedString;
    char * originalString;
    int id;
    int orjStrLen;

private:

    int lastJobCompleted;
    int totalNumberOfChildren;
    int jobDistBits;

};

completeNextJob()執行以下操作:

void ChildProcess::completeNextJob()
{
cout<<"Child Id : "<<info.id<<endl;
// cout<<"Trying : "<<info.encyptedString<<endl; // here I got an error


char * newtrial = info.encyptedString;
char * cand = info.des.Decrypt(newtrial); // here I also get an error if I comment out

/*
cout<<"Resultant : "<<cand<<endl;
cout<<"Comparing with : "<<info.originalString<<endl;
*/

bool match = true;
for(int i = 0; i<info.orjStrLen; i++)
{
    if(!(cand[i] == info.originalString[i]))
        match = false;
}

if(match)
{
    cout<<"It has been acknowledged "<<endl;
    info.stopExecution = true;
    return;
}
else
{
    if(!info.keyIsFound())
    {
        if(!info.allIsChecked)
        {
            info.getNextJob();
            completeNextJob();
        }
        else
        {

        }
    }
    else
    {

    }
}

}

crypto()方法執行以下操作:

char * Des::Decrypt(char *Text1)
{
  int i,a1,j,nB,m,iB,k,K,B[8],n,t,d,round;
  char *Text=new char[1000];
  unsigned char ch;
  strcpy(Text,Text1); // this is where I get the error
  i=strlen(Text);
keygen();
int mc=0;
  for(iB=0,nB=0,m=0;m<(strlen(Text)/8);m++) //Repeat for TextLenth/8 times.
  {
 for(iB=0,i=0;i<8;i++,nB++)
  {
     ch=Text[nB];
     n=(int)ch;//(int)Text[nB];
     for(K=7;n>=1;K--)
     {
      B[K]=n%2;  //Converting 8-Bytes to 64-bit Binary Format
      n/=2;
     } for(;K>=0;K--) B[K]=0;
   for(K=0;K<8;K++,iB++) total[iB]=B[K]; //Now `total' contains the 64-Bit binary format of 8-Bytes
  }
IP(); //Performing initial permutation on `total[64]'
for(i=0;i<64;i++) total[i]=ip[i]; //Store values of ip[64] into total[64]

for(i=0;i<32;i++) left[i]=total[i]; //        +--> left[32]
                    // total[64]--|
for(;i<64;i++) right[i-32]=total[i];//            +--> right[32]
  for(round=1;round<=16;round++)
  {
Expansion(); //Performing expansion on `right[32]' to get  `expansion[48]'
xor_oneD(round);
substitution();//Perform substitution on xor1[48] to get sub[32]
permutation(); //Performing Permutation on sub[32] to get p[32]
xor_two(); //Performing XOR operation on left[32],p[32] to get xor2[32]
for(i=0;i<32;i++) left[i]=right[i]; //Dumping right[32] into left[32]
for(i=0;i<32;i++) right[i]=xor2[i]; //Dumping xor2[32] into right[32]
 } //rounds end here
for(i=0;i<32;i++) temp[i]=right[i]; // Dumping   -->[ swap32bit ]
for(;i<64;i++) temp[i]=left[i-32];  //    left[32],right[32] into temp[64]

inverse(); //Inversing the bits of temp[64] to get inv[8][8]
/* Obtaining the Cypher-Text into final[1000]*/
       k=128;   d=0;
    for(i=0;i<8;i++)
    {
      for(j=0;j<8;j++)
      {
        d=d+inv[i][j]*k;
        k=k/2;
      }
       final[mc++]=(char)d;
       k=128;   d=0;
    }
  } //for loop ends here
  final[mc]='\0';
  char *final1=new char[1000];
  for(i=0,j=strlen(Text);i<strlen(Text);i++,j++)
    final1[i]=final[j]; final1[i]='\0';
  return(final);
}

調試器是您最好的朋友,請嘗試使用它並逐步檢查可能導致此訪問沖突的原因。 我認為info.encyptedString未正確初始化並指向未分配的內存,但是我不能確定,因為您沒有顯示這部分代碼。 當然,您必須使用關鍵部分或互斥量或信號量之類的同步對象來保護共享資源( info )。

我不知道,基本問題對我來說似乎很簡單。 您有多個同時執行的線程,它們通過* pParams訪問相同的信息,該信息大概是ChildInfo類型的,因為這就是將其強制轉換為的信息。 該信息必須在程序的其他位置(可能在主線程中)被訪問。 這正在破壞某些內容,該內容可能與Text1或info.id有關,也可能與之無關,這些錯誤通常是“非本地的”,並且由於這個原因很難調試。 因此,開始對整個線程進行互斥保護(在您的初始循環內),然后通過反復試驗將關鍵部分歸零,即,互斥保護盡可能小的代碼區域,而不會產生錯誤。

Windows試圖告訴您程序為何崩潰。 請使用調試器查看Windows在說什么。 位置X很重要:它應該告訴您程序是在取消引用NULL,溢出緩沖區還是進行其他操作。 崩潰時的調用堆棧也非常重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM