Author: Bruce Moreland
Date: 12:57:28 12/31/01
Go up one level in this thread
On December 31, 2001 at 15:47:25, Scott Gasch wrote:
>Hi all,
>
>I'm pulling my hair out right now with what looks like an MSVC code gen bug.
>Would someone please sanity check the following code? Maybe I'm missing
>something?
How many elements are in "iRanks"? If the answer is 8, there is your bug.
In Pascal, arrays are usually 1..N. In C, they are typically 0..N-1. Your
asserts indicate that you may be thinking in Pascal.
I have more ideas once you indicate that there are more than 8 things in that
array.
bruce
>
> j = 1;
> do
> {
> ASSERT(j > 0);
> ASSERT(j < 9);
>
> if (pHash->iFiles[WHITE][j] != 0)
> {
> //
> // Look for White doubled and tripled (etc...) pawns.
> //
> ASSERT(pHash->iFiles[WHITE][j] >= 0);
> ASSERT(pHash->iFiles[WHITE][j] <= 8);
> if (pHash->iFiles[WHITE][j] > 1)
> {
> iDoubled[WHITE] += pHash->iFiles[WHITE][j];
> }
>
> //
> // We can detect White isolated pawns by looking at files.
> //
> if ((pHash->iFiles[WHITE][j - 1] == 0) &&
> (pHash->iFiles[WHITE][j + 1] == 0))
> {
> //
> // It's isolated, see if it's exposed.
> //
> if (pHash->iFiles[BLACK][j] == 0)
> {
>#ifdef DEVAL
> EvalTrace(WHITE, PAWN, 0, g_iIsolatedExposedPawn,
> "isolated exp file %c",
> 'A' + j - 1);
>#endif
> iScore[WHITE] += g_iIsolatedExposedPawn;
> }
> iIsolated[WHITE] += pHash->iFiles[WHITE][j];
> ASSERT(iScore[WHITE] < 1500);
> }
>
> //
> // Look for passed pawns...
> //
> i = pHash->iRanks[WHITE][j];
> ASSERT(i > 1);
> ASSERT(i < 8);
>
>This last bit (i = pHash->iRanks[WHITE][j]) is causing an access violation. The
>problem is the code that MSVC generates for this seems to be wrong. It's got
>the address of pHash in esi and the loop counter in ecx. So when it accesses
>the pHash->iFiles[WHITE][j] array it uses code like this:
>
>100236F1 mov al,byte ptr [esi+ecx+16h] // esi = &pHash, ecx = loop var
>
>This code is right. Offset 16h in pHash is the start of the iFiles[WHITE] and
>it's a byte array.
>
>Meanwhile it has never put &pHash on the stack and in the offending line above
>it generates this code:
>
>1002374A mov edi,dword ptr [esp+24h] // get pHash? pHash+20h? what?
>1002374E xor edx,edx
>10023750 mov dl,byte ptr [edi+ecx+0Ah] // boom
>
>The address of pHash is still sitting in esi at this point. It could very well
>have generated code that looked like this:
>
>xor edx,edx
>mov edx,byte ptr [esi+ecx+20h]
>
>What it instead reads from the stack into edi is NULL. The address of pHash is
>nowhere on the stack as it has never been written there. Even if the address of
>pHash magically somehow got into edi, the expression [edi+ecx+0Ah] would not
>equate to pHash->iRanks[WHITE][j]. For that to work edi needs to be the address
>of the start of the iRanks array in pHash... or &pHash + 20h.
>
>This goes away when I turn off global optimizations. I'm working with MSVC6.0
>sp5. Any clue what's going on here? Eugene? Anyone? Help!
>
>Scott
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.