On Mon, Feb 3, 2020 at 12:23 AM aotto <aotto1968@xxxxxxxxxxx> wrote: > Hi, > > there is an easy test, if Stefan is right and I'm wrong. > > 1. cast an INVALID Pointer to "aObj" > how would friend prevent an invalid pointer pass? > 2. call "method_base(&aObj->obj,...)" > > -> if stefan is right than "method_base" is called with an INVALID aObj > as Pointer > -> if I am right than your software will CRASH :-) > given 1) sure, true in every case, doesn't make stephen wrong. > > that is the reason why I require the "frienddef". > > > mfg AO > > > > On 03.02.20 09:16, aotto wrote: > > Hi, > > > > Can someone confirm that *aObj->obj does NOT create any extray "code" > > and does NOT do any > > POINTER resolution? -> if so than "gcc" already uses the "friend" > > logic I require :-) > https://godbolt.org/ this is a good place to collaborate on shared code... it shows the generated assembly... https://godbolt.org/z/X5mRYg is something resembling your case; especially the function call of g()... I think probably an optimized compile would generate the same for the assignments to tmp also... So you just want to shortcut that the any first struct in a containing pointer is valid as a parameter, and an implicit cast to the inner type should be done? The internal browsing of what members are in a type is not very convenient, and would require quite a few lines to search... struct a { struct b { struct c { int d; }C; }B; }A; void g( struct c* pC ) {} void h( struct b* pB) {} void f(void){ g( &A ); // instead of g( &A.B.C ); h( &A ); // instead of h( &A.B ); } > > > → I don't think that "gcc" do this already > > Hi, the following scenario has a "definition hole" in the "C" language > > code example: > > ------------------------- > struct base { > ... > }; > > struct A { > struct base obj; > ... > } aObj; > > struct B { > struct base obj; > ... > } bObj; > > void method_base (struct base * hdl, ...); > > method_base(&aObj, ...) > method_base(&bObj, ...) ------------------------ > > > -----Ursprüngliche Nachricht----- > Von: aotto <aotto1968@xxxxxxxxxxx> > Gesendet: Montag, 3. Februar 2020 09:02 > An: Stefan Franke <stefan@xxxxxxxxx> > Betreff: Re: AW: Feature request for "friendship" of pointers in "C" > > This is not the same! > > 1. usually the aObj is a Pointer: > -> &aObj.obj => &(aObj->obj) > 2. this DOUBLE indirect access creates definitely a CRASH if > aObj is invalid or freed > 3. I use a internal a Pointer typecheck… where I can detect if > "my" pointer is valid or freed… but a "&(aObj->obj)" you > don't survive. > > mfg > > * Please reply at the bottom. > > Ad 1: there is no need for '(' ')' if it's a pointer > > &aObj->obj > > > Ad 2: this is not a double indirect access, the resulting address is the > same as aObj as long obj is the first element of your struct, only the > type changes > > (void *)aObj == (void*)&aObj->obj > > Ad 3: since the address is the same, your check will work. > > Your issues aren't related to gcc - you might consider improving your C > skills. > > Cheers > > Stefan > >