Сопоставить вложенные поля произвольной глубины в структуре в Coccinelle - PullRequest
0 голосов
/ 02 октября 2019

Следующий скрипт Coccinelle преобразует любой sizeof(struct_ptr->field_name) / sizeof(uint16_t) в JUNKSIZE(field_name), что здорово.

@@
typedef My_Struct_Type_t;
typedef uint16_t;
My_Struct_Type_t *H;
identifier I;
@@
-sizeof(H->I) / sizeof(uint16_t)
+JUNKSIZE(I)

Так, например,

My_Struct_Type_t *sptr = ...;
...
SomeFunction(..., sizeof(sptr->field1) / sizeof(uint16_t), ...);

... преобразуетсяto ...

My_Struct_Type_t *sptr = ...;
...
SomeFunction(..., JUNKSIZSE(field1), ...);

Где я борюсь, это если фрагмент для преобразования такой:

My_Struct_Type_t *sptr = ...;
...
SomeFunction(..., sizeof(sptr->field1.nested_field1) / sizeof(uint16_t), ...);

Я не могу сопоставить nested_field1.

I 'мы пытались трактовать I как выражение, а не как идентификатор, но это не работает. Кто-нибудь знает, есть ли способ сделать это, то есть преобразовать sizeof(sptr->field1.nested_field1) / sizeof(uint16_t) в JUNKSIZE(field1.nested_field1) ?. Спасибо:)

...