* git-grep Bus Error
@ 2009-03-08 23:27 Brian Gernhardt
2009-03-08 23:41 ` Sam Hocevar
2009-03-09 0:29 ` Junio C Hamano
0 siblings, 2 replies; 9+ messages in thread
From: Brian Gernhardt @ 2009-03-08 23:27 UTC (permalink / raw)
To: Git List
The --color display code in git-grep is giving me a bus error in
show_line at line 492:
> printf("%.*s%s%.*s%s",
> match.rm_so, bol,
> opt->color_match,
> match.rm_eo - match.rm_so, bol +
> match.rm_so,
> GIT_COLOR_RESET);
The first problem is that %.*s does not appear to do on OS X what the
author thinks it does. A precision of 0 for %s is listed in "man
printf" as printing the entire string.
To fix that, I changed it to the following:
> if( match.rm_so > 0 )
> printf( "%.*s", match.rm_so, bol );
> if( match.rm_eo > match.rm_so )
> printf("%s%.*s%s",
> opt->color_match,
> match.rm_eo - match.rm_so, bol + match.rm_so,
> GIT_COLOR_RESET);
This code does not fail, but instead gives lines like the following
(showing the raw color codes):
.gitignore:\033[31m\033[1m(nugit
GIT_COLOR_RESET is apparently being ignored, and I don't know why.
Adding a line to check the values of rm_so, rm_eo, and the difference
between the two gives:
> printf( "%d %d %d",
> match.rm_so, match.rm_eo,
> match.rm_eo - match.rm_so );
.gitignore:0 0 3\033[31m\033[1m(nugit
.mailmap:23 0 26(null)\033[31m\033[1m(nugit-shortlog to fix a few
botched name translations-shortlog to fix a few botched name
translations
And now I'm baffled. Apparently my computer thinks 0 - 0 == 3 and 0 -
23 == 26.
Can I get some help?
~~ Brian
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: git-grep Bus Error
2009-03-08 23:27 git-grep Bus Error Brian Gernhardt
@ 2009-03-08 23:41 ` Sam Hocevar
2009-03-09 0:58 ` Brian Gernhardt
2009-03-09 1:11 ` Junio C Hamano
2009-03-09 0:29 ` Junio C Hamano
1 sibling, 2 replies; 9+ messages in thread
From: Sam Hocevar @ 2009-03-08 23:41 UTC (permalink / raw)
To: Git List
On Sun, Mar 08, 2009, Brian Gernhardt wrote:
> > printf( "%d %d %d",
> > match.rm_so, match.rm_eo,
> > match.rm_eo - match.rm_so );
>
> .gitignore:0 0 3\033[31m\033[1m(nugit
> .mailmap:23 0 26(null)\033[31m\033[1m(nugit-shortlog to fix a few
> botched name translations-shortlog to fix a few botched name
> translations
>
> And now I'm baffled. Apparently my computer thinks 0 - 0 == 3 and 0 -
> 23 == 26.
rm_so and rm_eo are ints on Linux but off_t's on Darwin, hence
probably int64_t's here. You should cast the arguments.
--
Sam.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: git-grep Bus Error
2009-03-08 23:27 git-grep Bus Error Brian Gernhardt
2009-03-08 23:41 ` Sam Hocevar
@ 2009-03-09 0:29 ` Junio C Hamano
1 sibling, 0 replies; 9+ messages in thread
From: Junio C Hamano @ 2009-03-09 0:29 UTC (permalink / raw)
To: Brian Gernhardt; +Cc: Git List
Brian Gernhardt <brian@gernhardtsoftware.com> writes:
> The --color display code in git-grep is giving me a bus error in
> show_line at line 492:
>
>> printf("%.*s%s%.*s%s",
>> match.rm_so, bol,
>> opt->color_match,
>> match.rm_eo - match.rm_so, bol +
>> match.rm_so,
>> GIT_COLOR_RESET);
>
> The first problem is that %.*s does not appear to do on OS X what the
> author thinks it does.
Hmm, that means that printf on OSX does not dohat the POSIX thinks it
ought to.
http://www.opengroup.org/onlinepubs/009695399/functions/fprintf.html
says that "a negative precision is taken as if the precision were
omitted"; it does not say "a negative or zero" here.
Which is a bit sad, because we would need to apply a workaround like
yours. We shouldn't have to.
> To fix that, I changed it to the following:
>
>> if( match.rm_so > 0 )
>> printf( "%.*s", match.rm_so, bol );
>> if( match.rm_eo > match.rm_so )
>> printf("%s%.*s%s",
>> opt->color_match,
>> match.rm_eo - match.rm_so, bol + match.rm_so,
>> GIT_COLOR_RESET);
> This code does not fail, but instead gives lines like the following
> (showing the raw color codes):
>
> .gitignore:\033[31m\033[1m(nugit
Hmm, that is strange. Your above change issues color_match and COLOR_RESET
only when you have something between rm_eo and rm_so. I do not see
anything between "ESC [ 31 m" and "ESC [ m" above, and you have an extra "1"
between "ESC [" and terminating "m" in the reset sequence.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: git-grep Bus Error
2009-03-08 23:41 ` Sam Hocevar
@ 2009-03-09 0:58 ` Brian Gernhardt
2009-03-09 1:11 ` Junio C Hamano
1 sibling, 0 replies; 9+ messages in thread
From: Brian Gernhardt @ 2009-03-09 0:58 UTC (permalink / raw)
To: Sam Hocevar; +Cc: Git List
On Mar 8, 2009, at 7:41 PM, Sam Hocevar wrote:
> On Sun, Mar 08, 2009, Brian Gernhardt wrote:
>
>>> printf( "%d %d %d",
>>> match.rm_so, match.rm_eo,
>>> match.rm_eo - match.rm_so );
>>
>> .gitignore:0 0 3\033[31m\033[1m(nugit
>> .mailmap:23 0 26(null)\033[31m\033[1m(nugit-shortlog to fix a few
>> botched name translations-shortlog to fix a few botched name
>> translations
>>
>> And now I'm baffled. Apparently my computer thinks 0 - 0 == 3 and
>> 0 -
>> 23 == 26.
>
> rm_so and rm_eo are ints on Linux but off_t's on Darwin, hence
> probably int64_t's here. You should cast the arguments.
And that explains the warnings about the parameters to printf not
being integers. I was looking at compat/regex/regex.h and was confused.
Adding a cast to int on all of the format specifiers solves my
problems. Thank you.
~~ Brian
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: git-grep Bus Error
2009-03-08 23:41 ` Sam Hocevar
2009-03-09 0:58 ` Brian Gernhardt
@ 2009-03-09 1:11 ` Junio C Hamano
2009-03-09 1:18 ` Junio C Hamano
` (3 more replies)
1 sibling, 4 replies; 9+ messages in thread
From: Junio C Hamano @ 2009-03-09 1:11 UTC (permalink / raw)
To: Sam Hocevar; +Cc: Git List, Brian Gernhardt
Sam Hocevar <sam@zoy.org> writes:
> On Sun, Mar 08, 2009, Brian Gernhardt wrote:
>
>> > printf( "%d %d %d",
>> > match.rm_so, match.rm_eo,
>> > match.rm_eo - match.rm_so );
>>
>> .gitignore:0 0 3\033[31m\033[1m(nugit
>> .mailmap:23 0 26(null)\033[31m\033[1m(nugit-shortlog to fix a few
>> botched name translations-shortlog to fix a few botched name
>> translations
>>
>> And now I'm baffled. Apparently my computer thinks 0 - 0 == 3 and 0 -
>> 23 == 26.
>
> rm_so and rm_eo are ints on Linux but off_t's on Darwin, hence
> probably int64_t's here. You should cast the arguments.
That is a very good point. In fact, "git grep -n -e 'printf.*%\.\*s'"
reveals that many existing call sites to this form casts the precision
argument explicitly to "int".
Brian, would this patch help?
grep.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/grep.c b/grep.c
index cace1c8..dcdbd5e 100644
--- a/grep.c
+++ b/grep.c
@@ -490,9 +490,9 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
*eol = '\0';
while (next_match(opt, bol, eol, ctx, &match, eflags)) {
printf("%.*s%s%.*s%s",
- match.rm_so, bol,
+ (int) match.rm_so, bol,
opt->color_match,
- match.rm_eo - match.rm_so, bol + match.rm_so,
+ (int)(match.rm_eo - match.rm_so), bol + match.rm_so,
GIT_COLOR_RESET);
bol += match.rm_eo;
rest -= match.rm_eo;
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: git-grep Bus Error
2009-03-09 1:11 ` Junio C Hamano
@ 2009-03-09 1:18 ` Junio C Hamano
2009-03-09 1:19 ` Brian Gernhardt
` (2 subsequent siblings)
3 siblings, 0 replies; 9+ messages in thread
From: Junio C Hamano @ 2009-03-09 1:18 UTC (permalink / raw)
To: Brian Gernhardt; +Cc: Git List, Sam Hocevar
Junio C Hamano <gitster@pobox.com> writes:
> Brian, would this patch help?
>
> grep.c | 4 ++--
> 1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/grep.c b/grep.c
> index cace1c8..dcdbd5e 100644
> --- a/grep.c
> +++ b/grep.c
> @@ -490,9 +490,9 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
> *eol = '\0';
> while (next_match(opt, bol, eol, ctx, &match, eflags)) {
> printf("%.*s%s%.*s%s",
> - match.rm_so, bol,
> + (int) match.rm_so, bol,
> opt->color_match,
> - match.rm_eo - match.rm_so, bol + match.rm_so,
> + (int)(match.rm_eo - match.rm_so), bol + match.rm_so,
> GIT_COLOR_RESET);
> bol += match.rm_eo;
> rest -= match.rm_eo;
I looked at all the hits from
$ git grep -n -e 'printf.*%\.\*s' --and --not -e '(int)'
The above should be the only two places that need fixing.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: git-grep Bus Error
2009-03-09 1:11 ` Junio C Hamano
2009-03-09 1:18 ` Junio C Hamano
@ 2009-03-09 1:19 ` Brian Gernhardt
2009-03-09 1:24 ` [PATCH] grep: cast printf %.*s "precision" argument explicitly to int Junio C Hamano
2009-03-09 1:48 ` git-grep Bus Error Brian Gernhardt
3 siblings, 0 replies; 9+ messages in thread
From: Brian Gernhardt @ 2009-03-09 1:19 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Sam Hocevar, Git List
On Mar 8, 2009, at 9:11 PM, Junio C Hamano wrote:
> Sam Hocevar <sam@zoy.org> writes:
>
>> rm_so and rm_eo are ints on Linux but off_t's on Darwin, hence
>> probably int64_t's here. You should cast the arguments.
>
> That is a very good point. In fact, "git grep -n -e 'printf.*%\.\*s'"
> reveals that many existing call sites to this form casts the precision
> argument explicitly to "int".
>
> Brian, would this patch help?
Yes, except that the code also depends on printf("%.*s", 0, str)
working properly. I just sent a patch which checks for zero width and
performs the casts.
~~ Brian
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] grep: cast printf %.*s "precision" argument explicitly to int
2009-03-09 1:11 ` Junio C Hamano
2009-03-09 1:18 ` Junio C Hamano
2009-03-09 1:19 ` Brian Gernhardt
@ 2009-03-09 1:24 ` Junio C Hamano
2009-03-09 1:48 ` git-grep Bus Error Brian Gernhardt
3 siblings, 0 replies; 9+ messages in thread
From: Junio C Hamano @ 2009-03-09 1:24 UTC (permalink / raw)
To: Brian Gernhardt; +Cc: Git List, Sam Hocevar
On some systems, regoff_t that is the type of rm_so/rm_eo members are
wider than int; %.*s precision specifier expects an int, so use an explicit
cast.
A breakage reported on Darwin by Brian Gernhardt should be fixed with
this patch.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
Junio C Hamano <gitster@pobox.com> writes:
> Brian, would this patch help?
A resend with a commit log message.
grep.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/grep.c b/grep.c
index cace1c8..be99b34 100644
--- a/grep.c
+++ b/grep.c
@@ -490,9 +490,9 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
*eol = '\0';
while (next_match(opt, bol, eol, ctx, &match, eflags)) {
printf("%.*s%s%.*s%s",
- match.rm_so, bol,
+ (int)match.rm_so, bol,
opt->color_match,
- match.rm_eo - match.rm_so, bol + match.rm_so,
+ (int)(match.rm_eo - match.rm_so), bol + match.rm_so,
GIT_COLOR_RESET);
bol += match.rm_eo;
rest -= match.rm_eo;
--
1.6.2.206.g5bda76
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: git-grep Bus Error
2009-03-09 1:11 ` Junio C Hamano
` (2 preceding siblings ...)
2009-03-09 1:24 ` [PATCH] grep: cast printf %.*s "precision" argument explicitly to int Junio C Hamano
@ 2009-03-09 1:48 ` Brian Gernhardt
3 siblings, 0 replies; 9+ messages in thread
From: Brian Gernhardt @ 2009-03-09 1:48 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Sam Hocevar, Git List
On Mar 8, 2009, at 9:11 PM, Junio C Hamano wrote:
> Brian, would this patch help?
>
> grep.c | 4 ++--
> 1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/grep.c b/grep.c
> index cace1c8..dcdbd5e 100644
> --- a/grep.c
> +++ b/grep.c
> @@ -490,9 +490,9 @@ static void show_line(struct grep_opt *opt, char
> *bol, char *eol,
> *eol = '\0';
> while (next_match(opt, bol, eol, ctx, &match, eflags)) {
> printf("%.*s%s%.*s%s",
> - match.rm_so, bol,
> + (int) match.rm_so, bol,
> opt->color_match,
> - match.rm_eo - match.rm_so, bol + match.rm_so,
> + (int)(match.rm_eo - match.rm_so), bol + match.rm_so,
> GIT_COLOR_RESET);
> bol += match.rm_eo;
> rest -= match.rm_eo;
Apparently so. Despite the fact that match.rm_so is 0 at times,
"%.*s" works properly so the other half of the patch isn't needed. Odd.
~~ B
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2009-03-09 1:49 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-08 23:27 git-grep Bus Error Brian Gernhardt
2009-03-08 23:41 ` Sam Hocevar
2009-03-09 0:58 ` Brian Gernhardt
2009-03-09 1:11 ` Junio C Hamano
2009-03-09 1:18 ` Junio C Hamano
2009-03-09 1:19 ` Brian Gernhardt
2009-03-09 1:24 ` [PATCH] grep: cast printf %.*s "precision" argument explicitly to int Junio C Hamano
2009-03-09 1:48 ` git-grep Bus Error Brian Gernhardt
2009-03-09 0:29 ` Junio C Hamano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).