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

```asm
<check_intof>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  movl   $0x0,(%rsp)
  mov    %rsp,%rdx
  mov    D160(%rip),%rax
  mov    (%rax),%edi
  sub    $0x3,%edi
  mov    $0x1,%esi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  mov    $0x0,%edi
  test   %rax,%rax
  jne    L3
  mov    D160(%rip),%rax
  mov    (%rax),%eax
  sub    $0x2,%eax
  cmp    (%rsp),%eax
  sete   %dil
  movzbl %dil,%edi
L3:
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rsp,%rbx
  mov    D160(%rip),%rbp
  mov    0x0(%rbp),%eax
  lea    -0x3(%rax),%edi
  mov    %rbx,%rdx
  mov    $0x5,%esi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    0x0(%rbp),%edi
  sub    $0x3,%edi
  mov    %rbx,%rdx
  mov    $0x3,%esi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  mov    $0x0,%edi
  test   %rax,%rax
  jne    L56
  mov    D160(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,(%rsp)
  sete   %dil
  movzbl %dil,%edi
L56:
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rsp,%rbx
  mov    D160(%rip),%rax
  mov    (%rax),%edi
  sub    $0x3,%edi
  mov    %rbx,%rdx
  mov    $0x4,%esi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    D152(%rip),%rax
  mov    (%rax),%esi
  mov    $0x0,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  mov    $0x0,%edi
  test   %rax,%rax
  jne    L39
  mov    D152(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,(%rsp)
  sete   %dil
  movzbl %dil,%edi
L39:
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rsp,%rbx
  mov    %rbx,%rdx
  mov    D152(%rip),%rax
  mov    (%rax),%esi
  mov    $0xffffffff,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    D160(%rip),%rax
  mov    (%rax),%esi
  mov    $0x1,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    $0x80000000,%esi
  mov    $0x0,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    $0x7fffffff,%esi
  mov    $0x0,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  mov    $0x0,%edi
  test   %rax,%rax
  jne    L16
  cmpl   $0x7fffffff,(%rsp)
  sete   %dil
  movzbl %dil,%edi
L16:
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rsp,%rbx
  mov    %rbx,%rdx
  mov    $0xfffffff6,%esi
  mov    $0x0,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    $0x10000000,%esi
  mov    $0x70000000,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  mov    $0x0,%edi
  test   %rax,%rax
  jne    L84
  cmpl   $0x80000000,(%rsp)
  sete   %dil
  movzbl %dil,%edi
L84:
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rsp,%rbx
  mov    %rbx,%rdx
  mov    $0x10,%esi
  mov    $0x7ffffff0,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    D41(%rip),%rax
  mov    (%rax),%edi
  sub    $0x3,%edi
  mov    %rbx,%rdx
  mov    $0x1,%esi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  mov    $0x0,%edi
  test   %rax,%rax
  jne    L138
  mov    D41(%rip),%rax
  mov    (%rax),%eax
  sub    $0x2,%eax
  cmp    (%rsp),%eax
  sete   %dil
  movzbl %dil,%edi
L138:
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rsp,%rbx
  mov    D41(%rip),%rbp
  mov    0x0(%rbp),%eax
  lea    -0x3(%rax),%edi
  mov    %rbx,%rdx
  mov    $0x5,%esi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    0x0(%rbp),%edi
  sub    $0x3,%edi
  mov    %rbx,%rdx
  mov    $0x4,%esi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    $0xfffffffd,%esi
  mov    $0x2,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x17,(%rsp)
  mov    %rbx,%rdx
  mov    $0xfffffffe,%esi
  mov    $0x2,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  mov    $0x0,%edi
  test   %rax,%rax
  jne    L19
  cmpl   $0x0,(%rsp)
  sete   %dil
  movzbl %dil,%edi
L19:
  call   <assert@plt>
  movl   $0x17,(%rsp)
  mov    %rsp,%rbx
  mov    %rbx,%rdx
  mov    $0x80000000,%esi
  mov    $0x80000000,%edi
  mov    $0x0,%eax
  call   <__builtin_sub_overflow@plt>
  or     (%rsp),%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    $0x80000000,%esi
  mov    $0x7fffffff,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    D41(%rip),%rax
  mov    (%rax),%esi
  mov    $0x1,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    $0xfffffffb,%esi
  mov    $0x0,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  mov    $0x0,%edi
  test   %rax,%rax
  jne    L37
  cmpl   $0xfffffffb,(%rsp)
  sete   %dil
  movzbl %dil,%edi
L37:
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rsp,%rbx
  mov    %rbx,%rdx
  mov    $0x5,%esi
  mov    $0xfffffff0,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    $0xfffffffb,%esi
  mov    $0x10,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    $0xfffffffb,%esi
  mov    $0xfffffff6,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  cmp    $0x1,%rax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbx,%rdx
  mov    $0x5,%esi
  mov    $0xa,%edi
  mov    $0x0,%eax
  call   <__builtin_sub_overflow@plt>
  mov    $0x0,%edi
  test   %eax,%eax
  jne    L135
  cmpl   $0x5,(%rsp)
  sete   %dil
  movzbl %dil,%edi
L135:
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rsp,%rdx
  mov    $0xa,%esi
  mov    $0x5,%edi
  mov    $0x0,%eax
  call   <__builtin_sub_overflow@plt>
  mov    $0x0,%edi
  test   %eax,%eax
  jne    L130
  cmpl   $0xfffffffb,(%rsp)
  sete   %dil
  movzbl %dil,%edi
L130:
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rsp,%rbp
  mov    D152(%rip),%rbx
  mov    %rbp,%rdx
  mov    $0xa,%esi
  mov    (%rbx),%edi
  mov    $0x0,%eax
  call   <__builtin_sub_overflow@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbp,%rdx
  mov    $0xfffffff6,%esi
  mov    (%rbx),%edi
  mov    $0x0,%eax
  call   <__builtin_sub_overflow@plt>
  mov    $0x0,%edi
  test   %eax,%eax
  jne    L98
  mov    D152(%rip),%rax
  mov    (%rax),%eax
  add    $0xa,%eax
  cmp    (%rsp),%eax
  sete   %dil
  movzbl %dil,%edi
L98:
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rsp,%rbp
  mov    D160(%rip),%rbx
  mov    %rbp,%rdx
  mov    $0xfffffff6,%esi
  mov    (%rbx),%edi
  mov    $0x0,%eax
  call   <__builtin_sub_overflow@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  movl   $0x0,(%rsp)
  mov    %rbp,%rdx
  mov    $0xa,%esi
  mov    (%rbx),%edi
  mov    $0x0,%eax
  call   <__builtin_sub_overflow@plt>
  mov    $0x0,%edi
  test   %eax,%eax
  jne    L2
  mov    D160(%rip),%rax
  mov    (%rax),%eax
  sub    $0xa,%eax
  cmp    (%rsp),%eax
  sete   %dil
  movzbl %dil,%edi
L2:
  call   <assert@plt>
  movq   $0x0,(%rsp)
  mov    %rsp,%rdx
  mov    $0x10,%esi
  mov    $0xfffffff0,%edi
  mov    $0x0,%eax
  call   <__builtin_add_overflow@plt>
  mov    $0x0,%edi
  test   %rax,%rax
  jne    L136
  movabs $0x100000000,%rax
  cmp    %rax,(%rsp)
  sete   %dil
  movzbl %dil,%edi
L136:
  call   <assert@plt>
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L59
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  ret
L59:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void check_intof() {
  {
    int a;
    a = 0;
    assert(__builtin_add_overflow(INT_MAX - 3, 1, &a) == 0 && a == INT_MAX - 2);
    a = 0;
    assert(__builtin_add_overflow(INT_MAX - 3, 5, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(INT_MAX - 3, 3, &a) == 0 && a == INT_MAX);
    a = 0;
    assert(__builtin_add_overflow(INT_MAX - 3, 4, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(0, INT_MIN, &a) == 0 && a == INT_MIN);
    a = 0;
    assert(__builtin_add_overflow(-1, INT_MIN, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(1, INT_MAX, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(0x100000000ll, -0x80000000ll, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(0x100000000ll, -0x80000001ll, &a) == 0 && a == 0x7fffffff);
    a = 0;
    assert(__builtin_add_overflow(0x100000000ll, -10, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(-0x90000000ll, 0x10000000, &a) == 0 && a == 0x80000000);
    a = 0;
    assert(__builtin_add_overflow(0x7ffffff0, 0x10, &a) == 1);
  }
  {
    unsigned int a;
    a = 0;
    assert(__builtin_add_overflow(UINT_MAX - 3, 1, &a) == 0 && a == UINT_MAX - 2);
    a = 0;
    assert(__builtin_add_overflow(UINT_MAX - 3, 5, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(UINT_MAX - 3, 4, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(2, -3, &a) == 1);
    a = 23;
    assert(__builtin_add_overflow(2, -2, &a) == 0 && a == 0);
    a = 23;
    assert(__builtin_sub_overflow((int)0x80000000, (int)-2147483648, &a) == 0 && a == 0);
    a = 0;
    assert(__builtin_add_overflow((int)0x7fffffff, (int)-2147483648, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(1, UINT_MAX, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(0x100000000ll, -5, &a) == 0 && a == 4294967291);
    a = 0;
    assert(__builtin_add_overflow(-0x100000010ll, 5, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(0x100000010ll, -5, &a) == 1);
    a = 0;
    assert(__builtin_add_overflow(-10, -5, &a) == 1);
  }
  {
    int a;
    a = 0;
    assert(__builtin_sub_overflow(10, 5, &a) == 0 && a == 5);
    a = 0;
    assert(__builtin_sub_overflow(5, 10, &a) == 0 && a == -5);
    a = 0;
    assert(__builtin_sub_overflow(INT_MIN, 10, &a) == 1);
    a = 0;
    assert(__builtin_sub_overflow(INT_MIN, -10, &a) == 0 && a == INT_MIN + 10);
    a = 0;
    assert(__builtin_sub_overflow(INT_MAX, -10, &a) == 1);
    a = 0;
    assert(__builtin_sub_overflow(INT_MAX, 10, &a) == 0 && a == INT_MAX - 10);
  }
  {
    unsigned long long a;
    a = 0;
    assert(__builtin_add_overflow(0xfffffff0ul, 0x10, &a) == 0 && a == 0x100000000);
  }
}
```