user: 请从给定的汇编指令推导出C源代码:

```asm
<test_is_superset_of>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D27(%rip),%rax
  mov    %rax,-0x30(%rbp)
  lea    D14(%rip),%rax
  mov    %rax,-0x28(%rbp)
  lea    D20(%rip),%rax
  mov    %rax,-0x20(%rbp)
  lea    D104(%rip),%rax
  mov    %rax,-0x18(%rbp)
  lea    D97(%rip),%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x5,-0xa4(%rbp)
  mov    -0xa4(%rbp),%edx
  lea    -0x30(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <stringset_alloc_from_array@plt>
  mov    %rax,-0x98(%rbp)
  mov    -0x98(%rbp),%rax
  mov    %eax,%edi
  call   <assert@plt>
  lea    D14(%rip),%rax
  mov    %rax,-0x70(%rbp)
  lea    D55(%rip),%rax
  mov    %rax,-0x68(%rbp)
  lea    D104(%rip),%rax
  mov    %rax,-0x60(%rbp)
  movl   $0x3,-0xa0(%rbp)
  mov    -0xa0(%rbp),%edx
  lea    -0x70(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <stringset_alloc_from_array@plt>
  mov    %rax,-0x90(%rbp)
  mov    -0x90(%rbp),%rax
  mov    %eax,%edi
  call   <assert@plt>
  lea    D14(%rip),%rax
  mov    %rax,-0x50(%rbp)
  lea    D27(%rip),%rax
  mov    %rax,-0x48(%rbp)
  lea    D104(%rip),%rax
  mov    %rax,-0x40(%rbp)
  movl   $0x3,-0x9c(%rbp)
  mov    -0x9c(%rbp),%edx
  lea    -0x50(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <stringset_alloc_from_array@plt>
  mov    %rax,-0x88(%rbp)
  mov    -0x88(%rbp),%rax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x88(%rbp),%rax
  mov    %rax,%rdi
  call   <stringset_alloc_from_stringset@plt>
  mov    %rax,-0x80(%rbp)
  mov    -0x80(%rbp),%rax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x90(%rbp),%rdx
  mov    -0x98(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x88(%rbp),%rdx
  mov    -0x98(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x98(%rbp),%rdx
  mov    -0x90(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x88(%rbp),%rdx
  mov    -0x90(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x98(%rbp),%rdx
  mov    -0x88(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x90(%rbp),%rdx
  mov    -0x88(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x88(%rbp),%rdx
  mov    -0x88(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x80(%rbp),%rdx
  mov    -0x88(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x88(%rbp),%rdx
  mov    -0x80(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x0,%eax
  call   <stringset_alloc@plt>
  mov    %rax,-0x78(%rbp)
  mov    -0x78(%rbp),%rax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x98(%rbp),%rdx
  mov    -0x78(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x90(%rbp),%rdx
  mov    -0x78(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x88(%rbp),%rdx
  mov    -0x78(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x78(%rbp),%rdx
  mov    -0x78(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x78(%rbp),%rdx
  mov    -0x98(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x78(%rbp),%rdx
  mov    -0x90(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x78(%rbp),%rdx
  mov    -0x88(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <stringset_is_superset_of@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x98(%rbp),%rax
  mov    %rax,%rdi
  call   <stringset_free@plt>
  mov    -0x90(%rbp),%rax
  mov    %rax,%rdi
  call   <stringset_free@plt>
  mov    -0x88(%rbp),%rax
  mov    %rax,%rdi
  call   <stringset_free@plt>
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <stringset_free@plt>
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <stringset_free@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L3
  call   <__stack_chk_fail@plt>
L3:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D27
datatype: string
name: disassemble_data
arguments: data_label: D14
datatype: string
name: disassemble_data
arguments: data_label: D20
datatype: string
name: disassemble_data
arguments: data_label: D104
datatype: string
name: disassemble_data
arguments: data_label: D97
datatype: string
name: disassemble_data
arguments: data_label: D55
datatype: string

tool: D27: watermelon

tool: D14: mango

tool: D20: apple

tool: D104: banana

tool: D97: strawberry

tool: D55: green

assistant: ```c
void test_is_superset_of(void) {
  char const *members1[] = {"watermelon", "mango", "apple", "banana", "strawberry"};
  int members1_count = sizeof members1 / sizeof members1[0];
  struct stringset *set1 = stringset_alloc_from_array(members1, members1_count);
  assert(set1);
  char const *members2[] = {"mango", "green", "banana"};
  int members2_count = sizeof members2 / sizeof members2[0];
  struct stringset *set2 = stringset_alloc_from_array(members2, members2_count);
  assert(set2);
  char const *members3[] = {"mango", "watermelon", "banana"};
  int members3_count = sizeof members3 / sizeof members3[0];
  struct stringset *set3 = stringset_alloc_from_array(members3, members3_count);
  assert(set3);
  struct stringset *set3_dup = stringset_alloc_from_stringset(set3);
  assert(set3_dup);
  assert(!stringset_is_superset_of(set1, set2));
  assert(stringset_is_superset_of(set1, set3));
  assert(!stringset_is_superset_of(set2, set1));
  assert(!stringset_is_superset_of(set2, set3));
  assert(!stringset_is_superset_of(set3, set1));
  assert(!stringset_is_superset_of(set3, set2));
  assert(stringset_is_superset_of(set3, set3));
  assert(stringset_is_superset_of(set3, set3_dup));
  assert(stringset_is_superset_of(set3_dup, set3));
  struct stringset *empty_set = stringset_alloc();
  assert(empty_set);
  assert(!stringset_is_superset_of(empty_set, set1));
  assert(!stringset_is_superset_of(empty_set, set2));
  assert(!stringset_is_superset_of(empty_set, set3));
  assert(stringset_is_superset_of(empty_set, empty_set));
  assert(stringset_is_superset_of(set1, empty_set));
  assert(stringset_is_superset_of(set2, empty_set));
  assert(stringset_is_superset_of(set3, empty_set));
  stringset_free(set1);
  stringset_free(set2);
  stringset_free(set3);
  stringset_free(set3_dup);
  stringset_free(empty_set);
}
```