aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-04-12 09:26:22 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-05-21 17:27:45 +0200
commit633a390c169082646e7172c753f319568ef22695 (patch)
tree77b6196e9d4175a006684ceb0627a3fa12e5c625
parent0b6d161ed1cc0f2226482d64c56fe9dc89bc0ebf (diff)
downloadsparse-633a390c169082646e7172c753f319568ef22695.tar.gz
bad-goto: reorganize testcases and add some more
Reorganize the testcases related to the 'scope' of labels and add a few new ones. Also, some related testcases have some unreported errors other than the features being tested. This is a problem since such tescases can still fail after the feature being tested is fixed or implemented. So, fix these testcases or split them so that they each test a unique feature. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--validation/__func__-scope.c8
-rw-r--r--validation/asm-goto-labels.c (renamed from validation/asm-goto-lables.c)0
-rw-r--r--validation/label-asm.c1
-rw-r--r--validation/label-attr.c2
-rw-r--r--validation/label-scope-cgoto.c83
-rw-r--r--validation/label-scope.c5
-rw-r--r--validation/label-scope1.c42
-rw-r--r--validation/label-scope2.c32
-rw-r--r--validation/label-stmt-expr0.c39
-rw-r--r--validation/label-stmt-expr2.c47
-rw-r--r--validation/label-unused.c24
-rw-r--r--validation/linear/goto-invalid.c (renamed from validation/linear/invalid-labels0.c)4
-rw-r--r--validation/linear/goto-stmt-expr-conditional.c (renamed from validation/linear/goto-and-expr-stmt0.c)4
-rw-r--r--validation/linear/goto-stmt-expr-short-circuit.c32
-rw-r--r--validation/linear/label-scope-cgoto.c11
-rw-r--r--validation/linear/label-stmt-dropped.c (renamed from validation/discarded-label-statement.c)4
-rw-r--r--validation/linear/label-stmt-expr0.c (renamed from validation/label-expr.c)4
-rw-r--r--validation/linear/label-unreachable.c (renamed from validation/linear/unreachable-label0.c)3
18 files changed, 332 insertions, 13 deletions
diff --git a/validation/__func__-scope.c b/validation/__func__-scope.c
new file mode 100644
index 00000000..508a8b91
--- /dev/null
+++ b/validation/__func__-scope.c
@@ -0,0 +1,8 @@
+static void foo(void)
+{
+ const char *name = ({ __func__; });
+}
+/*
+ * check-name: __func__'s scope
+ * check-command: sparse -Wall $file
+ */
diff --git a/validation/asm-goto-lables.c b/validation/asm-goto-labels.c
index ac2bf2ad..ac2bf2ad 100644
--- a/validation/asm-goto-lables.c
+++ b/validation/asm-goto-labels.c
diff --git a/validation/label-asm.c b/validation/label-asm.c
index 411020ac..b58d1e52 100644
--- a/validation/label-asm.c
+++ b/validation/label-asm.c
@@ -3,6 +3,7 @@
static void f(void)
{
barrier();
+ goto l;
l:
barrier();
}
diff --git a/validation/label-attr.c b/validation/label-attr.c
index a82d7bc9..81c4ac3c 100644
--- a/validation/label-attr.c
+++ b/validation/label-attr.c
@@ -1,6 +1,6 @@
static int foo(void)
{
- return 0;
+ goto rtattr_failure;
rtattr_failure: __attribute__ ((unused))
return -1;
}
diff --git a/validation/label-scope-cgoto.c b/validation/label-scope-cgoto.c
new file mode 100644
index 00000000..c5d278d3
--- /dev/null
+++ b/validation/label-scope-cgoto.c
@@ -0,0 +1,83 @@
+void foo(void)
+{
+ void *p = &&l;
+ {
+l: ;
+ }
+ goto *p; // OK
+}
+
+void bar(void)
+{
+ void *p = &&l; // KO: 'jump' inside
+ ({
+l: 1;
+ });
+ goto *p;
+}
+
+void baz(void)
+{
+ void *p = &&l; // KO: 'jump' inside
+ 0 ? 1 : ({
+l: 1;
+ });
+ goto *p;
+}
+
+void qux(void)
+{
+ void *p = &&l; // KO: 'jump' inside + removed
+ 1 ? 1 : ({
+l: 1;
+ });
+ goto *p;
+}
+
+void quz(void)
+{
+ void *p;
+ p = &&l; // KO: undeclared
+ goto *p;
+}
+
+void qxu(void)
+{
+ void *p;
+ ({
+l: 1;
+ });
+ p = &&l; // KO: 'jump' inside
+ goto *p;
+}
+
+void qzu(void)
+{
+ void *p;
+ 1 ? 1 : ({
+l: 1;
+ });
+ p = &&l; // KO: 'jump' inside + removed
+ goto *p;
+}
+
+
+/*
+ * check-name: label-scope-cgoto
+ * check-command: sparse -Wno-decl $file
+ * check-known-to-fail
+ *
+ * check-error-start
+label-scope-cgoto.c:12:19: error: label 'l' used outside statement expression
+label-scope-cgoto.c:14:1: label 'l' defined here
+label-scope-cgoto.c:21:19: error: label 'l' used outside statement expression
+label-scope-cgoto.c:23:1: label 'l' defined here
+label-scope-cgoto.c:30:19: error: label 'l' used outside statement expression
+label-scope-cgoto.c:32:1: label 'l' defined here
+label-scope-cgoto.c:50:13: error: label 'l' used outside statement expression
+label-scope-cgoto.c:48:1: label 'l' defined here
+label-scope-cgoto.c:60:13: error: label 'l' used outside statement expression
+label-scope-cgoto.c:58:1: label 'l' defined here
+label-scope-cgoto.c:40:13: error: label 'l' was not declared
+ * check-error-end
+ */
diff --git a/validation/label-scope.c b/validation/label-scope.c
index 7af3d916..0ffaaf4a 100644
--- a/validation/label-scope.c
+++ b/validation/label-scope.c
@@ -3,10 +3,7 @@ static int f(int n)
__label__ n;
n: return n;
}
-static int g(int n)
-{
-n: return n;
-}
+
/*
* check-name: __label__ scope
*/
diff --git a/validation/label-scope1.c b/validation/label-scope1.c
new file mode 100644
index 00000000..f2b1ae9b
--- /dev/null
+++ b/validation/label-scope1.c
@@ -0,0 +1,42 @@
+static void ok_top(void)
+{
+ __label__ l;
+l:
+ goto l;
+}
+
+static void ko_undecl(void)
+{
+ __label__ l;
+ goto l; // KO: undeclared
+}
+
+static void ok_local(void)
+{
+l:
+ {
+ __label__ l;
+l:
+ goto l;
+ }
+goto l;
+}
+
+static void ko_scope(void)
+{
+ {
+ __label__ l;
+l:
+ goto l;
+ }
+goto l; // KO: undeclared
+}
+
+/*
+ * check-name: label-scope1
+ *
+ * check-error-start
+label-scope1.c:11:9: error: label 'l' was not declared
+label-scope1.c:32:1: error: label 'l' was not declared
+ * check-error-end
+ */
diff --git a/validation/label-scope2.c b/validation/label-scope2.c
new file mode 100644
index 00000000..8c04ac65
--- /dev/null
+++ b/validation/label-scope2.c
@@ -0,0 +1,32 @@
+static void ok_lvl2(void)
+{
+ __label__ l;
+
+ {
+ l:
+ goto l;
+ }
+}
+
+static void ko_expr2(void)
+{
+ {
+ __label__ a;
+
+ ({
+a:
+ 0;
+ });
+ goto a;
+ }
+}
+
+/*
+ * check-name: label-scope2
+ * check-known-to-fail
+ *
+ * check-error-start
+label-scope2.c:20:17: error: label 'a' used outside statement expression
+label-scope2.c:17:1: label 'a' defined here
+ * check-error-end
+ */
diff --git a/validation/label-stmt-expr0.c b/validation/label-stmt-expr0.c
new file mode 100644
index 00000000..66a64902
--- /dev/null
+++ b/validation/label-stmt-expr0.c
@@ -0,0 +1,39 @@
+void aft(void)
+{
+ ({
+l: 1;
+ });
+ goto l; // KO
+}
+
+void bef(void)
+{
+ goto l; // KO
+ ({
+l: 1;
+ });
+}
+
+void lab(void)
+{
+ __label__ l;
+ ({
+l: 1;
+ });
+ goto l; // KO
+}
+
+/*
+ * check-name: label-stmt-expr0
+ * check-command: sparse -Wno-decl $file
+ * check-known-to-fail
+ *
+ * check-error-start
+label-stmt-expr0.c:6:9: error: label 'l' used outside statement expression
+label-stmt-expr0.c:4:1: label 'l' defined here
+label-stmt-expr0.c:11:9: error: label 'l' used outside statement expression
+label-stmt-expr0.c:13:1: label 'l' defined here
+label-stmt-expr0.c:23:9: error: label 'l' used outside statement expression
+label-stmt-expr0.c:21:1: label 'l' defined here
+ * check-error-end
+ */
diff --git a/validation/label-stmt-expr2.c b/validation/label-stmt-expr2.c
new file mode 100644
index 00000000..7a38e379
--- /dev/null
+++ b/validation/label-stmt-expr2.c
@@ -0,0 +1,47 @@
+static int foo(void)
+{
+ goto l;
+ ({
+l:
+ 0;
+ });
+ goto l;
+}
+
+static void bar(void)
+{
+ goto l;
+ goto l;
+ ({
+l:
+ 0;
+ });
+}
+
+static void baz(void)
+{
+ ({
+l:
+ 0;
+ });
+ goto l;
+ goto l;
+}
+
+/*
+ * check-name: label-stmt-expr2
+ * check-known-to-fail
+ *
+ * check-error-start
+label-stmt-expr2.c:3:9: error: label 'l' used outside statement expression
+label-stmt-expr2.c:5:1: label 'l' defined here
+label-stmt-expr2.c:8:9: error: label 'l' used outside statement expression
+label-stmt-expr2.c:5:1: label 'l' defined here
+label-stmt-expr2.c:13:9: error: label 'l' used outside statement expression
+label-stmt-expr2.c:16:1: label 'l' defined here
+label-stmt-expr2.c:27:9: error: label 'l' used outside statement expression
+label-stmt-expr2.c:24:1: label 'l' defined here
+label-stmt-expr2.c:28:9: error: label 'l' used outside statement expression
+label-stmt-expr2.c:24:1: label 'l' defined here
+ * check-error-end
+ */
diff --git a/validation/label-unused.c b/validation/label-unused.c
new file mode 100644
index 00000000..c136c7a8
--- /dev/null
+++ b/validation/label-unused.c
@@ -0,0 +1,24 @@
+static void foo(void)
+{
+l:
+ return;
+}
+
+static int bar(void)
+{
+ return ({
+l:
+ ;
+ 0;
+ });
+}
+
+/*
+ * check-name: label-unused
+ * check-known-to-fail
+ *
+ * check-error-start
+label-unused.c:3:1: warning: unused label 'l'
+label-unused.c:10:1: warning: unused label 'l'
+ * check-error-end
+ */
diff --git a/validation/linear/invalid-labels0.c b/validation/linear/goto-invalid.c
index ae3bf728..569d0b0d 100644
--- a/validation/linear/invalid-labels0.c
+++ b/validation/linear/goto-invalid.c
@@ -9,11 +9,11 @@ void bar(void)
}
/*
- * check-name: invalid-labels0
+ * check-name: goto-invalid
* check-command: test-linearize -Wno-decl $file
* check-known-to-fail
*
+ * check-error-ignore
* check-output-ignore
* check-output-excludes: END
- * check-error-ignore
*/
diff --git a/validation/linear/goto-and-expr-stmt0.c b/validation/linear/goto-stmt-expr-conditional.c
index 54881353..6576052b 100644
--- a/validation/linear/goto-and-expr-stmt0.c
+++ b/validation/linear/goto-stmt-expr-conditional.c
@@ -18,11 +18,11 @@ a:
}
/*
- * check-name: goto-and-expr-stmt0
+ * check-name: goto-stmt-expr-conditional
* check-command: test-linearize -Wno-decl $file
* check-known-to-fail
*
+ * check-error-ignore
* check-output-ignore
* check-output-excludes: END
- * check-error-ignore
*/
diff --git a/validation/linear/goto-stmt-expr-short-circuit.c b/validation/linear/goto-stmt-expr-short-circuit.c
new file mode 100644
index 00000000..426315e6
--- /dev/null
+++ b/validation/linear/goto-stmt-expr-short-circuit.c
@@ -0,0 +1,32 @@
+int foo(int p)
+{
+ goto inside;
+ if (0 && ({
+inside:
+ return 1;
+ 2;
+ }))
+ return 3;
+ return 4;
+}
+
+int bar(int p)
+{
+ if (0 && ({
+inside:
+ return 1;
+ 2;
+ }))
+ return 3;
+ goto inside;
+}
+
+/*
+ * check-name: goto-stmt-expr-short-circuit
+ * check-command: test-linearize -Wno-decl $file
+ * check-known-to-fail
+ *
+ * check-error-ignore
+ * check-output-ignore
+ * check-output-excludes: END
+ */
diff --git a/validation/linear/label-scope-cgoto.c b/validation/linear/label-scope-cgoto.c
new file mode 100644
index 00000000..592f1ce4
--- /dev/null
+++ b/validation/linear/label-scope-cgoto.c
@@ -0,0 +1,11 @@
+#include <label-scope-cgoto.c>
+
+/*
+ * check-name: linear/label-scope-cgoto
+ * check-command: test-linearize -Wno-decl -I. $file
+ * check-known-to-fail
+ *
+ * check-error-ignore
+ * check-output-ignore
+ * check-output-excludes: END
+ */
diff --git a/validation/discarded-label-statement.c b/validation/linear/label-stmt-dropped.c
index b4e58ac6..74e0f2e6 100644
--- a/validation/discarded-label-statement.c
+++ b/validation/linear/label-stmt-dropped.c
@@ -11,11 +11,13 @@ start:
r += a;
r += b;
+ if (!r)
+ goto start;
return r;
}
/*
- * check-name: discarded-label-statement
+ * check-name: label-stmt-dropped
* check-command: test-linearize $file
*
* check-output-ignore
diff --git a/validation/label-expr.c b/validation/linear/label-stmt-expr0.c
index e578ed00..ff3c0980 100644
--- a/validation/label-expr.c
+++ b/validation/linear/label-stmt-expr0.c
@@ -3,12 +3,12 @@ int foo(void)
{
int r;
- r = ({ label: 1; });
+ r = ({ goto label; label: 1; });
return r;
}
/*
- * check-name: label-expr
+ * check-name: label-stmt-expr0
* check-command: test-linearize $file
* check-output-ignore
*
diff --git a/validation/linear/unreachable-label0.c b/validation/linear/label-unreachable.c
index 695e5cb0..a44e1211 100644
--- a/validation/linear/unreachable-label0.c
+++ b/validation/linear/label-unreachable.c
@@ -10,9 +10,10 @@ label:
}
/*
- * check-name: unreachable-label0
+ * check-name: label-unreachable
* check-command: test-linearize $file
*
+ * check-error-ignore
* check-output-ignore
* check-output-contains: ret\\.
* check-output-excludes: END