The free was memory which had not been allocated by J's memory allocation process.
-- Raul On Sat, Nov 11, 2023 at 9:08 AM Henry Rich <[email protected]> wrote: > > I am back. Where are we on this? Your first two crash examples > certainly free the XNUM, and the third might free a temp, I'm not sure. > > I am still of the view that this is an error in the audit, i. e. you are > detecting a normal condition as fatal. > > Please make the case for why the free in > > 12345x > > is an error. > > hhr > > On 11/7/2023 11:08 AM, Raul Miller wrote: > > The offending XNUM in that example could bebeing freed in the handler for ": > > > > But my j instance crashes even when the XNUM would not be freed. > > > > All of these lines crash: > > 12345x > > ":12345x > > ":A=:12345x > > > > This line does not crash: > > A=:12345x > > > > Meanwhile, in the same session as that assignment to A, this crashes: > > ":A > > > > Also, I believe I am creating a death warrant here, for the gmp > > managed backing store, though perhaps I have misunderstood the > > concept. (If I have misunderstood, this would not be the first mistake > > I have made.) > > > > Here's what the line which generates the offending value gmp managed > > value looks like before macro expansion: > > > > C*s=SgetX(w); // base 10 representation > > > > Here's what the line looks like after macro expansion (with added > > newlines and indentation and a bit of other white space, to hopefully > > make it a somewhat readable): > > > > C* s= ({ > > X Sy= w; > > { > > if > > (__builtin_expect(!!(!(!__builtin_expect(!!(__atomic_load_n(&gempwsfull, > > 5)), 0))), 0)) { > > jtjsignal(jt, (22)); > > return 0;; > > } > > }; > > mpz_t mpSy= { > > llabs((((Sy))->s)[0]), > > ((((Sy)))->s)[0], > > ((void*) ((C*) (((Sy))) + (((I) sizeof (I)) * (7L + (1))))) > > }; > > C* s= jmpz_get_str(0, 10, mpSy); > > X tempx= ((A) ((I) (s) - (((I) sizeof (I)) * (7L + (1))))); > > { > > if > > (__builtin_expect(!!(!(!__builtin_expect(!!(__atomic_load_n(&gempwsfull, > > 5)), 0))), 0)) { > > jtjsignal(jt, (22)); > > return 0;; > > } > > }; > > mpz_t mptempx= { > > llabs((((tempx))->s)[0]), > > ((((tempx)))->s)[0], > > ((void*) ((C*) (((tempx))) + (((I) sizeof (I)) * (7L + (1))))) > > }; > > X safex= jtXmpzcommon(jt, mptempx, 0); > > (((C*) (safex) + (((I) sizeof (I)) * (7L + (1))))); > > }); > > > > And, for reference, here's the implementation of > > https://github.com/jsoftware/jsource/blob/master/jsrc/jgmpinit.c#L270 > > > > Also, you probably remember this, but: gmp managed memory is always > > "rank 1", but the shape (when it is used) would be the count of gmp > > "limbs" with a sign which indicates the sign of the gmp extended > > integer. Meanwhile, in this case - where gmp is producing a null > > terminated string - the "shape" is just arbitrary garbage (memory > > which was never initialized) and needs to be ignored. > > > > Thanks, > > > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
