I've been running a debug build of vim for a while, and while diagnosing a 
slowness problem noticed that it was much slower than the version I get with my 
distro (Kubuntu 14.04, 7.4.52), so I changed my compiler flags to add -O2 and 
recompiled.

The resulting executable aborted instantly:
*** buffer overflow detected ***: vim terminated
and splurges out a backtrace and about 300 lines of memory map.
The version of gcc is 4.8.2.

Getting a core dump, I see that gcc is doing a checked strcpy and aborting.  
This occurs at my line 874 of eval.c:

        STRCPY(p->vv_di.di_key, p->vv_name);

p is pointing at the first element of vimvars:

static struct vimvar
{
    char        *vv_name;       /* name of variable, without v: */
    dictitem_T  vv_di;          /* value and name for key */
    char        vv_filler[16];  /* space for LONGEST name below!!! */
    char        vv_flags;       /* VV_COMPAT, VV_RO, VV_RO_SBX */
} vimvars[VV_LEN] =

and vv_di is a 
struct dictitem_S
{
    typval_T    di_tv;          /* type and value of the variable */
    char_u      di_flags;       /* flags (only used for variable) */
    char_u      di_key[1];      /* key (actually longer!) */
}

This is done to avoid a allocation for di_key.  I think gcc is complaining that 
di_key has only room for one char, and doesn't realize that we've allowed space 
in vv_filler for the data.

Why it should do that with -O2 and not without has me wondering, perhaps the 
members of struct vimvar are being reordered? 

Anyway, if I add  -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 to the compile flags 
(gcc is using a default of 2) the abort goes away, but this leaves an uneasy 
feeling.

I thought having the last char item of a struct being declared as [1] was valid 
C, and I have a vague idea that there's an explicit ok for this sort of thing. 

Regards, John Little

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui