Thread View: pl.comp.lang.c
3 messages
3 total messages
Started by Michal A. Polak
Fri, 14 Nov 1997 16:47
Dlaczego to dziala?!?!?!?
Author: Michal A. Polak
Date: Fri, 14 Nov 1997 16:47
Date: Fri, 14 Nov 1997 16:47
56 lines
2240 bytes
2240 bytes
Jest nastepujacy program (uruchomiony na linuxie - gnu cc - oraz win95
skompilowany builderem, po niewielkich przerobkach):
---------------------------------------------------------------
#include<stdio.h>
class CCos
{
public:
int a;
int b;
int ple() {return a*b;}
};
typedef struct
{
CCos *me;
char c[8];
} TCos;
int main()
{
TCos ala;
ala.me = (CCos *) &ala;
((CCos *)&ala)->a = 2;
((CCos *)&ala)->b = 3;
printf("%d\n",((CCos*) &ala)->ple());
return 0;
}
---------------------------------------------------------------
Zdaje sobie sprawe, ze calosc jest z deka bezsensowna, ale sa powody,
dla ktorych cos takiego bylo mi potrzebne - tzn. ze chcialem "wsadzic"
obiekt klasy CCos w zmienna strukturalna TCos.
Pytanie zostalo przedstawione w tutule, z tym ze nie chodzi mi o
dzialanie kodu programu przedstawionego powyzej, lecz po malych
zmianach, tj, gdy:
- w strukturze TCos jedna lub obie zmienne zostaje zakomentowane
- i/lub wywalmy linie: ala.me = (CCos *) &ala;
Po wykonaniu przy najmniej jednego z powyzszych krokow program powinien
sie sypnac, co nie nastepuje.
Proste wytlumaczenie jest takie, ze wszystkie odwolania do zmiennej ala
odnosza sie do "gdzies" na stercie, ktora nalezy do programu, zatem nie
wystapi blad ochrony.
Moze sie myle i bylbym wdzieczny za korekcje, a najcheteniej za jakas
sugestie, ktora by jednak przyczynila sie do wywalenia programu :-).
Wydaje sie dziwne (a moze nie?), ze program _zawsze_ na _roznych_
systemach, trafia w obszar sterty (jak przyjalem), a moze jest to
"ochrona" wbudowana w kompilator???
Pozdrawiam,
Michal
Re:Niekoniecznie to dziala
Author: Karol Wojtiuk
Date: Fri, 14 Nov 1997 17:55
Date: Fri, 14 Nov 1997 17:55
94 lines
3670 bytes
3670 bytes
Michal A. Polak wrote in message <346C80A9.B046A500@bss.com.pl>...
>Jest nastepujacy program (uruchomiony na linuxie - gnu cc - oraz win95
>skompilowany builderem, po niewielkich przerobkach):
>
>---------------------------------------------------------------
>#include<stdio.h>
>
>class CCos
>{
>public:
> int a;
> int b;
> int ple() {return a*b;}
>};
>
>typedef struct
>{
> CCos *me;
> char c[8];
>} TCos;
>
>int main()
>{
> TCos ala;
> ala.me = (CCos *) &ala;
> ((CCos *)&ala)->a = 2;
> ((CCos *)&ala)->b = 3;
>
> printf("%d\n",((CCos*) &ala)->ple());
>
> return 0;
>}
>
>---------------------------------------------------------------
>
>Zdaje sobie sprawe, ze calosc jest z deka bezsensowna, ale sa powody,
>dla ktorych cos takiego bylo mi potrzebne - tzn. ze chcialem "wsadzic"
>obiekt klasy CCos w zmienna strukturalna TCos.
>Pytanie zostalo przedstawione w tutule, z tym ze nie chodzi mi o
>dzialanie kodu programu przedstawionego powyzej, lecz po malych
>zmianach, tj, gdy:
>- w strukturze TCos jedna lub obie zmienne zostaje zakomentowane
>- i/lub wywalmy linie: ala.me = (CCos *) &ala;
>
>Po wykonaniu przy najmniej jednego z powyzszych krokow program powinien
>sie sypnac, co nie nastepuje.
>Proste wytlumaczenie jest takie, ze wszystkie odwolania do zmiennej ala
>odnosza sie do "gdzies" na stercie, ktora nalezy do programu, zatem nie
>wystapi blad ochrony.
>Moze sie myle i bylbym wdzieczny za korekcje, a najcheteniej za jakas
>sugestie, ktora by jednak przyczynila sie do wywalenia programu :-).
>Wydaje sie dziwne (a moze nie?), ze program _zawsze_ na _roznych_
>systemach, trafia w obszar sterty (jak przyjalem), a moze jest to
>"ochrona" wbudowana w kompilator???
>
>Pozdrawiam,
> Michal
>
>
>
Po pierwsze jezyk C++ jest mimo wszystko jezykiem niskiego poziomu i co za
tym idzie
rzutowanie jakie wykonales kompilator przyjmuje z wyrozumialoscia. Ale kiedy
zakomentujesz obie zmienne w strukturze TCos to program sie wywala
(przynajmniej u mnie MSVC i Win NT) i powinien tez gdzie indziej sie wywalac
poniewaz struktura TCos ma mniejszy rozmiar niz CCos (sizeof(TCos)=1,
sizeof(CCos)=8) w związku z czym program wykonywany sypie po stosie, a
dokladnie po zmiennych nalezacych do zupelnie innej bajki (dokladnie w
miejscach przypisania do zmiennych a i b wartosci). Uwidacznia to sie
dopiero wtedy gdy program sproboje skorzystac z tych innych zmiennych.
Przyklad funkcji main
int main()
{
int test=0;
TCos ala;
((CCos *)&ala)->a = 2;
((CCos *)&ala)->b = 3;
printf("%d %d \n",((CCos*) &ala)->ple(), test );
return 0;
}
przy moim kompilatorze wydruk jest nastepujacy:
6 3
Jak z tego widac mnozenie zostalo wykonane poprawnie ale wartosc "test"
zostala zmieniona na 3.
Jesli przed funkcja printf przypiszesz "test=5" to wydruk bedzie
nastepujacy:
10 5
Pozdrowienia
Karol Wojtiuk
PS. Jesli sizeof(TCos)>sizeof(CCos) to wszystko chodzi OK bo sypie tylko w
obrebie struktury TCos.
Re: Dlaczego to dziala?!?!?!?
Author: Jarek Kucypera
Date: Fri, 14 Nov 1997 20:23
Date: Fri, 14 Nov 1997 20:23
52 lines
2098 bytes
2098 bytes
Michal A. Polak <M.Polak@bss.com.pl> napisa³(a) w artykule
<346C80A9.B046A500@bss.com.pl>...
> Jest nastepujacy program (uruchomiony na linuxie - gnu cc - oraz win95
> skompilowany builderem, po niewielkich przerobkach):
>
> ---------------------------------------------------------------
> #include<stdio.h>
>
> class CCos
> {
> public:
> int a;
> int b;
> int ple() {return a*b;}
> };
>
> typedef struct
> {
> CCos *me;
> char c[8];
> } TCos;
>
> int main()
> {
> TCos ala;
> ala.me = (CCos *) &ala;
> ((CCos *)&ala)->a = 2;
> ((CCos *)&ala)->b = 3;
>
> printf("%d\n",((CCos*) &ala)->ple());
>
> return 0;
> }
> Pytanie zostalo przedstawione w tutule, z tym ze nie chodzi mi o
> dzialanie kodu programu przedstawionego powyzej, lecz po malych
> zmianach, tj, gdy:
> - w strukturze TCos jedna lub obie zmienne zostaje zakomentowane
> - i/lub wywalmy linie: ala.me = (CCos *) &ala;
Ogólnie linia: "ala.me = (CCos *) &ala" nic nie wnosi, bo póniej
ala.me nie jest nigdzie odczytywane (nie ma go w ¿adnym obliczanym
wyra¿eniu ani nigdzie po prawej stronie znaku przypisania).
Jeli zakomentujesz jedno z pól struktury TCos, to program
ma szanse dzia³aæ, bo akurat w danym kompilatorze
sizeof(CCos *)==2*sizeof(int), i zawsze bêdziesz grzebaæ
wewn¹trz struktury ala.
Natomiast jeli zakomentujesz oba pola TCos, hm ...
mo¿e faktycznie masz fuksa.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads