From: Cyrill G. <gor...@gm...> - 2017-08-28 20:55:26
|
On Sun, Aug 27, 2017 at 04:46:32PM -0700, hp...@zy... wrote: > On August 27, 2017 2:16:18 PM PDT, Cyrill Gorcunov <gor...@gm...> wrote: > >In particular > > > > | call 0xdeadbeef12345678 > > > >should warn a user about address cutoff. > > > >https://bugzilla.nasm.us/show_bug.cgi?id=3392422 > > > >Signed-off-by: Cyrill Gorcunov <gor...@gm...> > >--- > > > >Peter, I don't get why we check for address not being overflowed > >under _if_ condition only, looks like a bug for me, no? > > > > asm/assemble.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > >diff --git a/asm/assemble.c b/asm/assemble.c > >index 6d3e25e..e81354f 100644 > >--- a/asm/assemble.c > >+++ b/asm/assemble.c > >@@ -374,8 +374,8 @@ static void out(struct out_data *data) > > nasm_assert(data->size <= 8); > > asize = data->size; > > amax = ofmt->maxbits >> 3; /* Maximum address size in bytes */ > >+ warn_overflow_out(addrval, asize, data->sign); > > if (data->tsegment == fixseg && data->twrt == NO_SEG) { > >- warn_overflow_out(addrval, asize, data->sign); > > xdata.q = cpu_to_le64(addrval); > > data->data = xdata.b; > > data->type = OUT_RAWDATA; > > Because it is the linker's job. We have to check for overflow if we are > doing a conversation to raw bytes (doing the linker's job for it). But length of immediate is known on source code level only, when matcher finds suitable instruction template we choose the size of address to be passed into out() engine, and only we know which value a user has defined. And if value is too big (just like as in example above) we should warn him. |