Compiler Problem (vs c++ 2011)

09/01/2013 04:04 Crack-wtf#1
Ich habe ein Problem mit meinem Compiler.
Er erstellt manchmal falschen Code.

Das ist jetzt schon das ca. 3. mal dass mir das passiert und jedesmal hab ich einen schlechten Workaround gemacht.

Das problem ist, wenn ich kleine Funktionen habe, dass sich der Compiler manchmal entscheidet die funktion einfach direkt so in die funktion zu packen, die sie callt.

Hier die stelle:

C++


Und hier die stelle in ASM:



Und hier die Funktion die gecallt wird:


Hoffe jemand kann mir weiterhelfen :D
09/01/2013 06:09 Dr. Coxxy#2
mit "__declspec(noinline)" vor der funktionssignatur kannst du (zmdst bei vcc) verhindern, dass der compiler inlined - auch wenn ich nicht verstehe wieso der compiler da anscheinend fehlerhaften code produziert.
ka ist aber auch erst 6 uhr morgens, grad erst aufgestanden, ich guck gleich nochmal rüber.

EDIT:
sicher, dass die klammersetzung hier genauso ist wie in dem code den du kompiliert hast?

EDIT2:
außerdem sind 0 und 1 keine bools die du da returnst - das ist sehr unschön ;)

EDIT3:
ok, verstehe ich jetzt auch nicht, bei mir im testprogramm erzeugt er vollkommen korrekt ein lea eax, [esi-1]:

Code:
	for( int i = 1; i <= 10; i++)
00A7100D 8B 3D A4 20 A7 00    mov         edi,dword ptr [__imp__printf (0A720A4h)]  
00A71013 A3 7C 33 A7 00       mov         dword ptr [cClient (0A7337Ch)],eax  
00A71018 BE 01 00 00 00       mov         esi,1  
00A7101D 8D 49 00             lea         ecx,[ecx]  
	{
		if(!IsValidIndex(i))   //Hier schriebt er die Funktion direkt rein und es entsteht ein fehler.
00A71020 85 F6                test        esi,esi  
00A71022 74 25                je          main+49h (0A71049h)  
00A71024 83 FE 0A             cmp         esi,0Ah  
00A71027 7F 20                jg          main+49h (0A71049h)  
00A71029 8B 0D 7C 33 A7 00    mov         ecx,dword ptr [cClient (0A7337Ch)]  
00A7102F 8D 46 FF             lea         eax,[esi-1]  
00A71032 03 C0                add         eax,eax  
00A71034 83 BC C1 E4 AF 2E 00 00 cmp         dword ptr [ecx+eax*8+2EAFE4h],0  
00A7103C 74 0B                je          main+49h (0A71049h)  
			continue;

		printf("Index: %d is valid!\n", i);
00A7103E 56                   push        esi  
00A7103F 68 68 23 A7 00       push        offset ___xi_z+2A0h (0A72368h)  
00A71044 FF D7                call        edi  
00A71046 83 C4 08             add         esp,8  

	for( int i = 1; i <= 10; i++)
00A71049 46                   inc         esi  
00A7104A 83 FE 0A             cmp         esi,0Ah  
00A7104D 7E D1                jle         main+20h (0A71020h)  
	}
EDIT4:
kannst mal versuchen die zeile:
Code:
DWORD tmpBase = *(DWORD*)((index-1)*16+4 + 0x002EAFE0 + cClient);
in mehrere zeilen zu splitten, vllt gibts da bei dir i.nen parser fehler - seltsam.

EDIT5:
was haste denn für ne IDE/compiler?

EDIT6:
wenn das da 1:1 der code ist den du kompiliert hast gibts i-nen parserfehler mit der klammerung, würde ich wie gesagt mal die zeile aufsplitten - aber komisch, dass das nur beim inlinen passieren soll.
09/01/2013 07:56 Crack-wtf#3
Quote:
Originally Posted by Dr. Coxxy View Post
...
Danke dass du dir die mühe gemacht hast ^^

Ich bin den Fehler wiedermal mit einem Workaround umgangen.
(Klasse Grob nachgebaut und anschließend reinterpretiert.)

Hab die ganze nacht lang rumprobiert, bis ich keinen Bock mehr hatte.
Habe alles mögliche Probiert, und es kam immer wieder das selbe Problem.

Naja kann closed werden ^^
09/01/2013 08:31 Dr. Coxxy#4
Quote:
was haste denn für ne IDE/compiler?
10char
09/01/2013 09:04 Crack-wtf#5
Visual Studio 2010 Ultimate (x86)