Re: [PATCH 3/3] symbol.c: Set correct size of array from parenthesized string initializer

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

 



On 05/18/2013 12:38 AM, Christopher Li wrote:
> I guess the rules is that parenthesized string can appear in
> any place where string was allowed.


I create an incremental patch to address the issue. Please
check if that works for you.

Chris

diff --git a/symbol.c b/symbol.c
index 051a909..a59a4ca 100644
--- a/symbol.c
+++ b/symbol.c
@@ -284,15 +284,6 @@ static int count_array_initializer(struct symbol *t, struct expression *expr)
 	if (t->ctype.base_type == &int_type && t->ctype.modifiers & MOD_CHAR)
 		is_char = 1;
 
-	/* check for a parenthesized string: char x[] = ("string"); */
-	if (is_char && expr->type == EXPR_PREOP && expr->op == '(') {
-		struct expression *e = expr;
-		while (e && e->type == EXPR_PREOP && e->op == '(')
-			e = e->unop;
-		if (e && e->type == EXPR_STRING)
-			expr = e;
-	}
-
 	switch (expr->type) {
 	case EXPR_INITIALIZER: {
 		struct expression *entry;
@@ -305,6 +296,15 @@ static int count_array_initializer(struct symbol *t, struct expression *expr)
 				if (entry->idx_to >= nr)
 					nr = entry->idx_to+1;
 				break;
+			case EXPR_PREOP: {
+				struct expression *e = entry;
+				while (e && e->type == EXPR_PREOP && e->op == '(')
+					e = e->unop;
+				if (!(e && e->type == EXPR_STRING))
+					break;
+				entry = e;
+				/* fall through to strings. */
+			}
 			case EXPR_STRING:
 				if (is_char)
 					str_len = entry->string->length;
@@ -316,6 +316,15 @@ static int count_array_initializer(struct symbol *t, struct expression *expr)
 			nr = str_len;
 		break;
 	}
+	case EXPR_PREOP: {
+		struct expression *e = expr;
+		while (e && e->type == EXPR_PREOP && e->op == '(')
+			e = e->unop;
+		if (!(e && e->type == EXPR_STRING))
+			break;
+		expr = e;
+		/* fall through to strings. */
+	}
 	case EXPR_STRING:
 		if (is_char)
 			nr = expr->string->length;
diff --git a/validation/init-char-array1.c b/validation/init-char-array1.c
index 7427702..24fd8d8 100644
--- a/validation/init-char-array1.c
+++ b/validation/init-char-array1.c
@@ -5,6 +5,7 @@
  */
 static const char u[] = ("hello");
 static const char v[] = {"hello"};
+static const char v1[] = {("hello")};
 static const char w[] = "hello";
 static const char x[5] = "hello";
 
@@ -21,5 +22,6 @@ static void f(void)
  *
  * check-error-start
 init-char-array1.c:6:26: warning: array initialized from parenthesized string constant
+init-char-array1.c:8:28: warning: array initialized from parenthesized string constant
  * 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