Nick Ing-Simmons <nik@tiuk.ti.com> writes: >Nick Ing-Simmons <nik@tiuk.ti.com> writes: >>B. When I fix A in Tk sources it core dumps in a manner which suggests >> something has done heap-overrun. > >Debugging this I discovered a "feature" of sv_utf8_upgrade: What a synchronicity of issues ! I posted this: > >void >Perl_sv_utf8_upgrade(pTHX_ register SV *sv) >{ > char *s, *t; > bool hibit; > > if (!sv || !SvPOK(sv) || SvUTF8(sv)) > return; > > /* This function could be much more efficient if we had a FLAG in SVs > * to signal if there are any hibit chars in the PV. > */ > for (s = t = SvPVX(sv), hibit = FALSE; t < SvEND(sv) && !hibit; t++) > if (*t & 0x80) > hibit = TRUE; > > if (hibit) { > STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */ > SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len); > SvCUR(sv) = len - 1; > SvLEN(sv) = len; /* No longer know the real size. */ > SvUTF8_on(sv); > Safefree(s); /* No longer using what was there before. */ > } >} and Nicholas Clark <nick@ccl4.org> writes: >How come sv_2iv has > if (SvREADONLY(sv) && SvFAKE(sv)) { > sv_force_normal(sv); > } > >but sv_2uv and sv_2nv don't have the same code in the similar position? And the Tk bug is related to both! For reasons that are not clear to me SPARC/gcc-2.95.2 is mis-compiling that code: hibit=262144 s=283410 t=283411 e=283416 SV = PVIV(0x393468) at 0x397e34 REFCNT = 1 FLAGS = (TEMP,POK,FAKE,READONLY,pPOK) IV = 1941317403 PV = 0x283410 "-class" CUR = 6 LEN = 0 Thus I am getting false +ve 'highbit' on the '-' character. This in turn leads to the string being upgraded and then Safefree'ing something which it shouldn't - hence SEGV later. -- Nick Ing-Simmons <nik@tiuk.ti.com> Via, but not speaking for: Texas Instruments Ltd.