Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Cross-building on MacOS X/lint failure



>> I tracked down the source of that problem to the following statement in
>> src/usr.bin/xlint/lint1/tree.c: (function getnnode(), line 345)
>> 
>>              *n->tn_val = sym->s_value;
>
>Does sym happen to be pointing at (or overlapping) n->tn_sym?  
>tn_val is part of a union, which happens to also have a sym_t member.

No; I thought of that, but that is definately NOT the case.  However,
n and the allocated memory for tn_val are right next to each other.  But
I checked that very closely, and they don't overlap.  If they did overlap,
the loop I wrote would also fail, right?  (FWIW, I also tried memmove();
failed the same way memcpy() did).

>> This, however, makes no sense to me.  This assignment looks perfectly legal,
>> and it shouldn't be corrupting the pointer value.  I replace this with:
>> 
>>              memcpy(n->tn_val, &sym->s_value, sizeof(val_t));
>> 
>> And I got the same exact corrupted pointer.  Just for the hell of it,
>> I replaced this with a loop copying the memory byte by byte, and it worked.
>
>Did your loop use a temporary variable for the value of &sym->s_value?
>If sym overlaps with tn_val that would make things work since you'd have a 
>consistent view of the value of that pointer.

Nope, didn't use a temporary value for any of the variables in that loop.

--Ken


Home | Main Index | Thread Index | Old Index