Article View: pl.comp.lang.c
Article #304Re:Niekoniecznie to dziala
From: 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.
Technical Details
Message-ID:
<64i3bi$ido$1@sunsite.icm.edu.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!uw.edu.pl!news.icm.edu.pl!not-for-mailReferences:
<346C80A9.B046A500@bss.com.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!uw.edu.pl!news.icm.edu.pl!not-for-mail From: "Karol Wojtiuk" <karol@tebo.chelm.pl> Newsgroups: pl.comp.programming,pl.comp.lang.c,pl.comp.lang.delphi Subject: Re:Niekoniecznie to dziala Date: Fri, 14 Nov 1997 18:55:06 +0100 Organization: ICM Lines: 97 Message-ID: <64i3bi$ido$1@sunsite.icm.edu.pl> References: <346C80A9.B046A500@bss.com.pl> NNTP-Posting-Host: guru.tebo.chelm.pl X-Newsreader: Microsoft Outlook Express 4.71.1712.3 X-MimeOLE: Produced By Microsoft MimeOLE V4.71.1712.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit