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
On Mon, Dec 01, 2008 at 03:23:05PM -0500, Ken Hornstein wrote:
> When the cross-platform lint is run on libc, it gets a LOT of fatal
> errors from various source code files. Originally I wasn't in the
> mood to figure out what was going wrong, so I changed the libc Makefile
> to exclude the particular errors lint was reporting (I did look at the
> source code lint complained about, and the errors seemed bogus to me).
> But I got to a point where lint core dumped, and decided to take a
> closer look.
>
> 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.
> What ends up happening is that n->tn_val get corrupted during that
> assignment and eventually n->tn_val is deferenced later on, which
> causes a SIGBUS.
>
> 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.
eric
Home |
Main Index |
Thread Index |
Old Index