git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [PATCH] git: use COPY_ARRAY and MOVE_ARRAY in handle_alias()
@ 2019-09-19 20:48 René Scharfe
  2019-09-23 22:27 ` Jeff King
  0 siblings, 1 reply; 7+ messages in thread
From: René Scharfe @ 2019-09-19 20:48 UTC (permalink / raw)
  To: Git Mailing List; +Cc: Junio C Hamano

Use the macro COPY_ARRAY to copy array elements and MOVE_ARRAY to do the
same for moving them backwards in an array with potential overlap.  The
result is shorter and safer, as it infers the element type automatically
and does a (very) basic type compatibility check for its first two
arguments.

These cases were missed by Coccinelle and contrib/coccinelle/array.cocci
because the type of the elements is "const char *", not "char *", and
the rules in the semantic patch cautiously insist on the sizeof operator
being used on exactly the same type to avoid generating transformations
that introduce subtle bugs into tricky code.

Signed-off-by: René Scharfe <l.s.r@web.de>
---
 git.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/git.c b/git.c
index c1ee7124ed..ce6ab0ece2 100644
--- a/git.c
+++ b/git.c
@@ -369,8 +369,7 @@ static int handle_alias(int *argcp, const char ***argv)
 			die(_("alias '%s' changes environment variables.\n"
 			      "You can use '!git' in the alias to do this"),
 			    alias_command);
-		memmove(new_argv - option_count, new_argv,
-				count * sizeof(char *));
+		MOVE_ARRAY(new_argv - option_count, new_argv, count);
 		new_argv -= option_count;

 		if (count < 1)
@@ -385,7 +384,7 @@ static int handle_alias(int *argcp, const char ***argv)

 		REALLOC_ARRAY(new_argv, count + *argcp);
 		/* insert after command name */
-		memcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp);
+		COPY_ARRAY(new_argv + count, *argv + 1, *argcp);

 		trace2_cmd_alias(alias_command, new_argv);
 		trace2_cmd_list_config();
--
2.23.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] git: use COPY_ARRAY and MOVE_ARRAY in handle_alias()
  2019-09-19 20:48 [PATCH] git: use COPY_ARRAY and MOVE_ARRAY in handle_alias() René Scharfe
@ 2019-09-23 22:27 ` Jeff King
  2019-09-26 13:22   ` sizeof(var) vs sizeof(type), was " Johannes Schindelin
  0 siblings, 1 reply; 7+ messages in thread
From: Jeff King @ 2019-09-23 22:27 UTC (permalink / raw)
  To: René Scharfe; +Cc: Git Mailing List, Junio C Hamano

On Thu, Sep 19, 2019 at 10:48:30PM +0200, René Scharfe wrote:

> Use the macro COPY_ARRAY to copy array elements and MOVE_ARRAY to do the
> same for moving them backwards in an array with potential overlap.  The
> result is shorter and safer, as it infers the element type automatically
> and does a (very) basic type compatibility check for its first two
> arguments.
> 
> These cases were missed by Coccinelle and contrib/coccinelle/array.cocci
> because the type of the elements is "const char *", not "char *", and
> the rules in the semantic patch cautiously insist on the sizeof operator
> being used on exactly the same type to avoid generating transformations
> that introduce subtle bugs into tricky code.

Another good reason to use "sizeof(var)" instead of sizeof(type)". :)

The patch looks good.

-Peff

^ permalink raw reply	[flat|nested] 7+ messages in thread

* sizeof(var) vs sizeof(type), was Re: [PATCH] git: use COPY_ARRAY and MOVE_ARRAY in handle_alias()
  2019-09-23 22:27 ` Jeff King
@ 2019-09-26 13:22   ` Johannes Schindelin
  2019-09-26 13:36     ` Derrick Stolee
  0 siblings, 1 reply; 7+ messages in thread
From: Johannes Schindelin @ 2019-09-26 13:22 UTC (permalink / raw)
  To: Jeff King; +Cc: René Scharfe, Git Mailing List, Junio C Hamano

[-- Attachment #1: Type: text/plain, Size: 1101 bytes --]

Hi Peff,

On Mon, 23 Sep 2019, Jeff King wrote:

> On Thu, Sep 19, 2019 at 10:48:30PM +0200, René Scharfe wrote:
>
> > Use the macro COPY_ARRAY to copy array elements and MOVE_ARRAY to do the
> > same for moving them backwards in an array with potential overlap.  The
> > result is shorter and safer, as it infers the element type automatically
> > and does a (very) basic type compatibility check for its first two
> > arguments.
> >
> > These cases were missed by Coccinelle and contrib/coccinelle/array.cocci
> > because the type of the elements is "const char *", not "char *", and
> > the rules in the semantic patch cautiously insist on the sizeof operator
> > being used on exactly the same type to avoid generating transformations
> > that introduce subtle bugs into tricky code.
>
> Another good reason to use "sizeof(var)" instead of sizeof(type)". :)

That is indeed a very good reason, in addition to getting the type right
automatically (by virtue of letting the compiler pick it).

Should we make this an explicit guideline in our documentation?

Ciao,
Dscho

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: sizeof(var) vs sizeof(type), was Re: [PATCH] git: use COPY_ARRAY and MOVE_ARRAY in handle_alias()
  2019-09-26 13:22   ` sizeof(var) vs sizeof(type), was " Johannes Schindelin
@ 2019-09-26 13:36     ` Derrick Stolee
  2019-09-26 13:43       ` SZEDER Gábor
  2019-09-26 15:24       ` Philip Oakley
  0 siblings, 2 replies; 7+ messages in thread
From: Derrick Stolee @ 2019-09-26 13:36 UTC (permalink / raw)
  To: Johannes Schindelin, Jeff King
  Cc: René Scharfe, Git Mailing List, Junio C Hamano

On 9/26/2019 9:22 AM, Johannes Schindelin wrote:
> Hi Peff,
> 
> On Mon, 23 Sep 2019, Jeff King wrote:
> 
>> On Thu, Sep 19, 2019 at 10:48:30PM +0200, René Scharfe wrote:
>>
>>> Use the macro COPY_ARRAY to copy array elements and MOVE_ARRAY to do the
>>> same for moving them backwards in an array with potential overlap.  The
>>> result is shorter and safer, as it infers the element type automatically
>>> and does a (very) basic type compatibility check for its first two
>>> arguments.
>>>
>>> These cases were missed by Coccinelle and contrib/coccinelle/array.cocci
>>> because the type of the elements is "const char *", not "char *", and
>>> the rules in the semantic patch cautiously insist on the sizeof operator
>>> being used on exactly the same type to avoid generating transformations
>>> that introduce subtle bugs into tricky code.
>>
>> Another good reason to use "sizeof(var)" instead of sizeof(type)". :)
> 
> That is indeed a very good reason, in addition to getting the type right
> automatically (by virtue of letting the compiler pick it).
> 
> Should we make this an explicit guideline in our documentation?

Better yet: can we create a Coccinelle script to fix it automatically?

-Stolee


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: sizeof(var) vs sizeof(type), was Re: [PATCH] git: use COPY_ARRAY and MOVE_ARRAY in handle_alias()
  2019-09-26 13:36     ` Derrick Stolee
@ 2019-09-26 13:43       ` SZEDER Gábor
  2019-09-26 15:24       ` Philip Oakley
  1 sibling, 0 replies; 7+ messages in thread
From: SZEDER Gábor @ 2019-09-26 13:43 UTC (permalink / raw)
  To: Derrick Stolee
  Cc: Johannes Schindelin, Jeff King, René Scharfe,
	Git Mailing List, Junio C Hamano

On Thu, Sep 26, 2019 at 09:36:44AM -0400, Derrick Stolee wrote:
> On 9/26/2019 9:22 AM, Johannes Schindelin wrote:
> > Hi Peff,
> > 
> > On Mon, 23 Sep 2019, Jeff King wrote:
> > 
> >> On Thu, Sep 19, 2019 at 10:48:30PM +0200, René Scharfe wrote:
> >>
> >>> Use the macro COPY_ARRAY to copy array elements and MOVE_ARRAY to do the
> >>> same for moving them backwards in an array with potential overlap.  The
> >>> result is shorter and safer, as it infers the element type automatically
> >>> and does a (very) basic type compatibility check for its first two
> >>> arguments.
> >>>
> >>> These cases were missed by Coccinelle and contrib/coccinelle/array.cocci
> >>> because the type of the elements is "const char *", not "char *", and
> >>> the rules in the semantic patch cautiously insist on the sizeof operator
> >>> being used on exactly the same type to avoid generating transformations
> >>> that introduce subtle bugs into tricky code.
> >>
> >> Another good reason to use "sizeof(var)" instead of sizeof(type)". :)
> > 
> > That is indeed a very good reason, in addition to getting the type right
> > automatically (by virtue of letting the compiler pick it).
> > 
> > Should we make this an explicit guideline in our documentation?
> 
> Better yet: can we create a Coccinelle script to fix it automatically?

I've already done that well over a year ago :)  But remember not being
quite satisfied with something (no idea what it was anymore) and left
it on the backburner.

Will dig it out and have a look as time permits.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: sizeof(var) vs sizeof(type), was Re: [PATCH] git: use COPY_ARRAY and MOVE_ARRAY in handle_alias()
  2019-09-26 13:36     ` Derrick Stolee
  2019-09-26 13:43       ` SZEDER Gábor
@ 2019-09-26 15:24       ` Philip Oakley
  2019-09-26 16:16         ` Derrick Stolee
  1 sibling, 1 reply; 7+ messages in thread
From: Philip Oakley @ 2019-09-26 15:24 UTC (permalink / raw)
  To: Derrick Stolee, Johannes Schindelin, Jeff King
  Cc: René Scharfe, Git Mailing List, Junio C Hamano

On 26/09/2019 14:36, Derrick Stolee wrote:
>>> Another good reason to use "sizeof(var)" instead of sizeof(type)". :)
>> That is indeed a very good reason, in addition to getting the type right
>> automatically (by virtue of letting the compiler pick it).
>>
>> Should we make this an explicit guideline in our documentation?
> Better yet: can we create a Coccinelle script to fix it automatically?
>
> -Stolee
>
How about 'Both'. We can't assume all contributors have Coccinelle on 
their OS/system.

Philip

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: sizeof(var) vs sizeof(type), was Re: [PATCH] git: use COPY_ARRAY and MOVE_ARRAY in handle_alias()
  2019-09-26 15:24       ` Philip Oakley
@ 2019-09-26 16:16         ` Derrick Stolee
  0 siblings, 0 replies; 7+ messages in thread
From: Derrick Stolee @ 2019-09-26 16:16 UTC (permalink / raw)
  To: Philip Oakley, Johannes Schindelin, Jeff King
  Cc: René Scharfe, Git Mailing List, Junio C Hamano

On 9/26/2019 11:24 AM, Philip Oakley wrote:
> On 26/09/2019 14:36, Derrick Stolee wrote:
>>>> Another good reason to use "sizeof(var)" instead of sizeof(type)". :)
>>> That is indeed a very good reason, in addition to getting the type right
>>> automatically (by virtue of letting the compiler pick it).
>>>
>>> Should we make this an explicit guideline in our documentation?
>> Better yet: can we create a Coccinelle script to fix it automatically?
>>
>> -Stolee
>>
> How about 'Both'. We can't assume all contributors have Coccinelle on their OS/system.

Both is best, but I find static checkers to be more reliable than
updating documentation. For that reason, I would prioritize the
Coccinelle script over adding another bullet point to the style
guide.

The PR builds for GitGitGadget run ci/run-static-analysis.sh as a check
(see the StaticAnalysis job in [1] for an example). That provides a free
way to get feedback for users without Coccinelle.

[1] https://dev.azure.com/gitgitgadget/git/_build/results?buildId=16864&view=logs

Thanks,
-Stolee

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-09-26 16:16 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-19 20:48 [PATCH] git: use COPY_ARRAY and MOVE_ARRAY in handle_alias() René Scharfe
2019-09-23 22:27 ` Jeff King
2019-09-26 13:22   ` sizeof(var) vs sizeof(type), was " Johannes Schindelin
2019-09-26 13:36     ` Derrick Stolee
2019-09-26 13:43       ` SZEDER Gábor
2019-09-26 15:24       ` Philip Oakley
2019-09-26 16:16         ` Derrick Stolee

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).