Thread View: de.comp.lang.c++
6 messages
6 total messages
Started by Kay Hayen
Wed, 10 Jan 1996 00:00
Segment-Terror ?
Author: Kay Hayen
Date: Wed, 10 Jan 1996 00:00
Date: Wed, 10 Jan 1996 00:00
37 lines
1991 bytes
1991 bytes
Hallo Leute!
Ich habe gerade ein C Projekt auf Borland C++ 4.0x portiert und aergere
mich jetzt tierisch.
Was habe ich verbrochen, um in "faralloc" eine Exception 13 zu ernten? Das
gleiche passiert auch bei malloc/calloc/farcalloc und soll laut Hilfe das
Ueberschreiten eines Segmentes angeben. Das verstehe ich jedoch nicht,
weil IMHO alloc einfach 0L zurueckgeben muss, wenn ein Fehler auftritt.
Der Fehler passiert nicht immer an der gleichen Stelle, sondern verschiebt
sich bei leicht verschiedenen Compiles. Ich habe Stringarrays als far
declariert und schon ging es laenger gut. Der Aufruf von alloc scheitert
immer an der gleichen Stelle, naemlich wenn im Konstruktor eines Objektes
Strings in eine Liste eingefuegt werden und diese dann neu alloziert
werden soll. Es handelt sich dann maximal um 130 Bytes. Weil haeufig
hintereinander der gleiche Konstruktor aufgerufen wird, liegt der Verdacht
nahe, dass ein Segment mit der Verwaltung des allozierten Speichers
ueberlaeuft.
BTW: Ich habe das Speichermodell Large verwendet.
Weiss jemand genaueres? Wuerde es helfen die vielen Objekte dynamisch
anzulegen?
Hat jemand *bessere* Speicherroutinen fuer DOS und Windows 3.1
programmiert und gestattet mir diese fuer meine Zwecke zu verwenden?
Tritt das Problem auch unter der Version 4.5x auf?
Ich waere fuer alle Hilfe sehr dankbar.
Mensch liest sich, Kay
--
** *Kurze* Signaturen sind die besten **
Re: Segment-Terror ?
Author: Ullrich von Bassewitz
Date: Thu, 11 Jan 1996 21:19
Date: Thu, 11 Jan 1996 21:19
55 lines
2753 bytes
2753 bytes
Kay Hayen (kay@edition.bonbit.org) wrote:
> Ich habe gerade ein C Projekt auf Borland C++ 4.0x portiert und aergere
> mich jetzt tierisch.
>
> Was habe ich verbrochen, um in "faralloc" eine Exception 13 zu ernten? Das
> gleiche passiert auch bei malloc/calloc/farcalloc und soll laut Hilfe das
> Ueberschreiten eines Segmentes angeben. Das verstehe ich jedoch nicht,
> weil IMHO alloc einfach 0L zurueckgeben muss, wenn ein Fehler auftritt.
Schmunzel :-)
Ich nehme schwer an, dass das nicht ein Fehler von BC++, sondern von Dir
ist. Eine Exception 13 (0x0D) ist eine allgemeine Schutzverletzung,
vermutlich ueberschreibst Du irgendwo in Deinem Programm Speicher der Dir
nicht gehoert.
Ein Beispiel, wie Du sowas sehr elegant machen kannst ist z.B.:
char* strdup (const char* S)
{
return strcpy (malloc (strlen (S + 1)), S);
}
(Das ist mein Standard-Beispiel, wenn es darum geht, was fuer ueble Dinge
einem mit Pointern passieren koennen. Der richtige Code unterscheidet sich
nur in der Plazierung einer Klammer:
return strcpy (malloc (strlen (S) + 1), S);
) Klammer zu.
Eine solche Schutzverletzung ist kein Aergernis, sondern eine der besten
Erfindungen seitdem T.A.Edison die erste Gluehbirne gebaut hat: Sie macht
Dich naemlich auf Fehler aufmerksam, die Du ansonsten nicht oder nur schwer
entdecken wuerdest.
Normalerweise hilft Dir Dein Debugger, den Fehler zu lokalisieren, weil er
naemlich das Programm an genau der Stelle anhaelt, an der der Fehler
auftritt. Im Falle von Fehlern in den Heap-Strukturen ist das aber meistens
mitten im Code der RTL. Es gibt Software-Pakete, die malloc/free durch
geaenderte Versionen ersetzen, wobei bei der Belegung/Freigabe bestimmte
Checks durchgefuehrt werden (eigentlich gehoert die Verwendung eines solchen
Paketes zur Pflichtuebung fuer jeden Programmierer).
Sowas kann man im uebrigen auch selber schreiben, wenn Du mehr wissen willst,
dann kannst Du Dich gerne nochmal per Mail bei mir melden.
Zusammenfassung: Geh mal davon aus, dass der Fehler in Deinem Code liegt.
Gruss
Uz
--
Ullrich von Bassewitz uz@ibb.schwaben.com
Re: Segment-Terror ?
Author: Kay Hayen
Date: Sat, 13 Jan 1996 00:00
Date: Sat, 13 Jan 1996 00:00
103 lines
5145 bytes
5145 bytes
uz@wuschel.ibb.schwaben.com (Ullrich von Bassewitz) meinte am 11.01.96
im Brett /DE/COMP/LANG/C++
zum Thema "Re: Segment-Terror ?"
>Kay Hayen (kay@edition.bonbit.org) wrote:
>> Ich habe gerade ein C Projekt auf Borland C++ 4.0x portiert und aergere
>> mich jetzt tierisch.
>>
>> Was habe ich verbrochen, um in "faralloc" eine Exception 13 zu ernten? Das
>> gleiche passiert auch bei malloc/calloc/farcalloc und soll laut Hilfe das
>> Ueberschreiten eines Segmentes angeben. Das verstehe ich jedoch nicht,
>> weil IMHO alloc einfach 0L zurueckgeben muss, wenn ein Fehler auftritt.
>
>Schmunzel :-)
>Ich nehme schwer an, dass das nicht ein Fehler von BC++, sondern von Dir
>ist. Eine Exception 13 (0x0D) ist eine allgemeine Schutzverletzung,
>vermutlich ueberschreibst Du irgendwo in Deinem Programm Speicher der Dir
>nicht gehoert.
Nein.
[ Beispiel fuer falsche Pointerverwendung geloescht ]
Gutes Beispiel, aber mein fehlerhafter Aufruf steht allein in einer Zeile
und bekommt nur einen integer uebergeben. Ein Programmierfehler scheidet
aus.
>Eine solche Schutzverletzung ist kein Aergernis, sondern eine der besten
>Erfindungen seitdem T.A.Edison die erste Gluehbirne gebaut hat: Sie macht
>Dich naemlich auf Fehler aufmerksam, die Du ansonsten nicht oder nur schwer
>entdecken wuerdest.
Ja, z.B. darauf, dass die StdLib des BCC 4.0 buggy ist. Entschuldige, aber
da aergere ich mich gewaltig. Auf die Speicherverwaltung muss sich ein
Programmierer wenigstens verlassen koennen.
>Normalerweise hilft Dir Dein Debugger, den Fehler zu lokalisieren, weil er
>naemlich das Programm an genau der Stelle anhaelt, an der der Fehler
>auftritt.
Eben innerhalb von malloc()/faralloc()/calloc().
>Im Falle von Fehlern in den Heap-Strukturen ist das aber meistens
>mitten im Code der RTL. Es gibt Software-Pakete, die malloc/free durch
>geaenderte Versionen ersetzen, wobei bei der Belegung/Freigabe bestimmte
>Checks durchgefuehrt werden (eigentlich gehoert die Verwendung eines solchen
>Paketes zur Pflichtuebung fuer jeden Programmierer).
Es ist Sache des BCC eine fehlerfrei RTL mitzubringen.
>Sowas kann man im uebrigen auch selber schreiben, wenn Du mehr wissen
>willst, dann kannst Du Dich gerne nochmal per Mail bei mir melden.
Werde ich jetzt selbst machen muessen, siehe unten.
>Zusammenfassung: Geh mal davon aus, dass der Fehler in Deinem Code liegt.
Also nein. Der Fehler ist Windows! Dieses Pracht-BS haelt fuer die
Speicheranforderungen nur schlappe 6000 Pointer ( ein halbes Segment ? )
bereit. Danach ist Schluss und die allen "*alloc" Routinen des BCC 4.0
gemeinsame lowlevel Routine merkt nicht, das die Segmentgrenze verletzt
wird. Eigentlich muesste sie das und einen Fehler melden, aber dieser
Check war dann wohl zuviel.
Ich werde also meine vielen kleinen Anforderungen von einer eigenen
Speicherverwaltung zusammenfassen und selbst verwalten lassen, ausserdem
werden noch darauf abgestimmte new/delete Operatoren dazukommen muessen.
Folge war jetzt erstmal, dass ich das Projekt nach Linux portiert habe,
wozu ich zwei Tools geschrieben habe.
Das erste konvertiert die DOS Pfadangaben in #include Anweisungen ins
Linuxformat. Ich hab halt immer gerne alles in getrennten Verzeichnissen
und da musste ich dann Pfade wie "G:\Pest\inc\include.h" verwenden, die
ich bei ca. 25 includes und 15 sources natuerlich nicht von Hand aendern
wollte, zumal dann #ifdef faellig geworden waeren, fuer den Fall, das ich
wieder zu DOS zurueckkehren will. So kann ich die gleichen unveraenderten
sources mit einer zusaetzlichen Zwischenstufe im Makefile auch mit dem gcc
uebersetzen, editiert werden die Originale.
Das zweite ersetzt die autodependancies des BCC. Es scant ein source und
dessen includes und deren includes usw., ob es ein include findet, das
neuer ist als dieser source, der es liest. Wenn ja wird ein touch
losgelassen. Das minimiert die Compiles ein wenig, sonst muesste mensch
entweder das makefile staendig anpassen, wenn neue Abhaengigkeiten
entstehen oder im Zweifel zuviel uebersetzen.
Als naechstes steht ein mkmake auf dem Plan, es soll aus den sourcefiles
selbst ein Makefile erstellen und warten. Sowas gibt es alles sicher
schon, aber wer Interesse oder Anregungen hat kann sich ja mal melden, ich
poste das gerne in dieses Brett, ist sehr kurz.
>Gruss
>
> Uz
Mensch liest sich, Kay
--
** *Kurze* Signaturen sind die besten **
Re: Segment-Terror ?
Author: Achim Gratz
Date: Sun, 14 Jan 1996 11:58
Date: Sun, 14 Jan 1996 11:58
43 lines
2720 bytes
2720 bytes
>>>>> "Kay" == Kay Hayen <kay@edition.bonbit.org> writes:
Kay> Das erste konvertiert die DOS Pfadangaben in #include
Kay> Anweisungen ins Linuxformat. Ich hab halt immer gerne alles
Kay> in getrennten Verzeichnissen und da musste ich dann Pfade wie
Kay> "G:\Pest\inc\include.h" verwenden, die ich bei ca. 25
Kay> includes und 15 sources natuerlich nicht von Hand aendern
Kay> wollte, zumal dann #ifdef faellig geworden waeren, fuer den
Kay> Fall, das ich wieder zu DOS zurueckkehren will. So kann ich
Kay> die gleichen unveraenderten sources mit einer zusaetzlichen
Kay> Zwischenstufe im Makefile auch mit dem gcc uebersetzen,
Kay> editiert werden die Originale.
Wenn Du Dir die absoluten Pfade verkneifen wuerdest (unter UNIX
-I<inc-dir-base>, unter BCC kann man die Directories irgendwo im
Projekt einstellen) und die Backslashes durch Slashes ersetzt,
brauchst Du gar nichts zu machen. DOS kann durchaus / im Pfadnamen,
nur der Kommandointerpreter besteht darauf, dass das Optionen werden
sollen. Das letzte mal als ich BCC benutzt habe, ging das auch noch.
#include <inc/include.h>
Kay> Das zweite ersetzt die autodependancies des BCC. Es scant ein
Kay> source und dessen includes und deren includes usw., ob es ein
Kay> include findet, das neuer ist als dieser source, der es
Kay> liest. Wenn ja wird ein touch losgelassen. Das minimiert die
Kay> Compiles ein wenig, sonst muesste mensch entweder das
Kay> makefile staendig anpassen, wenn neue Abhaengigkeiten
Kay> entstehen oder im Zweifel zuviel uebersetzen.
`gcc -M' macht das von ganz alleine, Borland hat die Autodependencies
schliesslich nicht erfunden sondern nur anders genannt. Guck Dir mal
in einem GNU-Makefile an, wie `make depend' die Informationen vom
Compiler zusammenbaut.
--
Achim Gratz
--+<[ It's the small pleasures that make life so miserable. ]>+--
E-Mail: gratz@ite.inf.tu-dresden.de
Phone: +49 351 4575 - 325
Re: Segment-Terror ?
Author: Ullrich von Bassewitz
Date: Sun, 14 Jan 1996 21:08
Date: Sun, 14 Jan 1996 21:08
40 lines
2007 bytes
2007 bytes
Kay Hayen (kay@edition.bonbit.org) wrote:
> Also nein. Der Fehler ist Windows! Dieses Pracht-BS haelt fuer die
> Speicheranforderungen nur schlappe 6000 Pointer ( ein halbes Segment ? )
> bereit. Danach ist Schluss und die allen "*alloc" Routinen des BCC 4.0
> gemeinsame lowlevel Routine merkt nicht, das die Segmentgrenze verletzt
> wird. Eigentlich muesste sie das und einen Fehler melden, aber dieser
> Check war dann wohl zuviel.
BCC belegt immer groesserer Bloecke und teilt diese intern nochmal in
kleinere auf. D.h. Du kannst wesentlich mehr als diese feste Anzahl von
Bloecken belegen.
> Das zweite ersetzt die autodependancies des BCC. Es scant ein source und
> dessen includes und deren includes usw., ob es ein include findet, das
> neuer ist als dieser source, der es liest. Wenn ja wird ein touch
> losgelassen. Das minimiert die Compiles ein wenig, sonst muesste mensch
> entweder das makefile staendig anpassen, wenn neue Abhaengigkeiten
> entstehen oder im Zweifel zuviel uebersetzen.
man gcc, Stichwort "-M" und "-MM". Das sieht z.B. so aus:
[...]
ifeq (.depend,$(wildcard .depend))
all: your_main_target
include .depend
else
all: depend
endif
[...]
depend dep:
@echo "Creating dependency information"
$(CC) -DLINUX -MM *.cc > .depend
Gruss
Uz
--
Ullrich von Bassewitz uz@ibb.schwaben.com
Re: Segment-Terror ?
Author: Joachim Zobel
Date: Tue, 16 Jan 1996 02:17
Date: Tue, 16 Jan 1996 02:17
26 lines
1625 bytes
1625 bytes
kay@edition.bonbit.org (Kay Hayen) wrote: >uz@wuschel.ibb.schwaben.com (Ullrich von Bassewitz) meinte am 11.01.96 >im Brett /DE/COMP/LANG/C++ >zum Thema "Re: Segment-Terror ?" >Gutes Beispiel, aber mein fehlerhafter Aufruf steht allein in einer Zeile >und bekommt nur einen integer uebergeben. Ein Programmierfehler scheidet >aus. Das muss nichts bedeuten. Wenn du dir vorher schon irgendwo den heap geschreddert hast, kann alles passieren. Ich hab es auch schon erlebt das alloc einfach hängenblieb. Inzwischen verwende ich für die Debug-Version meiner Windows-Programme GlobalAlloc zum Speicher alloziieren und gucke beim freigeben, ob meine dabei geschriebenen Randmarkierungen noch ok sind. GlobalAlloc holt Protected-Mode-Blöcke von Windows (die evtl. etwas zu gross sind, deshalb Randmarkierungen). Über ungültige Pointer lesen oder schreiben gibt dann sofort! einen GPF. Joachim "... ein Geschlecht erfinderischer Zwerge, die fuer alles gemietet werden koennen." - Bertolt Brecht - Das Leben des Gallilei
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