[Cocci] [PATCH v5 3/3] tests: Add test case to match const pointer variants

2020-02-11 Thread Jaskaran Singh
Pointer to const pointer and its variants would not match previously.
Add a test case for matching these types.

Signed-off-by: Jaskaran Singh 
---
 tests/constptr.c |  7 +++
 tests/constptr.cocci | 19 +++
 tests/constptr.res   |  7 +++
 3 files changed, 33 insertions(+)
 create mode 100644 tests/constptr.c
 create mode 100644 tests/constptr.cocci
 create mode 100644 tests/constptr.res

diff --git a/tests/constptr.c b/tests/constptr.c
new file mode 100644
index ..49f4af65
--- /dev/null
+++ b/tests/constptr.c
@@ -0,0 +1,7 @@
+int main()
+{
+   const char * const *id;
+   const char ** const *id;
+   const char * const **id;
+   const char * const id;
+}
diff --git a/tests/constptr.cocci b/tests/constptr.cocci
new file mode 100644
index ..29f0aa96
--- /dev/null
+++ b/tests/constptr.cocci
@@ -0,0 +1,19 @@
+@ r0 @
+identifier id;
+@@
+const char * const *
+- id
++ id1
+;
+const char * * const *
+- id
++ id2
+;
+const char * const * *
+- id
++ id3
+;
+const char * const
+- id
++ id4
+;
diff --git a/tests/constptr.res b/tests/constptr.res
new file mode 100644
index ..62fe2513
--- /dev/null
+++ b/tests/constptr.res
@@ -0,0 +1,7 @@
+int main()
+{
+   const char * const *id1;
+   const char ** const *id2;
+   const char * const **id3;
+   const char * const id4;
+}
-- 
2.21.1

___
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci


[Cocci] [PATCH v5 1/3] parsing_c: Align C AST and Cocci AST for pointer

2020-02-11 Thread Jaskaran Singh
For a pointer, the C parser constructed an AST dissimilar from that
of the Cocci AST. This caused failures in matching with certain
pointer types. For example, for the following case:

char *1 const *2 id;

The C AST constructed would be:
const Pointer1 -> Pointer2 -> char

The Cocci AST constructed would be:
Pointer2 -> const Pointer1 -> char

Change the pointer rule in the C parser so that an AST similar to the
Cocci AST is constructed.

Make necessary changes in the C pretty printer so that the pointer type
is printed correctly.

Signed-off-by: Jaskaran Singh 
---
 parsing_c/parser_c.mly  |  4 ++--
 parsing_c/pretty_print_c.ml | 15 ++-
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/parsing_c/parser_c.mly b/parsing_c/parser_c.mly
index 8d7b761e..4c74f15a 100644
--- a/parsing_c/parser_c.mly
+++ b/parsing_c/parser_c.mly
@@ -1333,14 +1333,14 @@ pointer:
  | tmul   { (Ast_c.noattr,fun x -> mk_ty (Pointer x) [$1]) }
  | tmul pointer
  { let (attr,ptr) = $2 in
-   (attr,fun x -> mk_ty (Pointer (ptr x)) [$1]) }
+   (attr,fun x -> ptr (mk_ty (Pointer x) [$1])) }
  | tmul type_qualif_list
  { let (attr,tq) = $2 in
(attr,fun x -> (tq.qualifD, mk_tybis (Pointer x) [$1]))}
  | tmul type_qualif_list pointer
  { let (attr1,tq) = $2 in
let (attr2,ptr) = $3 in
-   (attr1@attr2,fun x -> (tq.qualifD, mk_tybis (Pointer (ptr x)) [$1])) }
+   (attr1@attr2,fun x -> ptr (tq.qualifD, mk_tybis (Pointer x) [$1])) }
 
 tmul:
TMul { $1 }
diff --git a/parsing_c/pretty_print_c.ml b/parsing_c/pretty_print_c.ml
index a2e35588..f4821d5c 100644
--- a/parsing_c/pretty_print_c.ml
+++ b/parsing_c/pretty_print_c.ml
@@ -804,11 +804,14 @@ and pp_string_format (e,ii) =
  (FunctionType (return=void, params=int i) *)
   (*WRONG I THINK, use left & right function *)
   (* bug: pp_type_with_ident_rest None t;  print_ident ident *)
