Hi,
I have a code like this:
```
static inline void
freestruct_in_nsap(ARGS_FREESTRUCT) {
dns_rdata_in_nsap_t *nsap;
REQUIRE(((dns_rdata_in_nsap_t *)source) != NULL);
REQUIRE(((dns_rdata_in_nsap_t *)source)->common.rdclass ==
dns_rdataclass_in);
REQUIRE(((dns_rdata_in_nsap_t *)source)->common.rdtype ==
dns_rdatatype_nsap);
nsap = source;
```
and due to various combination of a C standard requirement and enforced
cppcheck rules, I can’t change it to a saner workflow for a legacy code.
But I am trying to replace the specific type case with a generic structure, so
it will look like this:
```
static inline void
freestruct_in_nsap(ARGS_FREESTRUCT) {
dns_rdata_in_nsap_t *nsap;
REQUIRE(source != NULL);
REQUIRE(((dns_rdatacommon_t *)source)->rdclass == dns_rdataclass_in);
REQUIRE(((dns_rdatacommon_t *)source)->rdtype == dns_rdatatype_nsap);
nsap = source;
```
These are my rules currently:
```
@@
type T;
expression source;
@@
- REQUIRE(((T *)source) != NULL);
+ REQUIRE(source != NULL);
@@
type T;
type R;
identifier common, rdtype;
T *target;
expression source;
@@
REQUIRE(source != NULL);
...
REQUIRE((
- (T *)
+ (dns_rdatacommon_t *)
source)->
- common.
rdtype == ...);
<+...
target = source;
...+>
```
the first one works like a charm, but the second rule fails with:
```
init_defs_builtins:
/usr/local/bin/../Cellar/coccinelle/1.0.8/bin/../lib/coccinelle/standard.h
plus: parse error:
File "cocci/rdata.spatch", line 21, column 22, charpos = 251
around = ')',
whole content = + (dns_rdatacommon_t *)
```
I must be missing something very obvious as just removing the type works, but
adding the `+ (dns_rdatacommon_t *)` line makes the rule fail.
Thanks,
Ondrej
--
Ondřej Surý
[email protected]
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci