On Fri, Nov 23, 2012 at 10:12 AM, Jakub Jelinek <ja...@redhat.com> wrote: > On Fri, Nov 23, 2012 at 10:08:11AM -0800, H.J. Lu wrote: >> > to also change the caller, read_file_guts, where it does >> > buf = XNEWVEC (uchar, size + 1); >> > and >> > buf = XRESIZEVEC (uchar, buf, size + 1); >> >> I don't think it is necessary since there is no real data in >> those extra 16 bytes. They can have garbage and libcpp still >> functions correctly. They are purely used to silence ASAN. > > The thing is, if the buf from the caller has such size/total > combination that if (to.len + 4096 < to.asize || to.len >= to.asize) > isn't true, there won't be any reallocation and the buffer passed > in from the caller will be used instead. And, if it doesn't have those > extra 16 bytes, it will still result in asan warning... > Guess you need to read file from stdin instead of a file for that > to trigger that.
I see. I will double check and update my patch. > For valgrind I bet just clearing those 16 bytes might still be cheap enough > not to worry about it. This is what I did for valgrind: http://gcc.gnu.org/git/?p=gcc.git;a=blobdiff;f=libcpp/charset.c;h=16a37c36f0cbf7a69c93ae7acb5d79893d57b643;hp=cba19a67178c796dcef1c8c70ac5c43dcbc69071;hb=8ab0e2cd4ae0fae01d0b84d6ccc382acb81ab876;hpb=e5e0d29f8b8ccff799a26fc3e6435af8dbf358fc /* Resize buffer if we allocated substantially too much, or if we - haven't enough space for the \n-terminator. */ + haven't enough space for the \n-terminator. Allocate and + initialize extra 16 bytes for --enable-checking=valgrind. */ if (to.len + 4096 < to.asize || to.len >= to.asize) - to.text = XRESIZEVEC (uchar, to.text, to.len + 1); + { +#ifdef ENABLE_VALGRIND_CHECKING + to.text = XRESIZEVEC (uchar, to.text, to.len + 17); + memset (to.text + to.len + 1, 0, 16); +#else + to.text = XRESIZEVEC (uchar, to.text, to.len + 1); +#endif + } I will check if I need to update it for stdin. Thanks. -- H.J.