+  pp_type_left t;
   pr_elem i;
-  iiqu +> List.iter pr_elem; (* le const est forcement apres le '*' *)
+  iiqu +>
+  List.iter (* le const est forcement apres le '*' *)
+(function x -> pr_space(); pr_elem x);
   if iiqu <> [] || get_comments_after i <> []
   then pr_space();
-  pp_type_with_ident_rest ident t attrs Ast_c.noattr;
+  print_ident ident
 
   (* ugly special case ... todo? maybe sufficient in practice *)
   | (ParenType ttop, [i1;i2]) ->
@@ -885,11 +888,13 @@ and pp_string_format (e,ii) =
   match ty, iity with
(NoType,_) -> failwith "pp_type_left: unexpected NoType"
   | (Pointer t, [i]) ->
+  pp_type_left t;
   pr_elem i;
-  iiqu +> List.iter pr_elem; (* le const est forcement apres le '*' *)
+  iiqu +>
+  List.iter (* le const est forcement apres le '*' *)
+(function x -> pr_space(); pr_elem x);
   if iiqu <> [] || get_comments_after i <> []
-  then pr_space();
-  pp_type_left t
+  then pr_space()
 
   | (Array (eopt, t), [i1;i2]) -> pp_type_left t
   | (FunctionType (returnt, paramst), [i1;i2]) -> pp_type_left returnt
-- 
2.21.1

___
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci


[Cocci] [PATCH v5 0/3] cocci: Align the C AST and Cocci AST for pointer

2020-02-11 Thread Jaskaran Singh
This series is to address the type matching problem in Coccinelle.

Patch 1/3 is for aligning the C and Cocci AST so that
pointer to const pointer and its variants can be matched.

Patch 2/3 reflects the pretty printing changes made in 
1/3 in the ptrconstptr test case. A space is added between
the * and const.

Patch 3/3 consists of a test case for matching a pointer to
const pointer and its variants.

Changes in v5:
--
- Remove unnecessary parantheses and return of unit in Patch 1/3.
- Have the test case in Patch 3/3 conform more closely with the
  Linux kernel coding style.

Changes in v4:
--
- Fix coding style w/r/t placement of comment with List.iter and
  the qualifier printing function.

Changes in v3:
--
- Add a space between the * and qualifier in Patch 1/3.
- Add Patch 2/3 to add a space between * and const in the test
  case ptrconstptr.

Changes in v2:
--
- Change body and subject of Patch 2/2 as per suggestion of Markus
  Elfring.

[PATCH v5 1/3] parsing_c: Align C AST and Cocci AST for pointer
[PATCH v5 2/3] tests: Add space between * and const in
[PATCH v5 3/3] tests: Add test case to match const pointer variants

 parsing_c/parser_c.mly  |4 ++--
 parsing_c/pretty_print_c.ml |   15 ++-
 tests/constptr.c|7 +++
 tests/constptr.cocci|   19 +++
 tests/constptr.res  |7 +++
 tests/ptrconstptr.res   |2 +-
 6 files changed, 46 insertions(+), 8 deletions(-)

___
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci


[Cocci] [PATCH v5 2/3] tests: Add space between * and const in ptrconstptr.res

2020-02-11 Thread Jaskaran Singh
A space is now added between the * and qualifier. Reflect this
change in the ptrconstptr test case.

Signed-off-by: Jaskaran Singh 
---
 tests/ptrconstptr.res | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/ptrconstptr.res b/tests/ptrconstptr.res
index f5b2210c..1d0c3c1d 100644
--- a/tests/ptrconstptr.res
+++ b/tests/ptrconstptr.res
@@ -1,3 +1,3 @@
 void main() {
-   const char *const *y;
+   const char * const *y;
 }
-- 
2.21.1

___
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci