2013-03-04 4 views
-4

릴리스 버전 문제와 관련하여 많은 답변을 찾았지만 그 반대는 없습니다.C++ 색인 변수가 디버그 버전에서 근본적으로 변경됨

while(index < 7 && FlagIsUp) 
{ 
    // process 
    Inner Loop 
    Inner Inner Loop 
    Array[index] = number; 
    ++index; 
} 

문제점 인덱스를 size_t위한 int16_t 대 17,209 및 1,133,165,442 6 (마지막 반복)에서 급격하게 변화이다

I는 다음과 유사한 루프를 갖는다. 루프 안쪽에 ++ 인덱스를 제외하고 인덱스가 변경됩니다. 나는 for를 for로 바꾸었고 여전히 발생합니다.

디버그 모드에서만 발생하며 릴리스 버전에서는 문제없이 완료됩니다.

색인에 volatile도 추가했으며 결과는 동일했지만 여전히 넘쳤습니다.

어떤 아이디어, 포인터, 감사하겠습니다. 어떤 이론을 환영 할 수 있도록 버그의 작업 복사본을 제공 할 수는 없지만 문제점을 찾기 위해 옵션을 다 써 버리고 싶습니다.

편집 : 예 죄송합니다. 나는 거의 정보를주지 않았다. 우선 QNX Momentics 버전 : 4.6.0을 사용하고 있으며 디버거는 GNU Compiler Collection 4.3.3의 일부입니다.

지금 내부 루프는 이것이다 :

cSignalNoIndex = 0; 
    while ((cSignalNoIndex < (2 * NO_PHASES + 1)) && !ShutDownFlag) 
    { 
    wSF0 = 0; 
    wExtSF = 0; 
    dwSFAcc = 0; 
    dwExtSFAcc = 0; 
    std::string SignalNo= " Waveform number " + Tool::toString(cSignalNoIndex); 
    Results[cSignalNoIndex].printWaveForm(SignalNo); 
    // Prepare Input vectors for FFT compute 
    cComponent = 0; 
    while (cComponent < (HCYCLE_SAMPLES << 1)) 
    { 
     awReal[cComponent] = static_cast<int>(Results[cSignalNoIndex].WaveForm[cComponent/64][cComponent % 64]); 
     awImg[cComponent] = 0; 
     pwSource++; 
     cComponent++; 
    } 
    Results[cSignalNoIndex].printWaveForm(SignalNo); 
    // Get FFT (forward) 
    // Changed the wPwr from 7 to something else 
    iFft(&awReal[0], &awImg[0], wPwr, 1); 
    Results[cSignalNoIndex].printWaveForm(SignalNo); 
    // Compute magnitudes 
    //fMult = pInBlock3->fMult[cSignalNoIndex];   // Get Multiplier 
    fMult = 1; 
    for (cComponent = 0; cComponent < HCYCLE_SAMPLES && !ShutDownFlag; cComponent++) 
    { 
     int64_t dlOp = static_cast<int64_t>(awReal[cComponent]) * awReal[cComponent] + static_cast<int64_t>(awImg[cComponent]) * awImg[cComponent]; 
     dlOp <<= 1;  // Apply sqrt(2) term to result 
     dlOp = static_cast<int>(fMult * isqrt64(dlOp)); 

     // Store into FFT object 
     oFFTMag3.wFFT[cSignalNoIndex][cComponent] = static_cast<int16_t>(dlOp); 

     // Set Base frequency magnitude and accumulate harmonics 
     if (cComponent == 1) // Base 
     { 
     wSF0 = dlOp; 

     if(cSignalNoIndex == 6) 
     { 
      wRefMagnitude = static_cast<int16_t> (0.4 * wSF0); 
     } 

     if(awReal[1] != 0) // Also get phase for Base 
     { 
      dfPhase = std::atan((double)((float)awImg[1]/awReal[1])) * 180.0/PI; 
     } 
     else 
     { 
      if(awImg[1] >= 0) 
      { 
      dfPhase = 90.0; 
      } 
      else 
      { 
      dfPhase = -90.0; 
      } 
     } 

     if(awReal[1] < 0) // convert to 2*PI range 
     { 
      dfPhase += 180.0; 
     } 
     else if(awImg[1] < 0) 
     { 
      dfPhase += 360.0; 
     } 
     //// THIS IS THE LINE 
     fPhase[cSignalNoIndex] = dfPhase; ////////// WTF! cSignalNoIndex = 6 - cComponent = 2 
     /// HERE cSignalNoIndex is overflown 
     } 
    } 
+3

"내부 루프"및 "내부 내부 루프"의 내용없이 도울 방법이 없습니다 ... –

+1

"이론", 스택을 손상 시켰습니다. – Chad

+0

어쩌면 스택을 어딘가에 스매싱하고 있습니다. 실제 코드를 보여 주면 도움이 될 것입니다. –

답변

3

당신은 정말 게시하지 않은만큼 코드 그러나 나의 가장 좋은 방법은 Array[index] = number 어떤 시점에서 index을 덮어이다. 사실 (경우에 따라 디버깅 할 때)이 "정의되지 않은 동작"의 좋은 예입니다.

+4

코드가 다음과 같은 경우, 예를 들면 :'int index; int array [2]; array [2] = 1234567;'그렇다면 인덱스는 1234567로 설정 될 가능성이 높습니다. @ cnictuar의 설명이 나오기까지 정확히 영향을 줄 수있는 컴파일러와 아키텍처 문제가 있지만 요점은 여러분이 악용하는 것입니다 너의 스택. 이것을 확인하는 간단한 방법은'index'를 전역으로 만들어 문제가 사라지는지 확인하는 것입니다. 그렇지 않으면 (또는 충돌과 같은 다른 것이 발생하는 경우), 그렇다면 여러분이하지 말아야 할 곳을 쓰고 있다는 것이 확실합니다. – mah

+0

당신이 옳다면, 변수 global이 변수가 변경되는 것을 막습니다. – Claudiordgz

관련 문제