🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #304

Re:Niekoniecznie to dziala

#304
From: Karol Wojtiuk
Date: Fri, 14 Nov 1997 17:55
94 lines
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-mail
References: <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