parse: Support @if conditionals in record definitions

Closes #3531
This commit is contained in:
Arne Welzel 2024-01-06 14:05:45 +01:00
parent 5ff99f7d0b
commit f3cbfa9c25
17 changed files with 147 additions and 2 deletions

16
NEWS
View file

@ -135,6 +135,22 @@ New Functionality
- The QUIC analyzer has been extended to support analyzing QUIC Version 2 - The QUIC analyzer has been extended to support analyzing QUIC Version 2
INITIAL packets (RFC 9369). INITIAL packets (RFC 9369).
- Conditional directives (``@if``, ``@ifdef``, ``@ifndef``, ``@else`` and
``@endif``) can now be placed within a record's definition to conditionally
define or extend a record type's fields.
type r: record {
c: count;
@if ( cond )
d: double;
@else
d: count;
@endif
};
Note that generally you should prefer record extension in conditionally loaded
scripts rather than using conditional directives in the original record definition.
Changed Functionality Changed Functionality
--------------------- ---------------------

View file

@ -1319,9 +1319,9 @@ type_list:
; ;
type_decl_list: type_decl_list:
type_decl_list type_decl type_decl_list conditional_list type_decl
{ {
$1->push_back($2); $1->push_back($3);
} }
| |
{ {

View file

@ -0,0 +1 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.

View file

@ -0,0 +1,6 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
r, {
[c] = [type_name=count, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[d] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[s] = [type_name=string, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F]
}

View file

@ -0,0 +1 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.

View file

@ -0,0 +1,5 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
r, {
[c] = [type_name=count, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[s] = [type_name=string, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F]
}

View file

@ -0,0 +1 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.

View file

@ -0,0 +1,6 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
r, {
[c] = [type_name=count, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[s] = [type_name=string, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[z] = [type_name=addr, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F]
}

View file

@ -0,0 +1 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.

View file

@ -0,0 +1,5 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
r, {
[c] = [type_name=count, log=F, value=<uninitialized>, default_val=0, optional=T],
[d] = [type_name=double, log=F, value=<uninitialized>, default_val=0.0, optional=T]
}

View file

@ -0,0 +1 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.

View file

@ -0,0 +1,5 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
r, {
[c] = [type_name=count, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[d] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F]
}

View file

@ -0,0 +1 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.

View file

@ -0,0 +1,5 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
r, {
[c] = [type_name=count, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[d] = [type_name=double, log=F, value=<uninitialized>, default_val=42.0, optional=T]
}

View file

@ -0,0 +1 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.

View file

@ -0,0 +1,5 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
r, {
[c] = [type_name=count, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[d] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F]
}

View file

@ -0,0 +1,85 @@
# @TEST-DOC: Test that @if conditionals are allowed within record definitions.
#
# @TEST-REQUIRES: test "${ZEEK_USE_CPP}" != "1"
# @TEST-EXEC: zeek -b %INPUT common.zeek
# @TEST-EXEC: TEST_DIFF_CANONIFIER= btest-diff .stdout
# @TEST-EXEC: TEST_DIFF_CANONIFIER= btest-diff .stderr
type r: record {
c: count;
@if ( T )
d: double;
@endif
};
# @TEST-START-NEXT
type r: record {
c: count;
@if ( T )
d: double;
s: string;
@endif
};
# @TEST-START-NEXT
type r: record {
c: count;
@if ( F )
d: double;
@else
s: string;
@endif
};
# @TEST-START-NEXT
type r: record {
c: count;
@if ( F )
d: double;
@else
s: string;
@endif
z: addr;
};
# @TEST-START-NEXT
type r: record {};
redef record r += {
c: count &default=0;
@if ( T )
d: double &default=0.0;
@endif
};
# @TEST-START-NEXT
# Pretty strange usage.
@if ( T )
type r: record {
c: count;
@endif
d: double;
};
# @TEST-START-NEXT
# Even more strange.
@if ( T )
type r: record {
c: count;
@endif
@if ( F )
d: double &default=1.0;;
};
@else
d: double &default=42.0;
};
@endif
# @TEST-START-FILE common.zeek
event zeek_init()
{
print "r", record_fields(r);
}
# @TEST-END-FILE