Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Stefan Reuther Newsgroups: de.comp.lang.c Subject: =?UTF-8?Q?Re=3a_=5bclang=5d_Warnung_bei_unvollst=c3=a4ndiger_Initia?= =?UTF-8?Q?lisierung_von_Struktur?= Date: Fri, 16 May 2025 18:08:39 +0200 Lines: 35 Message-ID: <1007uv8.404.1@stefan.msgid.phost.de> References: <1000022.1co.1@stefan.msgid.phost.de> <1002mel.19o.1@stefan.msgid.phost.de> <1002k0i$3q3f2$1@gwaiyur.mb-net.net> <87plgapani.fsf@ftvaux.mobileactivedefense.com> <1005cmn.3h8.1@stefan.msgid.phost.de> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net uvtc0n5ji2k8OljpgCrkUQQwdUTAFvczgXqy0nF8d0PENMXUvH Cancel-Lock: sha1:0+inIRrJNrxxZJyIB5i/Zggw6ak= sha256:kAYxCxvmvm42MSqaZjJlr/Q9X0/7iHrDgsXwd8gOF+0= User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.12.1 Hamster/2.1.0.1538 In-Reply-To: Xref: csiph.com de.comp.lang.c:10627 Am 15.05.2025 um 20:17 schrieb Peter J. Holzer: > On 2025-05-15 18:44, Stefan Reuther wrote: >> Am 15.05.2025 um 09:59 schrieb Rainer Weikusat: >>> 0 ist eigentlich immer eine zulässige Addresse. „Null pointer“ ist ein >>> abstraktes C-Konzept, das in dieser Allgemeinheit auf real existierender >>> Hardware meistens nicht existiert. >> >> Im _segmentierten_ Protected Mode für i286/i386 ist "alles Nullbits" per >> Hardwarespezifikation eine ungültige Adresse. > > So ist es. Und das (WIMRE) nicht nur beim Zugriff: Allein das Laden von > 0000 in ein Segment-Register führt bereits zu einer Exception. Nullpointer darfst du laden, das gibt die Exception erst beim Zugriff. Was du nicht darfst: einen Pointer laden, dessen Segmentregister keinem von Null verschiedenen Segment entspricht. Das erklärt die Regel, warum ein Pointer auf ein freigegebenes Objekt ungültig wird ("The value of a pointer becomes indeterminate when the object it points to reaches the end of its lifetime") - eine i286 Runtime könnte beim Freigeben des Objekts den Segmentdeskriptor invalidieren, so dass bereits das Laden des Pointers eine Exception generiert, nicht erst das Dereferenzieren. > (Für C-Compiler dürfte das aber unproblematisch gewesen sein, weil die > für Pointer-Manipulationen (inkl. Vergleich mit NULL) schon aus > Performance-Gründen sicher normale Register verwendet haben.) Die meisten, ja. Aber gerade in den Zeiten wie i286 modern und "ANSI C" der neue heiße Scheiß war, hat man halt schon interessante ABIs antizipiert. Nicht nur den langweiligen Standardkram mit 16-32 Registern, die alle gleich sind. Stefan