user: 下面的汇编指令对应的C源代码是什么：

```asm
<test_check_user_token>:
  endbr64
  push   %r14
  lea    D21(%rip),%r14
  push   %r13
  lea    D200(%rip),%r13
  push   %r12
  push   %rbp
  sub    $0x28,%rsp
  movdqa D211(%rip),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  mov    %rsp,%rbp
  movl   $0x585858,0x10(%rsp)
  mov    %rbp,%rdi
  movaps %xmm0,(%rsp)
  call   <mkstemp@plt>
  xor    %edi,%edi
  cmp    $0xffffffff,%eax
  mov    %eax,%r12d
  setne  %dil
  call   <assert@plt>
  mov    %r12d,%edi
  lea    D201(%rip),%rsi
  call   <fdopen@plt>
  lea    D82(%rip),%rsi
  mov    %rax,%r12
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D95(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D139(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D1(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D235(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D153(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D79(%rip),%rsi
  call   <fprintf@plt>
  lea    D87(%rip),%rsi
  mov    %r12,%rdi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D30(%rip),%r12
  call   <fclose@plt>
  mov    %r12,%rsi
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  lea    D44(%rip),%rdx
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    %r12,%rsi
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  lea    D91(%rip),%rdx
  lea    D107(%rip),%r12
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0xffffffff,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  lea    D115(%rip),%rdx
  mov    %rbp,%rdi
  lea    D154(%rip),%rsi
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    %r13,%rdx
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  lea    D162(%rip),%rsi
  lea    D202(%rip),%r13
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  lea    D140(%rip),%rdx
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0xfffffffe,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    D117(%rip),%rdx
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    D116(%rip),%rdx
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    D7(%rip),%rdx
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0xffffffff,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r14,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0xffffffff,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r14,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0xfffffffe,%eax
  sete   %dil
  call   <assert@plt>
  mov    %rbp,%rdi
  call   <remove@plt>
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L1
  add    $0x28,%rsp
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L1:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D21
datatype: string
name: disassemble_data
arguments: data_tag: D200
datatype: string
name: disassemble_data
arguments: data_tag: D211
datatype: byte[16]
name: disassemble_data
arguments: data_tag: D201
datatype: string
name: disassemble_data
arguments: data_tag: D82
datatype: string
name: disassemble_data
arguments: data_tag: D95
datatype: string
name: disassemble_data
arguments: data_tag: D139
datatype: string
name: disassemble_data
arguments: data_tag: D1
datatype: string
name: disassemble_data
arguments: data_tag: D235
datatype: string
name: disassemble_data
arguments: data_tag: D153
datatype: string
name: disassemble_data
arguments: data_tag: D79
datatype: string
name: disassemble_data
arguments: data_tag: D87
datatype: string
name: disassemble_data
arguments: data_tag: D30
datatype: string
name: disassemble_data
arguments: data_tag: D44
datatype: string
name: disassemble_data
arguments: data_tag: D91
datatype: string
name: disassemble_data
arguments: data_tag: D107
datatype: string
name: disassemble_data
arguments: data_tag: D115
datatype: string
name: disassemble_data
arguments: data_tag: D154
datatype: string
name: disassemble_data
arguments: data_tag: D162
datatype: string
name: disassemble_data
arguments: data_tag: D202
datatype: string
name: disassemble_data
arguments: data_tag: D140
datatype: string
name: disassemble_data
arguments: data_tag: D117
datatype: string
name: disassemble_data
arguments: data_tag: D116
datatype: string
name: disassemble_data
arguments: data_tag: D7
datatype: string

tool: 

tool: D200: hnhbhnhbhnhb

tool: {"D211": [0x2f,0x74,0x6d,0x70,0x2f,0x70,0x61,0x6d,0x74,0x65,0x73,0x74,0x2e,0x58,0x58,0x58]}

tool: D201: w

tool: D82: # This is a comment containing foobar:foobar


tool: D95: foobar:hhhvhvhdhbid:hnhbhnhbhnhb:


tool: D139: # This is a comment in the middle


tool: D1: kaka:hdhrhbhjhvhu:hihbhdhrhbhj


tool: D235: # foo2 is a user showing up twice in the file


tool: D153: foo2:vvvvvvvvvvvv


tool: D79: bar:hnhbhnhbhnhb


tool: D87: foo2:cccccccccccc


tool: D30: foobar

tool: D44: hhhvhvhdhbid

tool: D91: hnhbhnhbhnhc

tool: D107: foo2

tool: D115: hihbhdhrhbhj

tool: D154: kaka

tool: D162: bar

tool: D202: foo

tool: D140: hdhrhbhjhvhu

tool: D117: cccccccccccc

tool: D116: vvvvvvvvvvvv

tool: D7: vvvvvvvvvvcc

assistant: ```c
void test_check_user_token(void) {
  char file[] = "/tmp/pamtest.XXXXXX";
  int fd = mkstemp(file);
  FILE *handle;
  int ret;
  assert(fd != -1);
  handle = fdopen(fd, "w");
  fprintf(handle, "# This is a comment containing foobar:foobar\n");
  fprintf(handle, "foobar:hhhvhvhdhbid:hnhbhnhbhnhb:\n");
  fprintf(handle, "# This is a comment in the middle\n");
  fprintf(handle, "kaka:hdhrhbhjhvhu:hihbhdhrhbhj\n");
  fprintf(handle, "# foo2 is a user showing up twice in the file\n");
  fprintf(handle, "foo2:vvvvvvvvvvvv\n");
  fprintf(handle, "bar:hnhbhnhbhnhb\n");
  fprintf(handle, "foo2:cccccccccccc\n");
  fclose(handle);
  ret = check_user_token(file, "foobar", "hhhvhvhdhbid", 1);
  assert(ret == 1);
  ret = check_user_token(file, "foobar", "hnhbhnhbhnhb", 1);
  assert(ret == 1);
  ret = check_user_token(file, "foobar", "hnhbhnhbhnhc", 1);
  assert(ret == -1);
  ret = check_user_token(file, "kaka", "hihbhdhrhbhj", 1);
  assert(ret == 1);
  ret = check_user_token(file, "bar", "hnhbhnhbhnhb", 1);
  assert(ret == 1);
  ret = check_user_token(file, "foo", "hdhrhbhjhvhu", 1);
  assert(ret == -2);
  ret = check_user_token(file, "foo2", "cccccccccccc", 1);
  assert(ret == 1);
  ret = check_user_token(file, "foo2", "vvvvvvvvvvvv", 1);
  assert(ret == 1);
  ret = check_user_token(file, "foo2", "vvvvvvvvvvcc", 1);
  assert(ret == -1);
  ret = check_user_token(file, "foo2", "", 1);
  assert(ret == -1);
  ret = check_user_token(file, "foo", "", 1);
  assert(ret == -2);
  remove(file);
}
```