Thread overview
code generation bug?
Mar 17, 2006
Scott Mayo
Mar 20, 2006
Heinz Saathoff
Re: code generation bug? [not]
Mar 21, 2006
Scott Mayo
March 17, 2006
My first day using dmc. I fed it some C++ code that was known to be well-behaved; the resulting .exe crashed. I couldn't get the assembler listing working, but I was able to move code and get the correct behaviour.

The crashing code:

switch (p->cmd) //dies around here
{
case CMD_Set:
setpins(p->pinset, p->set.onV);
return 0;

case CMD_SetFreq:
for (i = 0; i < 5; ++i)
..etc


The working code, which is equivalent:

//DigitalMars compiler generates a jump to address 0
//if this is a case in the switch
//no problem as an If, though.
#if 01
if (p->cmd == CMD_Set)
{
setpins(p->pinset, p->set.onV);
return 0;
}
#endif

switch (p->cmd)
{
case CMD_Set:
setpins(p->pinset, p->set.onV);
return 0;

case CMD_SetFreq:
for (i = 0; i < 5; ++i)


I'm new here - does anyone do support? I can make the source available; the
compile command line was just
dmc mycode.cpp

The code uses no explicit new/delete/malloc/stl/iostreams/overloading or any interesting trickery. There is some inline asembler, but when I compile and run it as a console app using the microsoft IDE, that same assmbler runs just fine, so I don't think it's doing any damage. Really looks like a compiler issue to me. Help?

Another trick that worked, then the code was part of the switch statement, was to put a fprintf in the case.


March 20, 2006
Hello,

Scott Mayo wrote...
> My first day using dmc. I fed it some C++ code that was known to be well-behaved; the resulting .exe crashed. I couldn't get the assembler listing working, but I was able to move code and get the correct behaviour.
> 
> The crashing code:
> 
> switch (p->cmd) //dies around here
> {
> case CMD_Set:
> setpins(p->pinset, p->set.onV);
> return 0;
> 
> case CMD_SetFreq:
> for (i = 0; i < 5; ++i)
> ..etc


Mybe an uninitialized pointer p? What makes me think it's this kind of error is that your code works when adding the extra statements. I know that adding/deleting portions of code can influence the data arrangement on the stack and make uninitialized pointers crash/not crash the program.


- Heinz
March 21, 2006
>Mybe an uninitialized pointer p? What makes me think it's this kind of error is that your code works when adding the extra statements.

No, but it was my error - I went off the end of an array and clobbered the first entry of the switch jump table. The compiler is not to blame.