* Re: matching an arbitrary struct or union (but not scalars)
[not found] <202109161609.9AB60A934B@keescook>
@ 2021-09-17 4:35 ` Mansour Moufid
2021-09-17 6:37 ` Julia Lawall
2021-09-17 6:34 ` Julia Lawall
2021-09-17 19:16 ` Mansour Moufid
2 siblings, 1 reply; 13+ messages in thread
From: Mansour Moufid @ 2021-09-17 4:35 UTC (permalink / raw)
To: Kees Cook; +Cc: cocci
On Thu, Sep 16, 2021 at 7:48 PM Kees Cook <keescook@chromium.org> wrote:
>
> Hi,
>
> I'd like to match any compound type containing a compound type, i.e. these:
>
> struct foo {
> struct bar instance;
> };
>
> union bar {
> int c;
> struct baz d;
> };
For this first part, maybe something like:
@@
identifier s, u;
type t1 = {struct s, union u};
type t2 = {struct s, union u};
identifier x;
@@
* t1 {
...
* t2 x;
...
}
I'll attempt the rest tomorrow.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
[not found] <202109161609.9AB60A934B@keescook>
2021-09-17 4:35 ` matching an arbitrary struct or union (but not scalars) Mansour Moufid
@ 2021-09-17 6:34 ` Julia Lawall
2021-09-17 19:16 ` Mansour Moufid
2 siblings, 0 replies; 13+ messages in thread
From: Julia Lawall @ 2021-09-17 6:34 UTC (permalink / raw)
To: cocci
On Thu, 16 Sep 2021, Kees Cook wrote:
> Hi,
>
> I'd like to match any compound type containing a compound type, i.e. these:
>
> struct foo {
> struct bar instance;
> };
>
> union bar {
> int c;
> struct baz d;
> };
>
> char buf[5][9];
>
> and the uuid_t type, where a zero initializer is used:
>
> struct foo instance = { 0 };
>
> Even in the simple case, I would expect this to be something like:
>
> @zero_initializer@
> ???? T;
> identifier I;
>
> T I = {
> - 0
> };
>
> But I do not want to match scalars and single-dimensional scalar arrays
> like these:
>
> char name[8] = { 0 };
>
> so I can't just use "type T".
>
>
> I tried:
>
> @@
> type T =~ "^((struct|union) .*|uuid_t)$";
> identifier I;
> @@
>
> T I = {
> - 0
> };
>
> but this only matched uuid_t instances, which I don't understand.
@@
identifier i,x;
typedef uuid_t;
@@
(
struct i
|
union i
|
uuid_t
)
x = {
- 0
};
> For a more exact match, this works for finding a struct within a struct:
>
> @found_compound@
> identifier COMPOUND, SUB, NAME;
> @@
>
> struct COMPOUND {
> ...
> struct SUB NAME;
> ...
> };
>
> @zero_init depends on found_struct@
> identifier found_compound.COMPOUND;
> identifier I;
> @@
>
> struct COMPOUND I = {
> - 0
> };
>
>
> But this doesn't (fails to compile and I don't know why):
>
> @found_compound@
> identifier COMPOUND, SUB, NAME;
> @@
>
> \(struct\|union\) COMPOUND {
> ...
> \(struct\|union\) SUB NAME;
> ...
> };
>
> @zero_init depends on found_struct@
> identifier found_compound.COMPOUND;
> identifier I;
> @@
>
> \(struct\|union\) COMPOUND I = {
> - 0
> };
Disjunctions are only allowed around complete C terms. In struct x, the
type is struct x, not just struct. So you need to duplicate COMPOUND in
each branch.
In the found_compound case it seems that one has to duplicate the entire
type declaration:
@found_compound@
identifier COMPOUND, SUB, NAME;
@@
(
struct COMPOUND {
...
\(struct SUB \|union SUB\) NAME;
...
};
|
union COMPOUND {
...
\(struct SUB \|union SUB\) NAME;
...
};
)
julia
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
2021-09-17 4:35 ` matching an arbitrary struct or union (but not scalars) Mansour Moufid
@ 2021-09-17 6:37 ` Julia Lawall
0 siblings, 0 replies; 13+ messages in thread
From: Julia Lawall @ 2021-09-17 6:37 UTC (permalink / raw)
To: Mansour Moufid; +Cc: Kees Cook, cocci
On Fri, 17 Sep 2021, Mansour Moufid wrote:
> On Thu, Sep 16, 2021 at 7:48 PM Kees Cook <keescook@chromium.org> wrote:
> >
> > Hi,
> >
> > I'd like to match any compound type containing a compound type, i.e. these:
> >
> > struct foo {
> > struct bar instance;
> > };
> >
> > union bar {
> > int c;
> > struct baz d;
> > };
>
> For this first part, maybe something like:
>
> @@
> identifier s, u;
> type t1 = {struct s, union u};
> type t2 = {struct s, union u};
> identifier x;
> @@
> * t1 {
> ...
> * t2 x;
> ...
> }
I think that this should also be ok.
julia
>
> I'll attempt the rest tomorrow.
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
[not found] <202109161609.9AB60A934B@keescook>
2021-09-17 4:35 ` matching an arbitrary struct or union (but not scalars) Mansour Moufid
2021-09-17 6:34 ` Julia Lawall
@ 2021-09-17 19:16 ` Mansour Moufid
2021-09-18 15:40 ` Kees Cook
2 siblings, 1 reply; 13+ messages in thread
From: Mansour Moufid @ 2021-09-17 19:16 UTC (permalink / raw)
To: Kees Cook; +Cc: cocci
On Thu, Sep 16, 2021 at 7:48 PM Kees Cook <keescook@chromium.org> wrote:
>
> Hi,
>
> I'd like to match any compound type containing a compound type, i.e. these:
>
> struct foo {
> struct bar instance;
> };
>
> union bar {
> int c;
> struct baz d;
> };
>
> char buf[5][9];
>
> and the uuid_t type, where a zero initializer is used:
>
> struct foo instance = { 0 };
>
> [...]
>
> But I do not want to match scalars and single-dimensional scalar arrays
> like these:
>
> char name[8] = { 0 };
This:
@@
type t;
identifier x;
@@
* t x[...][...];
will match two or more dimensional arrays, like x[1][2] and x[][2] as
well as x[1][2][3] and so on.
So altogether a script could look like this:
@a@
identifier s, u;
type t1 = {struct s, union u};
type t2 = {struct s, union u};
identifier x;
@@
t1 {
...
t2 x;
...
}
@@
typedef uuid_t;
type t = {a.t1, uuid_t};
identifier x;
@@
t x[...] = {
- 0
};
@@
type t;
identifier x;
@@
t x[...][...] = {
- 0
};
I assume this is for the Linux kernel? It looks like there are plenty
of variables of those types but none initialized to {0}. (Although the
script is not done running through the entire kernel, that takes
forever.)
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
2021-09-17 19:16 ` Mansour Moufid
@ 2021-09-18 15:40 ` Kees Cook
2021-09-18 15:49 ` Kees Cook
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Kees Cook @ 2021-09-18 15:40 UTC (permalink / raw)
To: Mansour Moufid; +Cc: cocci
On Fri, Sep 17, 2021 at 03:16:21PM -0400, Mansour Moufid wrote:
> This:
>
> @@
> type t;
> identifier x;
> @@
> * t x[...][...];
>
> will match two or more dimensional arrays, like x[1][2] and x[][2] as
> well as x[1][2][3] and so on.
>
> So altogether a script could look like this:
>
> @a@
> identifier s, u;
> type t1 = {struct s, union u};
> type t2 = {struct s, union u};
> identifier x;
> @@
> t1 {
> ...
> t2 x;
> ...
> }
>
> @@
> typedef uuid_t;
> type t = {a.t1, uuid_t};
> identifier x;
> @@
> t x[...] = {
> - 0
> };
>
> @@
> type t;
> identifier x;
> @@
> t x[...][...] = {
> - 0
> };
>
> I assume this is for the Linux kernel? It looks like there are plenty
> of variables of those types but none initialized to {0}. (Although the
> script is not done running through the entire kernel, that takes
> forever.)
Yeah, this is for the kernel. Thanks for helping with this! I was able
to continue the construction and get it working. :)
Here's a test case:
#include <stdio.h>
#include <uuid/uuid.h>
/* Ignore 0-init (no internal compound type) */
struct only_scalars_struct {
int a;
short b;
unsigned long c;
void *ptr;
};
/* has internal struct */
struct has_struct {
int a;
struct only_scalars_struct inner;
void *ptr;
};
/* has internal array */
struct has_array {
int a;
char buf[8];
void *ptr;
};
/* has internal compound type (uuid_t) */
struct has_uuid {
int a;
uuid_t id;
void *ptr;
};
/* has internal array of struct */
struct has_struct_array {
int a;
struct only_scalars_struct many[4];
void *ptr;
};
/* internally defined struct */
struct has_internal_struct_def {
int a;
struct foo {
int b;
int c;
} inside;
void *ptr;
};
/* Ignore 0-init: no internal compound types */
union only_scalars_union {
int a;
short b;
void *ptr;
};
/* has internal union */
struct has_union {
union only_scalars_union z;
void *ptr;
};
/* internally defined union */
union has_internal_union_def {
union {
int a;
long b;
} z;
void *ptr;
};
/* has internal compound types */
union of_many {
struct only_scalars_struct inside;
struct has_union stuffed;
union only_scalars_union scalars;
};
/* has internal array */
union of_array {
char buf[4];
void *ptr;
};
/* has internal compound type */
union of_uuid {
void *ptr;
uuid_t id;
};
int main(void)
{
struct only_scalars_struct a = { 0 }; // should be ignored
struct has_struct b = { 0 };
struct has_union c = { 0 };
struct has_uuid d = { 0 };
struct has_array e = { 0 };
struct has_struct_array f = { 0 };
struct has_internal_struct_def g = { 0 };
union only_scalars_union h = { 0 }; // should be ignored
union of_many i = { 0 };
union of_array j = { 0 };
union of_uuid k = { 0 };
union has_internal_union_def l = { 0 };
char one[16] = { 0 }; // should be ignored
char two[16][5] = { 0 };
uuid_t uuid = { 0 };
struct only_scalars_struct structs[4] = { 0 };
union only_scalars_union unions[4] = { 0 };
puts("hello");
return 0;
}
And here's the cocci:
@compound@
typedef uuid_t;
identifier os, is, ou, iu;
type outer = {struct os, union ou};
type inner = {struct is, union iu, uuid_t};
type t;
identifier x;
@@
outer {
...
(
inner x;
|
inner x[...];
|
t x[...];
|
inner {
...
} x;
|
inner {
...
} x[...];
)
...
};
@single@
typedef uuid_t;
type t = {compound.outer, uuid_t};
identifier x;
@@
t x = {
- 0
};
@array_of_compound_type@
typedef uuid_t;
identifier s, u;
type t = {struct s, union u, uuid_t};
identifier x;
@@
t x[...] = {
- 0
};
@multi_dimensional_array_of_anything@
type t;
identifier x;
@@
t x[...][...] = {
- 0
};
But it emits a bunch of warnings:
warning: compound: metavariable os not used in the - or context code
warning: compound: metavariable is not used in the - or context code
warning: compound: metavariable iu not used in the - or context code
warning: compound: metavariable ou not used in the - or context code
warning: array_of_compound_type: metavariable u not used in the - or context code
warning: array_of_compound_type: metavariable s not used in the - or context code
Can these be silenced in some sane way?
Thanks!
-Kees
--
Kees Cook
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
2021-09-18 15:40 ` Kees Cook
@ 2021-09-18 15:49 ` Kees Cook
2021-09-18 16:13 ` Julia Lawall
2021-09-18 16:12 ` Julia Lawall
2021-09-18 18:50 ` Julia Lawall
2 siblings, 1 reply; 13+ messages in thread
From: Kees Cook @ 2021-09-18 15:49 UTC (permalink / raw)
To: Mansour Moufid; +Cc: cocci
On Sat, Sep 18, 2021 at 08:40:19AM -0700, Kees Cook wrote:
> Yeah, this is for the kernel. Thanks for helping with this! I was able
> to continue the construction and get it working. :)
I spoke too soon; it fails on the kernel with:
EXN: Coccinelle_modules.Common.Timeout
any ideas?
--
Kees Cook
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
2021-09-18 15:40 ` Kees Cook
2021-09-18 15:49 ` Kees Cook
@ 2021-09-18 16:12 ` Julia Lawall
2021-09-18 18:50 ` Julia Lawall
2 siblings, 0 replies; 13+ messages in thread
From: Julia Lawall @ 2021-09-18 16:12 UTC (permalink / raw)
To: Kees Cook; +Cc: Mansour Moufid, cocci
> But it emits a bunch of warnings:
>
> warning: compound: metavariable os not used in the - or context code
> warning: compound: metavariable is not used in the - or context code
> warning: compound: metavariable iu not used in the - or context code
> warning: compound: metavariable ou not used in the - or context code
> warning: array_of_compound_type: metavariable u not used in the - or context code
> warning: array_of_compound_type: metavariable s not used in the - or context code
>
> Can these be silenced in some sane way?
Surely. I'll take a look.
julia
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
2021-09-18 15:49 ` Kees Cook
@ 2021-09-18 16:13 ` Julia Lawall
2021-09-21 4:11 ` Kees Cook
0 siblings, 1 reply; 13+ messages in thread
From: Julia Lawall @ 2021-09-18 16:13 UTC (permalink / raw)
To: Kees Cook; +Cc: Mansour Moufid, cocci
On Sat, 18 Sep 2021, Kees Cook wrote:
> On Sat, Sep 18, 2021 at 08:40:19AM -0700, Kees Cook wrote:
> > Yeah, this is for the kernel. Thanks for helping with this! I was able
> > to continue the construction and get it working. :)
>
> I spoke too soon; it fails on the kernel with:
> EXN: Coccinelle_modules.Common.Timeout
What is your command line? If it times out on one file, it should just
move on to the next one.
julia
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
2021-09-18 15:40 ` Kees Cook
2021-09-18 15:49 ` Kees Cook
2021-09-18 16:12 ` Julia Lawall
@ 2021-09-18 18:50 ` Julia Lawall
2021-09-21 4:08 ` Kees Cook
2 siblings, 1 reply; 13+ messages in thread
From: Julia Lawall @ 2021-09-18 18:50 UTC (permalink / raw)
To: Kees Cook; +Cc: Mansour Moufid, cocci
> But it emits a bunch of warnings:
>
> warning: compound: metavariable os not used in the - or context code
> warning: compound: metavariable is not used in the - or context code
> warning: compound: metavariable iu not used in the - or context code
> warning: compound: metavariable ou not used in the - or context code
> warning: array_of_compound_type: metavariable u not used in the - or context code
> warning: array_of_compound_type: metavariable s not used in the - or context code
>
> Can these be silenced in some sane way?
The problem is fixed.
julia
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
2021-09-18 18:50 ` Julia Lawall
@ 2021-09-21 4:08 ` Kees Cook
2021-09-21 5:35 ` Julia Lawall
0 siblings, 1 reply; 13+ messages in thread
From: Kees Cook @ 2021-09-21 4:08 UTC (permalink / raw)
To: Julia Lawall; +Cc: Mansour Moufid, cocci
On Sat, Sep 18, 2021 at 08:50:57PM +0200, Julia Lawall wrote:
> > But it emits a bunch of warnings:
> >
> > warning: compound: metavariable os not used in the - or context code
> > warning: compound: metavariable is not used in the - or context code
> > warning: compound: metavariable iu not used in the - or context code
> > warning: compound: metavariable ou not used in the - or context code
> > warning: array_of_compound_type: metavariable u not used in the - or context code
> > warning: array_of_compound_type: metavariable s not used in the - or context code
> >
> > Can these be silenced in some sane way?
>
> The problem is fixed.
Awesome; thank you! I'll need to start building coccinelle from git now.
:)
--
Kees Cook
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
2021-09-18 16:13 ` Julia Lawall
@ 2021-09-21 4:11 ` Kees Cook
2021-09-21 5:37 ` Julia Lawall
0 siblings, 1 reply; 13+ messages in thread
From: Kees Cook @ 2021-09-21 4:11 UTC (permalink / raw)
To: Julia Lawall; +Cc: Mansour Moufid, cocci
On Sat, Sep 18, 2021 at 06:13:32PM +0200, Julia Lawall wrote:
>
>
> On Sat, 18 Sep 2021, Kees Cook wrote:
>
> > On Sat, Sep 18, 2021 at 08:40:19AM -0700, Kees Cook wrote:
> > > Yeah, this is for the kernel. Thanks for helping with this! I was able
> > > to continue the construction and get it working. :)
> >
> > I spoke too soon; it fails on the kernel with:
> > EXN: Coccinelle_modules.Common.Timeout
>
> What is your command line? If it times out on one file, it should just
> move on to the next one.
To work around potential intermixed output, I rewrite the normal
coccicheck arguments that uses --jobs to launch $nproc many spatch
instances with -max and -index. I will switch back to using --jobs and
see if I still get corrupted patches... (It's been a while since I
created this alternative workflow.)
-Kees
--
Kees Cook
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
2021-09-21 4:08 ` Kees Cook
@ 2021-09-21 5:35 ` Julia Lawall
0 siblings, 0 replies; 13+ messages in thread
From: Julia Lawall @ 2021-09-21 5:35 UTC (permalink / raw)
To: Kees Cook; +Cc: Mansour Moufid, cocci
On Mon, 20 Sep 2021, Kees Cook wrote:
> On Sat, Sep 18, 2021 at 08:50:57PM +0200, Julia Lawall wrote:
> > > But it emits a bunch of warnings:
> > >
> > > warning: compound: metavariable os not used in the - or context code
> > > warning: compound: metavariable is not used in the - or context code
> > > warning: compound: metavariable iu not used in the - or context code
> > > warning: compound: metavariable ou not used in the - or context code
> > > warning: array_of_compound_type: metavariable u not used in the - or context code
> > > warning: array_of_compound_type: metavariable s not used in the - or context code
> > >
> > > Can these be silenced in some sane way?
> >
> > The problem is fixed.
>
> Awesome; thank you! I'll need to start building coccinelle from git now.
> :)
Yes, we are not so proactive about making releases. One should come soon,
but there is a build-related problem that needs to be addressed in the
meantime.
julia
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: matching an arbitrary struct or union (but not scalars)
2021-09-21 4:11 ` Kees Cook
@ 2021-09-21 5:37 ` Julia Lawall
0 siblings, 0 replies; 13+ messages in thread
From: Julia Lawall @ 2021-09-21 5:37 UTC (permalink / raw)
To: Kees Cook; +Cc: Mansour Moufid, cocci
On Mon, 20 Sep 2021, Kees Cook wrote:
> On Sat, Sep 18, 2021 at 06:13:32PM +0200, Julia Lawall wrote:
> >
> >
> > On Sat, 18 Sep 2021, Kees Cook wrote:
> >
> > > On Sat, Sep 18, 2021 at 08:40:19AM -0700, Kees Cook wrote:
> > > > Yeah, this is for the kernel. Thanks for helping with this! I was able
> > > > to continue the construction and get it working. :)
> > >
> > > I spoke too soon; it fails on the kernel with:
> > > EXN: Coccinelle_modules.Common.Timeout
> >
> > What is your command line? If it times out on one file, it should just
> > move on to the next one.
>
> To work around potential intermixed output, I rewrite the normal
> coccicheck arguments that uses --jobs to launch $nproc many spatch
> instances with -max and -index. I will switch back to using --jobs and
> see if I still get corrupted patches... (It's been a while since I
> created this alternative workflow.)
If you are using --max and --index, it seems that you are not using
parmap. That should all work fine now.
julia
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2021-09-21 5:37 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <202109161609.9AB60A934B@keescook>
2021-09-17 4:35 ` matching an arbitrary struct or union (but not scalars) Mansour Moufid
2021-09-17 6:37 ` Julia Lawall
2021-09-17 6:34 ` Julia Lawall
2021-09-17 19:16 ` Mansour Moufid
2021-09-18 15:40 ` Kees Cook
2021-09-18 15:49 ` Kees Cook
2021-09-18 16:13 ` Julia Lawall
2021-09-21 4:11 ` Kees Cook
2021-09-21 5:37 ` Julia Lawall
2021-09-18 16:12 ` Julia Lawall
2021-09-18 18:50 ` Julia Lawall
2021-09-21 4:08 ` Kees Cook
2021-09-21 5:35 ` Julia Lawall
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.