On 2013/10/10 14:18:06, danno wrote:
Why does there need to be specific support for MEMORY_SANITIZER at all in V8? There is no ADDRESS_SANITIZER support, and I think that this falls in the same
category and I would argue it should be handled in the same way. Before
pursing
this patch any further, I'd like to understand why V8's handling of MSAN
should
be different that ASAN.

The difference is that ASan algorithm is conservative - it is OK to miss part of the program execution (JIT, uninstrumented libraries, etc) as long as all memory
allocation/deallocation is intercepted.

MSan, on the other hand, needs to see all memory stores in the program.
Otherwise there is a possibility that we will report a memory location as
uninitialized when in fact it is not.

ASan w/o specific V8 support fails to detect addressability issues in JIT code, which is something we can live with. MSan w/o V8 support prints lots of false warnings. This prevents us from using MSan on any process that includes V8, and
those are pretty common.


Also, if memory sanitizer is an absolute requirement, then please build V8 for MSAN with the ARM simulator, which doesn't JIT code. This should work out of
the
box without any code changes, or at least with a much smaller, less fragile
CL.

Do you mean I can build Chrome that runs V8 without JIT that way? From the v8
wiki pages I'd need to run the resulting binary in a simulator shell...



Otherwise, my fundamental issue with the CL is how sloppily it handles
unpoisoning of the JITTed stack. I would much prefer a tighter approach that
unpoisoned precisely. I think that would involve some combination of the
following:

- Track the "top" sp per-thread precisely when entering JIT code. When
entering
the runtime, find the bottom precisely. Only unpoison the delta. Probably
involves some short assembly snippets. Even better: understand what gets
accessed by the C++ code (parameters, frame pointer stack crawl with some info
earch frame, etc.) and only unpoison that.

I think the "even better" part will make the patch larger, more intrusive and fragile. Unpoisoning the stack delta only sound really good, I'll look into this (it seems like there are very few places where C++ -> JIT transition happens?).
Sorry this CL was kind of rushed.

- Don't unpoison all JIT stack space when entering the deoptimizer. Only
unpoision the copied frames in the input buffer.

Sounds great, thanks.

- Don't explicitly unpoison parameters. They are simply part of the region of
stack above the current C++ frame and the top of JITTED code frames.

See inline comments.


https://codereview.chromium.org/26006004/diff/33001/src/deoptimizer.cc
File src/deoptimizer.cc (right):


https://codereview.chromium.org/26006004/diff/33001/src/deoptimizer.cc#newcode114
src/deoptimizer.cc:114: Deoptimizer* deoptimizer = new Deoptimizer(isolate,
This big unpoison of the stack is total overkill. The deoptimizer copies a
specific number of frames from the stack to the input_ of buffer of the
Deoptimizer. This is done after returning from this routine in the
hand-written
assembly code of the deoptimizer. After that, the
Deoptimizer::ComputeOutputFrames method inspect this buffer to build the
output
frames. You should be able to precisely unpoison just the input buffer for
which
you have the exact size at the beginning of Deoptimizer::ComputeOutputFrames.

https://codereview.chromium.org/26006004/diff/33001/src/msan.h
File src/msan.h (right):

https://codereview.chromium.org/26006004/diff/33001/src/msan.h#newcode49
src/msan.h:49: __msan_unpoison(&dummy, 65536);     \
This seems totally arbitrary and extremely fragile. Why 64K? You will end up unpoisoning stuff in C++ frames above small stacks of JIT frames. If you need
to
specifically unpoison parts of the stack, you should know how much and be
precise about it.

I don't feel comfortable at all adding this in this form, since it seems to be
a
bug just waiting to happen and it feels likely to break through unrelated to
V8
in the future.

https://codereview.chromium.org/26006004/diff/33001/src/msan.h#newcode52
src/msan.h:52: __msan_unpoison(&(c), sizeof(c));   \
Why are these not covered by the 64K above? From the usage, it appears the
arguments are always parameters to the function this macro is embedded in. If they are pushed before the call, then they lie at an address above locals in
the
current frame?, so the &dummy call should cover them.

https://codereview.chromium.org/26006004/diff/33001/src/platform-posix.cc
File src/platform-posix.cc (right):


https://codereview.chromium.org/26006004/diff/33001/src/platform-posix.cc#newcode71
src/platform-posix.cc:71: #include "msan.h"
Here and elsewhere: None of these includes should be hard wired (they should
be
conditionally included based on whether MEMORY_SANITIZER is active).


https://codereview.chromium.org/26006004/diff/33001/src/platform-posix.cc#newcode211
src/platform-posix.cc:211: #if defined(ADDRESS_SANITIZER) ||
defined(MEMORY_SANITIZER) || \
This change been landed separately, why is this in this CL?



https://codereview.chromium.org/26006004/

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to