int format_number_sigsafe(unsigned long x, char *buf, int buf_len,
                          unsigned int radix) {
  unsigned long tmp;
  int len;
  char *cp;
  if (radix < 2 || radix > 16)
    return 0;
  tmp = x;
  len = 1;
  while (tmp >= radix) {
    tmp /= radix;
    ++len;
  }
  if (!buf || len >= buf_len)
    return 0;
  cp = buf + len;
  *cp = '\0';
  do {
    unsigned digit = x % radix;
    (void)({
      if (__builtin_expect(!!(!(cp > buf)), 0)) {
        tor_assertion_failed_(
            ("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/"
             "2022-01-22/02-19-57/repos/5mil/lulz/refs/heads/master/src/tor/"
             "tor_util.c"),
            3454, __func__, "cp > buf");
        abort();
      }
    });
    --cp;
    *cp = "0123456789ABCDEF"[digit];
    x /= radix;
  } while (x);
  if (cp != buf) {
    abort();
  }
  return len;
}


x86 assembly (clang, -O0):
<format_number_sigsafe>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
cmpl   $0x2,-0x20(%rbp)
jb     114a <format_number_sigsafe+0x2a>
cmpl   $0x10,-0x20(%rbp)
jbe    1156 <format_number_sigsafe+0x36>
movl   $0x0,-0x4(%rbp)
jmp    127e <format_number_sigsafe+0x15e>
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x1,-0x2c(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%ecx
cmp    %rcx,%rax
jb     1195 <format_number_sigsafe+0x75>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
mov    -0x28(%rbp),%rax
xor    %edx,%edx
div    %rcx
mov    %rax,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1165 <format_number_sigsafe+0x45>
cmpq   $0x0,-0x18(%rbp)
je     11ac <format_number_sigsafe+0x8c>
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jl     11b8 <format_number_sigsafe+0x98>
movl   $0x0,-0x4(%rbp)
jmp    127e <format_number_sigsafe+0x15e>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
xor    %edx,%edx
div    %rcx
mov    %edx,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x18(%rbp),%rax
seta   %al
xor    $0xff,%al
xor    $0xff,%al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
cltq
cmp    $0x0,%rax
je     1227 <format_number_sigsafe+0x107>
lea    0xdf8(%rip),%rdi
mov    $0xd7e,%esi
lea    0xe75(%rip),%rdx
lea    0xe84(%rip),%rcx
mov    $0x0,%al
call   1030 <tor_assertion_failed_@plt>
call   1040 <abort@plt>
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,%ecx
lea    0xe69(%rip),%rax
mov    (%rax,%rcx,1),%cl
mov    -0x38(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
mov    -0x10(%rbp),%rax
xor    %edx,%edx
div    %rcx
mov    %rax,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    11ce <format_number_sigsafe+0xae>
mov    -0x38(%rbp),%rax
cmp    -0x18(%rbp),%rax
je     1278 <format_number_sigsafe+0x158>
call   1040 <abort@plt>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<format_number_sigsafe>:
push   %rax
lea    -0x11(%rcx),%eax
xor    %r9d,%r9d
cmp    $0xfffffff1,%eax
jb     11c5 <format_number_sigsafe+0xa5>
mov    %edx,%r8d
mov    %rdi,%r11
mov    %ecx,%r10d
mov    $0x1,%ecx
cmp    %rdi,%r10
jbe    1199 <format_number_sigsafe+0x79>
test   %rsi,%rsi
je     11c5 <format_number_sigsafe+0xa5>
cmp    %r8d,%ecx
jge    11c5 <format_number_sigsafe+0xa5>
mov    %ecx,%edi
movb   $0x0,(%rsi,%rdi,1)
lea    0xf4a(%rip),%r8
jmp    117d <format_number_sigsafe+0x5d>
mov    %r11,%rax
xor    %edx,%edx
div    %r10
movzbl (%rdx,%r8,1),%edx
mov    %dl,-0x1(%rsi,%rdi,1)
add    $0xffffffffffffffff,%rdi
cmp    %r10,%r11
mov    %rax,%r11
jb     11bd <format_number_sigsafe+0x9d>
lea    (%rsi,%rdi,1),%rax
cmp    %rsi,%rax
jbe    11ca <format_number_sigsafe+0xaa>
mov    %r11,%rax
shr    $0x20,%rax
jne    1160 <format_number_sigsafe+0x40>
mov    %r11d,%eax
xor    %edx,%edx
div    %r10d
jmp    1168 <format_number_sigsafe+0x48>
mov    %r11,%rax
jmp    11ad <format_number_sigsafe+0x8d>
xchg   %ax,%ax
xor    %edx,%edx
div    %r10
add    $0x1,%ecx
cmp    %r10,%rax
jb     1143 <format_number_sigsafe+0x23>
mov    %rax,%rdx
shr    $0x20,%rdx
jne    11a0 <format_number_sigsafe+0x80>
xor    %edx,%edx
div    %r10d
jmp    11a5 <format_number_sigsafe+0x85>
mov    %ecx,%r9d
test   %rdi,%rdi
jne    11eb <format_number_sigsafe+0xcb>
mov    %r9d,%eax
pop    %rcx
ret
lea    0xe2f(%rip),%rdi
lea    0xeb1(%rip),%rdx
lea    0xec0(%rip),%rcx
mov    $0xd7e,%esi
xor    %eax,%eax
call   1030 <tor_assertion_failed_@plt>
call   1040 <abort@plt>

LLVM IR (-O0):
@.str = [137 x i8] c"/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/5mil/lulz/refs/heads/master/src/tor/tor_util.c\00"
@__func__.format_number_sigsafe = [22 x i8] c"format_number_sigsafe\00"
@.str.1 = [9 x i8] c"cp > buf\00"
@.str.2 = [17 x i8] c"0123456789ABCDEF\00"
define i32 @format_number_sigsafe(i64 %0, i8* %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca i64
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i64
%11 = alloca i32
%12 = alloca i8*
%13 = alloca i32
store i64 %0, i64* %6
store i8* %1, i8** %7
store i32 %2, i32* %8
store i32 %3, i32* %9
%14 = load i32, i32* %9
%15 = icmp ult i32 %14, 2
br i1 %15, label %19, label %16
16: ; preds = %4
%17 = load i32, i32* %9
%18 = icmp ugt i32 %17, 16
br i1 %18, label %19, label %20
19: ; preds = %16, %4
store i32 0, i32* %5
br label %87
20: ; preds = %16
%21 = load i64, i64* %6
store i64 %21, i64* %10
store i32 1, i32* %11
br label %22
22: ; preds = %27, %20
%23 = load i64, i64* %10
%24 = load i32, i32* %9
%25 = zext i32 %24 to i64
%26 = icmp uge i64 %23, %25
br i1 %26, label %27, label %34
27: ; preds = %22
%28 = load i32, i32* %9
%29 = zext i32 %28 to i64
%30 = load i64, i64* %10
%31 = udiv i64 %30, %29
store i64 %31, i64* %10
%32 = load i32, i32* %11
%33 = add nsw i32 %32, 1
store i32 %33, i32* %11
br label %22
34: ; preds = %22
%35 = load i8*, i8** %7
%36 = icmp ne i8* %35, null
br i1 %36, label %37, label %41
37: ; preds = %34
%38 = load i32, i32* %11
%39 = load i32, i32* %8
%40 = icmp sge i32 %38, %39
br i1 %40, label %41, label %42
41: ; preds = %37, %34
store i32 0, i32* %5
br label %87
42: ; preds = %37
%43 = load i8*, i8** %7
%44 = load i32, i32* %11
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %43, i64 %45
store i8* %46, i8** %12
%47 = load i8*, i8** %12
store i8 0, i8* %47
br label %48
48: ; preds = %77, %42
%49 = load i64, i64* %6
%50 = load i32, i32* %9
%51 = zext i32 %50 to i64
%52 = urem i64 %49, %51
%53 = trunc i64 %52 to i32
store i32 %53, i32* %13
%54 = load i8*, i8** %12
%55 = load i8*, i8** %7
%56 = icmp ugt i8* %54, %55
%57 = xor i1 %56, true
%58 = xor i1 %57, true
%59 = xor i1 %58, true
%60 = zext i1 %59 to i32
%61 = sext i32 %60 to i64
%62 = icmp ne i64 %61, 0
br i1 %62, label %63, label %65
63: ; preds = %48
%64 = call i32 (i8*, i32, i8*, i8*, ...) bitcast (i32 (...)* @tor_assertion_failed_ to i32 (i8*, i32, i8*, i8*, ...)*)(i8* getelementptr inbounds ([137 x i8], [137 x i8]* @.str, i64 0, i64 0), i32 3454, i8* getelementptr inbounds ([22 x i8], [22 x i8]* @__func__.format_number_sigsafe, i64 0, i64 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i64 0, i64 0))
unreachable
65: ; preds = %48
%66 = load i8*, i8** %12
%67 = getelementptr inbounds i8, i8* %66, i32 -1
store i8* %67, i8** %12
%68 = load i32, i32* %13
%69 = zext i32 %68 to i64
%70 = getelementptr inbounds [17 x i8], [17 x i8]* @.str.2, i64 0, i64 %69
%71 = load i8, i8* %70
%72 = load i8*, i8** %12
store i8 %71, i8* %72
%73 = load i32, i32* %9
%74 = zext i32 %73 to i64
%75 = load i64, i64* %6
%76 = udiv i64 %75, %74
store i64 %76, i64* %6
br label %77
77: ; preds = %65
%78 = load i64, i64* %6
%79 = icmp ne i64 %78, 0
br i1 %79, label %48, label %80
80: ; preds = %77
%81 = load i8*, i8** %12
%82 = load i8*, i8** %7
%83 = icmp ne i8* %81, %82
br i1 %83, label %84, label %85
84: ; preds = %80
unreachable
85: ; preds = %80
%86 = load i32, i32* %11
store i32 %86, i32* %5
br label %87
87: ; preds = %85, %41, %19
%88 = load i32, i32* %5
ret i32 %88
}

LLVM IR (-O2):
@.str = [137 x i8] c"/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/5mil/lulz/refs/heads/master/src/tor/tor_util.c\00"
@__func__.format_number_sigsafe = [22 x i8] c"format_number_sigsafe\00"
@.str.1 = [9 x i8] c"cp > buf\00"
@.str.2 = [17 x i8] c"0123456789ABCDEF\00"
define i32 @format_number_sigsafe(i64 %0, i8* writeonly %1, i32 %2, i32 %3) {
%5 = add i32 %3, -17
%6 = icmp ult i32 %5, -15
br i1 %6, label %40, label %7
7: ; preds = %4
%8 = zext i32 %3 to i64
%9 = icmp ugt i64 %8, %0
br i1 %9, label %16, label %10
10: ; preds = %7, %10
%11 = phi i32 [ %14, %10 ], [ 1, %7 ]
%12 = phi i64 [ %13, %10 ], [ %0, %7 ]
%13 = udiv i64 %12, %8
%14 = add nuw nsw i32 %11, 1
%15 = icmp ult i64 %13, %8
br i1 %15, label %16, label %10
16: ; preds = %10, %7
%17 = phi i32 [ 1, %7 ], [ %14, %10 ]
%18 = icmp ne i8* %1, null
%19 = icmp slt i32 %17, %2
%20 = select i1 %18, i1 %19, i1 false
br i1 %20, label %21, label %40
21: ; preds = %16
%22 = zext i32 %17 to i64
%23 = getelementptr inbounds i8, i8* %1, i64 %22
store i8 0, i8* %23
br label %24
24: ; preds = %30, %21
%25 = phi i64 [ %0, %21 ], [ %35, %30 ]
%26 = phi i8* [ %23, %21 ], [ %32, %30 ]
%27 = icmp ugt i8* %26, %1
br i1 %27, label %30, label %28
28: ; preds = %24
%29 = tail call i32 (i8*, i32, i8*, i8*, ...) bitcast (i32 (...)* @tor_assertion_failed_ to i32 (i8*, i32, i8*, i8*, ...)*)(i8* getelementptr inbounds ([137 x i8], [137 x i8]* @.str, i64 0, i64 0), i32 3454, i8* getelementptr inbounds ([22 x i8], [22 x i8]* @__func__.format_number_sigsafe, i64 0, i64 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i64 0, i64 0))
tail call void @abort()
unreachable
30: ; preds = %24
%31 = urem i64 %25, %8
%32 = getelementptr inbounds i8, i8* %26, i64 -1
%33 = getelementptr inbounds [17 x i8], [17 x i8]* @.str.2, i64 0, i64 %31
%34 = load i8, i8* %33
store i8 %34, i8* %32
%35 = udiv i64 %25, %8
%36 = icmp ult i64 %25, %8
br i1 %36, label %37, label %24
37: ; preds = %30
%38 = icmp eq i8* %32, %1
br i1 %38, label %40, label %39
39: ; preds = %37
tail call void @abort()
unreachable
40: ; preds = %37, %16, %4
%41 = phi i32 [ 0, %4 ], [ 0, %16 ], [ %17, %37 ]
ret i32 %41
}