2008-10-18 12 views
5

W poniższym przypadku wywołuję Func ze wskaźnikiem przekazanym do niego, ale w wywołanej funkcji parametr pokazuje wartość wskaźnika jako coś całkowicie fałszywego. Coś jak poniżej.Dlaczego wskaźnik zmienia się podczas przejścia funkcji?

bool flag = Func(pfspara);--> pfspara = 0x0091d910 

bool Func(PFSPARA pfspara) --> pfspara = 0x00000005 
{ 
    return false; 
} 

Dlaczego pfspara zmianę jakiegoś fałszywego wskaźnika? Nie mogę odtworzyć problemu w debugowaniu, tylko w produkcji.

Dzięki.

+0

Czy możesz zamieścić mały, pełny przykład programu, który demonstruje ten problem? Trudno powiedzieć, co może się dziać po prostu fragmentami kodu. –

+0

Jestem z tobą; zdefiniowanie typów jest absolutnym minimum dla tego rodzaju pytania (do podpisów funkcji włącznie). Czy to jest C, C++, czy coś innego? –

+0

Założono C++ z powodu bool. Jeśli się mylę, może zmienić tag. – Bernard

Odpowiedz

1

Ogólnie rzecz biorąc, nigdy nie powinno się tak stać. Problemy, które mogą powodować tego typu objawy, to niekompatybilność w opcjach kompilacji między modułem wywołującym a modułem wywołującym, błędne rzucanie wskaźników funkcji członkowskich lub po prostu błędy kompilatora. Musisz podać więcej szczegółów na temat swojego problemu: Pokaż prawdziwy kod, określ swój kompilator, określ, czym są flagi kompilacji debugowania i produkcji, itp.

8

Jeśli próbujesz usunąć kod zoptymalizowany na przykład w Visual Studio, nie zawsze można polegać na tym, że debugger poprawnie pokazuje wartości zmiennych - zwłaszcza jeśli zmienna nie jest używana, więc kompilator prawdopodobnie ją optymalizuje.

Spróbuj uruchomić to zamiast:

bool Func(PFSPARA pfspara) 
{ 
    printf("%x\n", pfspara); 
    return false; 
} 
0

Oprócz uwag Rasmus' uważam, że to jest na ogół warto sprawdzić, czy problem występuje w kompilacji debugowania oraz kompilacji uwalniania. Jeśli widzisz rzeczywiste problemy występujące w kompilacji wydania, ale nie w kompilacji debugowania, często jest to spowodowane błędem, który jest ujawniany przez procesy optymalizacyjne, takie jak niezainicjowana zmienna. Występuje realne niebezpieczeństwo podczas wykonywania większości testów w kompilacji debugowania, aby uniknąć problemu, który tu widzisz, a następnie wysłać kompilację wydania. IMO, jeśli nie masz dobrego zestawu testów regresji (najlepiej zautomatyzowanego), uniknęłbym wysyłki zoptymalizowanego kodu.

0

To brzmi jak problem z przepełnieniem bufora - coś nadpisuje tę zmienną. Ale jak wspomniano w innych odpowiedziach, nie ma sposobu, aby powiedzieć na pewno, bez rzeczywistego kodu do pracy.

0

To brzmi dla mnie tak, jakbyś pisał na stosie ... gdzieś w twoim kodzie bufor na stosie jest przepełniony, lub bierzesz adres obiektu na stosie i piszesz do niego po funkcja zwraca. Powoduje to uszkodzenie twojego stosu.

Może się to zdarzyć tylko w trybie zwolnienia, ponieważ alokacje stosów są różne z powodu optymalizacji i wykluczenia bloków "strażnika" używanych do sprawdzenia tego rodzaju stanu.