[PATCH] warn on all missing parameter types

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

 



A warning is given for K&R parameters without type declaration
and these parameters are given an implicit type of int to
avoid several problems with false errors in the next stages.

However, this is only done for K&R functions with the optional
parameter type declarations. If the parameters has no type
declaration at all, no diagnostic is given and the type is left
as incomplete. In consequence, a function defined with a typo like
'int foo(oid)' instead of 'int foo(void)' is left undetected
(even with -Wold-style-definition and -Wstrict-prototypes enabled).

Fix this by:
1) adding the type check to declare_argument() so that
   all parameters have a real type.
2) downgrade the diagnostic to a warning for K&R functions.

Fixes: 6f7aa5e84dacec8e27a8d70090bba26a1a1276de
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx>
---
 parse.c                            | 10 +++++++++-
 validation/asm-bad0.c              |  2 +-
 validation/bad-type-twice0.c       |  3 +--
 validation/badtype2.c              |  1 +
 validation/badtype3.c              |  1 +
 validation/implicit-KR-arg-type1.c | 11 +++++++++--
 6 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/parse.c b/parse.c
index 31ecef0f554d..a24d6bdc3f54 100644
--- a/parse.c
+++ b/parse.c
@@ -2713,6 +2713,14 @@ static void declare_argument(struct symbol *sym, struct symbol *fn)
 		sparse_error(sym->pos, "no identifier for function argument");
 		return;
 	}
+	if (sym->ctype.base_type == &incomplete_ctype) {
+		sym->ctype.base_type = &int_ctype;
+
+		if (Wimplicit_int) {
+			sparse_error(sym->pos, "missing type declaration for parameter '%s'",
+				show_ident(sym->ident));
+		}
+	}
 	bind_symbol(sym, sym->ident, NS_SYMBOL);
 }
 
@@ -2804,7 +2812,7 @@ static void apply_k_r_types(struct symbol_list *argtypes, struct symbol *fn)
 				goto match;
 		} END_FOR_EACH_PTR(type);
 		if (Wimplicit_int) {
-			sparse_error(arg->pos, "missing type declaration for parameter '%s'",
+			warning(arg->pos, "missing type declaration for parameter '%s'",
 				show_ident(arg->ident));
 		}
 		type = alloc_symbol(arg->pos, SYM_NODE);
diff --git a/validation/asm-bad0.c b/validation/asm-bad0.c
index aa9bf28d72af..4ba7857529e3 100644
--- a/validation/asm-bad0.c
+++ b/validation/asm-bad0.c
@@ -16,7 +16,7 @@ static void icons(void)
 	asm("template" : [out] "=r" (var): [in] string (0));
 }
 
-static void oexpr(oid)
+static void oexpr(void)
 {
 	asm("template" : [out] "=" (var[) : [in] "r" (0));
 }
diff --git a/validation/bad-type-twice0.c b/validation/bad-type-twice0.c
index 9e834d47df6f..e7ec7b75153d 100644
--- a/validation/bad-type-twice0.c
+++ b/validation/bad-type-twice0.c
@@ -7,7 +7,6 @@ static int foo(a)
  * check-name: bad-type-twice0
  *
  * check-error-start
-bad-type-twice0.c:3:16: error: non-scalar type in conditional:
-bad-type-twice0.c:3:16:    incomplete type a
+bad-type-twice0.c:1:16: error: missing type declaration for parameter 'a'
  * check-error-end
  */
diff --git a/validation/badtype2.c b/validation/badtype2.c
index 49fec87ce0a6..173dbfda7843 100644
--- a/validation/badtype2.c
+++ b/validation/badtype2.c
@@ -18,6 +18,7 @@ badtype2.c:2:14: error: got bar
 badtype2.c:3:14: error: Expected ; at end of declaration
 badtype2.c:3:14: error: got foo
 badtype2.c:6:3: error: Trying to use reserved word 'switch' as identifier
+badtype2.c:6:11: error: missing type declaration for parameter 'p'
 badtype2.c:7:3: error: not in switch scope
 badtype2.c:10:1: error: Expected ; at the end of type declaration
 badtype2.c:10:1: error: got }
diff --git a/validation/badtype3.c b/validation/badtype3.c
index 20f346c57488..c111d94e727d 100644
--- a/validation/badtype3.c
+++ b/validation/badtype3.c
@@ -16,6 +16,7 @@ badtype3.c:2:18: warning: identifier list not in definition
 badtype3.c:2:24: error: Expected ) in function declarator
 badtype3.c:2:24: error: got ,
 badtype3.c:5:3: error: Trying to use reserved word 'while' as identifier
+badtype3.c:5:10: error: missing type declaration for parameter 'cur'
 badtype3.c:7:7: error: break/continue not in iterator scope
 badtype3.c:9:3: error: Trying to use reserved word 'return' as identifier
 badtype3.c:9:10: error: Expected ; at end of declaration
diff --git a/validation/implicit-KR-arg-type1.c b/validation/implicit-KR-arg-type1.c
index fe199ef52cf1..c7eb39aef8c8 100644
--- a/validation/implicit-KR-arg-type1.c
+++ b/validation/implicit-KR-arg-type1.c
@@ -1,16 +1,23 @@
-int foo(a, b)
+static int foo(a, b)
 	int a;
 {
 	if (b)
 		return a;
 }
 
+static int bar(a)
+{
+	if (a)
+		return a;
+}
+
 /*
  * check-name: implicit-KR-arg-type1
  * check-command: sparse -Wold-style-definition -Wimplicit-int $file
  *
  * check-error-start
 implicit-KR-arg-type1.c:2:9: warning: non-ANSI definition of function 'foo'
-implicit-KR-arg-type1.c:1:12: error: missing type declaration for parameter 'b'
+implicit-KR-arg-type1.c:1:19: warning: missing type declaration for parameter 'b'
+implicit-KR-arg-type1.c:8:16: error: missing type declaration for parameter 'a'
  * check-error-end
  */
-- 
2.29.0




[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