From: Darkriser on
Desperately asking for help...
I'm working on a DLL. The main code parts are following:
(I'm trying to include only IMPORTANT lines)

// basic custom datatype
struct gideElement {
float (**eleFunc)(unsigned int, gideElement**); // pointer to
pointer to function
float (*eleFuncActual)(unsigned int, gideElement**); // pointer to
function
}

// custom functions
float f01 (unsigned int argCnt, gideElement **funcArgs) {}
float f02 (unsigned int argCnt, gideElement **funcArgs) {}

// static enumerator for functions
typedef float (*MyFunc)(unsigned int, gideElement**);
const MyFunc allFuncs[] = { NULL, &f01, &f02};

// allocate memory for array of objects
arrGide = (gideElement*) malloc(sizeof (gideElement) * modelSize); //
modelSize is "int"

// assign properties
(arrGide + i)->eleFuncActual = allFuncs[ f_code_actual ] // f_code_actual is
function's index retrieved from DB
(arrGide + i)->eleFunc = &((arrGide + i)->eleFuncActual); // eleFunc will
point to eleFuncActual

And now the problem. Once I compile the DLL without Whole Program
Optimization, link with Link Time Code Generation set to Default and Enable
Incremental Linking set to YES, the DLL works great.

However, once I set Release options (/GL for compiler and /ltcg
/INCREMENTAL:NO for linker), the following condition evaluates to TRUE even
if it's not!!!:

if ( *((arrGide + curIdx)->eleFunc) == allFuncs[53] )
{
// do some stuff only if we have eleFuncActual pointer pointing to
function having index 53
}

In Debugger everything works fine. This issue happens only with Release
configuration during Run-time.

Thanks many times....
From: Tim Roberts on
Darkriser <Darkriser(a)discussions.microsoft.com> wrote:
>
>Desperately asking for help...
>I'm working on a DLL. The main code parts are following:
>(I'm trying to include only IMPORTANT lines)
>...
>// assign properties
>(arrGide + i)->eleFuncActual = allFuncs[ f_code_actual ] // f_code_actual is
>function's index retrieved from DB
>(arrGide + i)->eleFunc = &((arrGide + i)->eleFuncActual); // eleFunc will
>point to eleFuncActual

Why would you write your expressions in that confusing manner, instead of
the more clear and ordinary way:

arrGide[i].eleFuncActual = allFuncs[ f_code_actual ];
arrGide[i].elefunc = &arrGide[i].eleFuncActual;

>And now the problem. Once I compile the DLL without Whole Program
>Optimization, link with Link Time Code Generation set to Default and Enable
>Incremental Linking set to YES, the DLL works great.
>
>However, once I set Release options (/GL for compiler and /ltcg
>/INCREMENTAL:NO for linker), the following condition evaluates to TRUE even
>if it's not!!!:
>
>if ( *((arrGide + curIdx)->eleFunc) == allFuncs[53] )
>{
> // do some stuff only if we have eleFuncActual pointer pointing to
>function having index 53
>}
>
>In Debugger everything works fine. This issue happens only with Release
>configuration during Run-time.

In that case, I guess you need to release your DLL without full
optimization. The optimizer is the most complicated part of the compiler,
which means it is where rarely-triggered bugs often lurk.

Is this a multi-threaded program? Is it possible you have a timing issue?
--
Tim Roberts, timr(a)probo.com
Providenza & Boekelheide, Inc.