Dominique Pellé <[email protected]> wrote:
> > Bram Moolenaar <[email protected]> wrote:
> >
> >> Axel Bender wrote:
> >>
> >>> you may as well elimitate the inverted question mark (I just forgot to
> >>> replace it in the example - in the base document there are no xs), the
> >>> result is the same.
> >>> Also, the effect is independent from enc (I tested it with both, utf8
> >>> and latin1). In both cases fenc was empty.
> >>
> >> Well, something must be different, I still can't reproduct it.
> >>
> >> Can anybody else see the problem?
> >
> >
> > I can reproduce it using Vim-7.2.1182 and the
> > "spanish.txt" and "lang.vim" files posted in the
> > first message of this thread.
> >
> > Here is an automated way to reproduce
> > which should be easier:
> >
> > $ vim -f -g -U NONE -u NONE -i NONE --noplugin -N \
> > spanish.txt \
> > -c 'call feedkeys(":set re=1\<CR>:so lang.vim\<CR>GA abc\<Esc>k")'
> >
> > (notice that "abc" at the end of the last line has orange background)
> >
> > Now do the same but with re=2:
> >
> > $ vim -f -g -U NONE -u NONE -i NONE --noplugin -N \
> > spanish.txt \
> > -c 'call feedkeys(:set re=2\<CR>:so lang.vim\<CR>GA abc\<Esc>k")'
> >
> > (notice that "abc" has now a white background,
> > which is different than before, but press CTRL-L
> > and notice that background of "abc" on last line
> > becomes orange)
> >
> > Dominique
>
>
> Valgrind finds a bug with this command (which uses re=2).
> That can explain why it works for some and not for others:
>
> $ valgrind vim -f -g -U NONE -u NONE -i NONE --noplugin -N \
> spanish.txt \
> -c 'call feedkeys(":set re=2\<CR>:so lang.vim\<CR>GA abc\<Esc>k")'
>
> ==10817== Invalid read of size 1
> ==10817== at 0x4F333E: utf_ptr2char (mbyte.c:1697)
> ==10817== by 0x54E02B: nfa_regmatch (regexp_nfa.c:5016)
> ==10817== by 0x550A5C: nfa_regtry (regexp_nfa.c:6202)
> ==10817== by 0x551140: nfa_regexec_both (regexp_nfa.c:6386)
> ==10817== by 0x5515B9: nfa_regexec_multi (regexp_nfa.c:6635)
> ==10817== by 0x5517A7: vim_regexec_multi (regexp.c:8073)
> ==10817== by 0x59C351: syn_regexec (syntax.c:3272)
> ==10817== by 0x599D44: syn_current_attr (syntax.c:2092)
> ==10817== by 0x599529: get_syntax_attr (syntax.c:1851)
> ==10817== by 0x559915: win_line (screen.c:4115)
> ==10817== by 0x554949: win_update (screen.c:1866)
> ==10817== by 0x551F75: update_screen (screen.c:536)
> ==10817== by 0x5EDEEC: main_loop (main.c:1232)
> ==10817== by 0x5EDA57: main (main.c:1020)
> ==10817== Address 0xed2c4a1 is 1 bytes inside a block of size 69 free'd
> ==10817== at 0x4C2A739: free (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==10817== by 0x4E761C: vim_free (misc2.c:1744)
> ==10817== by 0x4C584B: ml_flush_line (memline.c:3481)
> ==10817== by 0x4C350A: ml_get_buf (memline.c:2455)
> ==10817== by 0x53C7F9: reg_getline (regexp.c:3696)
> ==10817== by 0x54D657: recursive_regmatch (regexp_nfa.c:4551)
> ==10817== by 0x54E3B2: nfa_regmatch (regexp_nfa.c:5197)
> ==10817== by 0x550A5C: nfa_regtry (regexp_nfa.c:6202)
> ==10817== by 0x551140: nfa_regexec_both (regexp_nfa.c:6386)
> ==10817== by 0x5515B9: nfa_regexec_multi (regexp_nfa.c:6635)
> ==10817== by 0x5517A7: vim_regexec_multi (regexp.c:8073)
> ==10817== by 0x59C351: syn_regexec (syntax.c:3272)
> ==10817== by 0x599D44: syn_current_attr (syntax.c:2092)
> ==10817== by 0x599529: get_syntax_attr (syntax.c:1851)
> ==10817== by 0x559915: win_line (screen.c:4115)
> ==10817== by 0x554949: win_update (screen.c:1866)
> ==10817== by 0x551F75: update_screen (screen.c:536)
> ==10817== by 0x5EDEEC: main_loop (main.c:1232)
> ==10817== by 0x5EDA57: main (main.c:1020)
> (and more error after that)
>
> reginput points to free memory.
>
> I don't know how to fix it yet. Maybe reginput should be
> saved before calling recursive_regmatch(...) at line
> regexp_nfa.c:5197 and restored afterwards?
Thanks Dominique, that is very helpful.
Can you please try if this patch fixes the problem:
*** ../vim-7.3.1182/src/regexp_nfa.c 2013-06-11 22:44:03.000000000 +0200
--- src/regexp_nfa.c 2013-06-13 13:04:07.000000000 +0200
***************
*** 4495,4501 ****
int **listids;
{
char_u *save_reginput = reginput;
- char_u *save_regline = regline;
int save_reglnum = reglnum;
int save_nfa_match = nfa_match;
int save_nfa_listid = nfa_listid;
--- 4495,4500 ----
***************
*** 4633,4640 ****
/* restore position in input text */
reginput = save_reginput;
- regline = save_regline;
reglnum = save_reglnum;
nfa_match = save_nfa_match;
nfa_endp = save_nfa_endp;
nfa_listid = save_nfa_listid;
--- 4632,4639 ----
/* restore position in input text */
reginput = save_reginput;
reglnum = save_reglnum;
+ regline = reg_getline(reglnum);
nfa_match = save_nfa_match;
nfa_endp = save_nfa_endp;
nfa_listid = save_nfa_listid;
--
Rule #1: Don't give somebody a tool that he's going to hurt himself with.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.