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

Reply via email to