Choice元素是DataModel或Block的子元素。 Choice元素用于指示任何子元素都是有效的,但只能选择一个。 很像编程语言中的switch语句。
<Choice name="ChoiceBlock">
<Block name="Type1">
<!-- ... -->
</Block>
<Block name="Type2">
<!-- ... -->
</Block>
<Block name="Type3">
<!-- ... -->
</Block>
</Choice>
除非另有说明,所有属性都是可选的
一个基本的Choice Block。 该Choice示例将破解或使用类型为1,2,3的数据。 就像常规的switch语句一样,需要在标记上做出决定。
如果前8位值为1,则剩余数据被视为一个32位的数。 如果前8位值为2,则剩余数据被视为一串长度为255个字节的二进制数据。 如果前8位值为3,则剩余数据被视为一个8字节的字符串。
当进行模糊化测试时Peach会选择三种类型之一,将其模糊为8位数字输出,并且接着输出相应的类型。 Peach将尝试全部三种类型。
<DataModel name="ChoiceExample1">
<Choice name="Choice1">
<Block name="Type1">
<Number name="Str1" size="8" value="1" token="true" />
<Number size="32"/>
</Block>
<Block name="Type2">
<Number name="Str2" size="8" value="2" token="true" />
<Blob length="255" />
</Block>
<Block name="Type3">
<Number name="Str3" size="8" value="3" token="true" />
<String length="8" />
</Block>
</Choice>
</DataModel>
第一个例子适合做出单一选择,但如果有很多Type1 Type2和Type3块都相互连接,会怎么样呢? 设置minOccurs,maxOccurs或occurs以指定Choice应该被重复。
<DataModel name="ChoiceExample1">
<Choice name="Choice1" minOccurs="3" maxOccurs="6">
<Block name="Type1">
<Number name="Str1" size="8" value="1" token="true" />
<Number size="32"/>
</Block>
<Block name="Type2">
<Number name="Str2" size="8" value="2" token="true" />
<Blob length="255" />
</Block>
<Block name="Type3">
<Number name="Str3" size="8" value="3" token="true" />
<String length="8" />
</Block>
</Choice>
</DataModel>