Re: [PATCH] don't allow newlines inside string literals

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

 




On 08/12/2018 15:10, Luc Van Oostenryck wrote:
> Sparse allows (but warns about) a bare newline (not preceded by
> a backslash) inside a string. Since this is invalid C, it's
> probable that a terminating '"' is missing just before the newline.
> In this case, allowing the newline implies accepting the following
> characters until the next '"' is found, which is most case creates
> a lot of irrelevant warnings.
> 
> Change this by disallowing newlines inside strings, exactly like
> already done for character constants.
> 
> Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx>
> ---
>  tokenize.c                              |  6 +++---
>  validation/check_byte_count-ice.c       |  2 +-
>  validation/preprocessor/missing-delim.c | 17 +++++++++++++++++
>  3 files changed, 21 insertions(+), 4 deletions(-)
>  create mode 100644 validation/preprocessor/missing-delim.c
> 
> diff --git a/tokenize.c b/tokenize.c
> index e98684ec5..ef298cb48 100644
> --- a/tokenize.c
> +++ b/tokenize.c
> @@ -580,9 +580,9 @@ static int eat_string(int next, stream_t *stream, enum token_type type)
>  		len++;
>  		if (next == '\n') {
>  			warning(stream_pos(stream),
> -				"Newline in string or character constant");
> -			if (delim == '\'') /* assume it's lost ' */
> -				break;
> +				"missing delimitator %c", delim);

s/delimitator/delimiter/

maybe better (from gcc, where this is an error, not warning)

    "missing terminating %c character", delim);

[just reading patch in email client - I should have been in bed
hours ago!]

ATB,
Ramsay Jones

> +			/* assume delimiter is lost */
> +			break;
>  		}
>  		if (next == EOF) {
>  			warning(stream_pos(stream),
> diff --git a/validation/check_byte_count-ice.c b/validation/check_byte_count-ice.c
> index dae40c676..16d352921 100644
> --- a/validation/check_byte_count-ice.c
> +++ b/validation/check_byte_count-ice.c
> @@ -8,7 +8,7 @@ static void foo(void *a)
>   * check-name: Segfault in check_byte_count after syntax error
>   *
>   * check-error-start
> -check_byte_count-ice.c:6:0: warning: Newline in string or character constant
> +check_byte_count-ice.c:6:0: warning: missing delimitator '
>  check_byte_count-ice.c:5:23: warning: multi-character character constant
>  check_byte_count-ice.c:6:1: error: Expected ) in function call
>  check_byte_count-ice.c:6:1: error: got }
> diff --git a/validation/preprocessor/missing-delim.c b/validation/preprocessor/missing-delim.c
> new file mode 100644
> index 000000000..eb3d42ab9
> --- /dev/null
> +++ b/validation/preprocessor/missing-delim.c
> @@ -0,0 +1,17 @@
> +static int  c = 'a;
> +
> +static char s[] = "abc;
> +static char t[] = "xyz";
> +
> +extern void foo(void);
> +
> +/*
> + * check-name: missing-delim
> + * check-command: sparse -E $file
> + * check-output-ignore
> + *
> + * check-error-start
> +preprocessor/missing-delim.c:2:0: warning: missing delimitator '
> +preprocessor/missing-delim.c:4:0: warning: missing delimitator "
> + * check-error-end
> + */
> 



[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