[RFC] evaluate: pointer arithmetics on plain void* (was: [PATCH] evaluate: reject post-ops on void*)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hm, I was talking about post-ops only, the example showed a failing pre-op
...both is a single case as evaluate_preop boils down to evaluate_postop.

I went through evaluate.c again and I think these cases should be somehow
unified (stating current state):

1. evaluate_postop:
  a. function: error ("bad argument type for ++/--")
  b. void*:    nothing, but buggy evaluation (add/sub -1)

2. evaluate_ptr_add
  a. function: warning ("arithmetics on pointers to functions")
  b. void*:    nothing, sizeof(void) implicitly considered as 1

3. evaluate_sizeof:
  a. function: warning ("expression using sizeof on a function")
  b. void:     warning ("expression using sizeof(void)")
  (c. bool:     warning ("expression using sizeof bool"))

4. evaluate_ptrsizeof:
  - ?


The original patch makes 1b. an equivalent to 1a.  The alternative
is to handle 1b. in a similar way as 2b.  Maybe both would deserve
a warning.

Still, there is at least one inconsistency: 1a. vs 2a. (error vs warning).

On 01/23/2012 12:31 AM, Jan Pokorný wrote:
> Following example haven't been linearized correctly:
> 
> 	static void *inc_ptr(void *a) {
> 		return ++a;
> 	}
> 
> test-linearize:
> 
> 	<entry-point>
> 	add.32      %r2 <- %arg1, $-1
> 	ret.32      %r2
> 
> Apparently, something went wrong with -1 value to be added to the original
> pointer.  When void* substituted for int*, the result is as expected
> (considering 32b int):
> 
> 	<entry-point>
> 	add.32      %r2 <- %arg1, $4
> 	ret.32      %r2
> 
> The proposed patch turns post-ops on void* operand into an error
> (taking the same route as with function operand).
> 
> When running check with C=2 on my old linux-3.0.6 configuration,
> this detected a few occurencies:
> 
> 	drivers/scsi/scsi_proc.c:405:31: error: bad argument type for ++/--
> 	drivers/scsi/scsi_proc.c:413:23: error: bad argument type for ++/--
> 	net/bluetooth/hci_core.c:1545:29: error: bad argument type for ++/--
> 	net/bluetooth/l2cap_core.c:1825:37: error: bad argument type for ++/--
> 	net/bluetooth/bnep/core.c:239:13: error: bad argument type for ++/--
> 	lib/sort.c:25:27: error: bad argument type for ++/--
> 	lib/sort.c:26:27: error: bad argument type for ++/--
> 	lib/check_signature.c:21:24: error: bad argument type for ++/--
> 
> All of them seems trivially fixable.
> 
> Alternatively, I can turn it to emit an warning only (should be
> configurable/default?).  To be noted that GCC will only emit an warning,
> and only if -pedantic or -Wpointer-arith specified, but I consider
> it rather a convenient exception.
> 
> When this gets clear, I'll add also the respective test-case.
> 
> Signed-off-by: Jan Pokorny <pokorny_jan@xxxxxxxxx>
> ---
>  evaluate.c |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
> 
> diff --git a/evaluate.c b/evaluate.c
> index bebe968..b6d706b 100644
> --- a/evaluate.c
> +++ b/evaluate.c
> @@ -1711,7 +1711,8 @@ static struct symbol *evaluate_postop(struct expression *expr)
>  		multiply = 1;
>  	} else if (class == TYPE_PTR) {
>  		struct symbol *target = examine_pointer_target(ctype);
> -		if (!is_function(target))
> +		/* beside function, reject also void* (due to sizeof(void)) */
> +		if (target != &void_ctype && !is_function(target))
>  			multiply = bits_to_bytes(target->bit_size);
>  	}
>  

--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux