digitalmars.D.bugs - [Issue 233] New: Infinite loops with assembly crash DMD
- d-bugmail puremagic.com (119/119) Jul 01 2006 http://d.puremagic.com/issues/show_bug.cgi?id=233
- Thomas Kuehne (26/44) Jul 02 2006 -----BEGIN PGP SIGNED MESSAGE-----
- d-bugmail puremagic.com (9/9) Jul 24 2006 http://d.puremagic.com/issues/show_bug.cgi?id=233
http://d.puremagic.com/issues/show_bug.cgi?id=233
Summary: Infinite loops with assembly crash DMD
Product: D
Version: unspecified
Platform: PC
OS/Version: All
Status: NEW
Keywords: ice-on-valid-code
Severity: normal
Priority: P2
Component: DMD
AssignedTo: bugzilla digitalmars.com
ReportedBy: fvbommel wxs.nl
(Note: v0.162 isn't yet in the list of versions you can pick in Bugzilla, so I
selected 'unspecified'. But it's definitely 0.162)
This issue turned up in v0.162. Code that worked fine in v0.161 suddenly didn't
compile anymore.
Tested on both Windows & Linux.
No error is given by DMD itself.
On Windows, it says `The instruction at "0x00485bb9" referenced memory at
"0x00000030". The memory could not e "read".`
Linux, of course, just mentions `Segmentation fault`.
See comments for more details:
import std.stdio; // for the last cases
void infiniteAsmLoops()
{
/* This crashes DMD 0.162: */
for (;;) asm { hlt; }
/* It doesn't seem to matter what you use. These all crash: */
//for (;;) asm { mov EAX, EBX; }
//for (;;) asm { xor EAX, EAX; }
//for (;;) asm { push 0; pop EAX; }
//for (;;) asm { jmp infiniteAsmLoops; }
/* This is a workaround: */
for (bool a = true; a;) asm { hlt; } // compiles
/* But this isn't: */
//for (const bool a = true; a;) asm{ hlt; } // crashes DMD
/* It's not restricted to for-statements: */
//while(1) asm { hlt; } // crashes DMD
/* This compiles: */
{
bool a = true;
while(a) asm { hlt; }
}
/* But again, this doesn't: */
/*
{
const bool a = true; // note the const
while(a) asm { hlt; }
}
//*/
//do { asm { hlt; } } while (1); // crashes DMD
/* This, of course, compiles: */
{
bool a = true;
do asm { hlt; } while (a);
}
/* But predicably, this doesn't: */
/*
{
const bool a = true;
do asm { hlt; } while (a);
}
//**/
/* Not even hand-coding the loop works: */
/*
{
label:
asm { hlt; } // commenting out this line to make it compile
goto label;
}
//*/
/* Unless you go all the way: (i.e. this compiles) */
asm
{
L1:
hlt;
jmp L1;
}
/* or like this (also compiles): */
static void test()
{
asm { naked; hlt; jmp test; }
}
test();
/* Wait... it gets weirder: */
/* This also doesn't compile: */
/*
for (;;)
{
writef();
asm { hlt; }
}
//*/
/* But this does: */
//*
for (;;)
{
asm { hlt; }
writef();
}
//*/
/* The same loop that doesn't compile above
* /does/ compile after previous one:
*/
//*
for (;;)
{
writef();
asm { hlt; }
}
//*/
/* Note: this one is at the end because it seems to also trigger the
* "now it works" event of the loop above.
*/
/* There has to be /something/ in that asm block: */
for (;;) asm {} // compiles
}
--
Jul 01 2006
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 d-bugmail puremagic.com schrieb am 2006-07-01:http://d.puremagic.com/issues/show_bug.cgi?id=233(Note: v0.162 isn't yet in the list of versions you can pick in Bugzilla, so I selected 'unspecified'. But it's definitely 0.162) This issue turned up in v0.162. Code that worked fine in v0.161 suddenly didn't compile anymore. Tested on both Windows & Linux. No error is given by DMD itself. On Windows, it says `The instruction at "0x00485bb9" referenced memory at "0x00000030". The memory could not e "read".` Linux, of course, just mentions `Segmentation fault`. See comments for more details: import std.stdio; // for the last cases void infiniteAsmLoops() { /* This crashes DMD 0.162: */ for (;;) asm { hlt; } /* This is a workaround: */ for (bool a = true; a;) asm { hlt; } // compiles[snip] Added to DStress as http://dstress.kuehne.cn/compile/a/asm_01_A.d http://dstress.kuehne.cn/compile/a/asm_01_B.d http://dstress.kuehne.cn/compile/a/asm_01_C.d http://dstress.kuehne.cn/compile/a/asm_01_D.d http://dstress.kuehne.cn/compile/a/asm_01_E.d http://dstress.kuehne.cn/compile/a/asm_01_F.d http://dstress.kuehne.cn/compile/a/asm_01_G.d http://dstress.kuehne.cn/compile/a/asm_01_H.d http://dstress.kuehne.cn/compile/a/asm_01_I.d http://dstress.kuehne.cn/compile/a/asm_01_J.d http://dstress.kuehne.cn/compile/a/asm_01_K.d http://dstress.kuehne.cn/compile/a/asm_01_L.d http://dstress.kuehne.cn/compile/a/asm_01_M.d http://dstress.kuehne.cn/compile/a/asm_01_N.d http://dstress.kuehne.cn/compile/a/asm_01_O.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFEp/JaLK5blCcjpWoRAtdLAKCiI6x6WLXn5OLb78L8YM+WRUzw4ACfZJic 8OJd4P4aijSyjGY5dtJ8QRk= =t+nF -----END PGP SIGNATURE-----
Jul 02 2006
http://d.puremagic.com/issues/show_bug.cgi?id=233
fvbommel wxs.nl changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution| |FIXED
This bug seems to have silently disappeared in v0.163.
--
Jul 24 2006









Thomas Kuehne <thomas-dloop kuehne.cn> 