<html>
    <head>
      <base href="http://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - odr-violation and, if ignored, SEGV when using ASAN on code emitted from -emit-llvm"
   href="http://bugs.llvm.org/show_bug.cgi?id=32699">32699</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>odr-violation and, if ignored, SEGV when using ASAN on code emitted from -emit-llvm
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>4.0
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>-New Bugs
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>phil-llvm@teuwen.org
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=18306" name="attach_18306" title="hello.clang500.ll">attachment 18306</a> <a href="attachment.cgi?id=18306&action=edit" title="hello.clang500.ll">[details]</a></span>
hello.clang500.ll

Hello

Clang version: bug found when using clang 4, then confirmed with clang 5
(1:5.0~svn294894-1 from Debian)

When compiling in 2 steps (emitting IR code) and using ASAN, I get the
following error :

cat > hello.c << EOF
#include <stdio.h>

int main(void)
{
    printf("hello world\n");
    return 0;
}
EOF
clang-5.0 -fsanitize=address -S -emit-llvm hello.c -o hello.clang500.ll
clang-5.0 -fsanitize=address hello.clang500.ll -o hello.clang500
./hello.clang500
=================================================================
==26227==ERROR: AddressSanitizer: odr-violation (0x000000520dc0):
  [1] size=64 '.str' hello.clang500.ll
  [2] size=13 '<string literal>' hello.c:5:12
These globals were registered at these points:
  [1]:
    #0 0x432430  (/tmp/hello.clang500+0x432430)
    #1 0x50a106  (/tmp/hello.clang500+0x50a106)

  [2]:
    #0 0x432430  (/tmp/hello.clang500+0x432430)
    #1 0x50a0f0  (/tmp/hello.clang500+0x50a0f0)

==26227==HINT: if you don't care about these errors you may set
ASAN_OPTIONS=detect_odr_violation=0
SUMMARY: AddressSanitizer: odr-violation: global '.str' at hello.clang500.ll
==26227==ABORTING

hello.clang500.ll is provided at the bottom 
============================================================
; ModuleID = 'hello.c'
source_filename = "hello.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

@.str = internal unnamed_addr constant { [13 x i8], [51 x i8] } { [13 x i8]
c"hello world\0A\00", [51 x i8] zeroinitializer }, align 32
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void
()*, i8* } { i32 1, void ()* @asan.module_ctor, i8* null }]
@__asan_gen_ = private constant [8 x i8] c"hello.c\00", align 1
@__asan_gen_.1 = private unnamed_addr constant [17 x i8] c"<string
literal>\00", align 1
@__asan_gen_.2 = private unnamed_addr constant [8 x i8] c"hello.c\00", align 1
@__asan_gen_.3 = private unnamed_addr constant { [8 x i8]*, i32, i32 } { [8 x
i8]* @__asan_gen_.2, i32 5, i32 12 }
@0 = internal global [1 x { i64, i64, i64, i64, i64, i64, i64, i64 }] [{ i64,
i64, i64, i64, i64, i64, i64, i64 } { i64 ptrtoint ({ [13 x i8], [51 x i8] }*
@.str to i64), i64 13, i64 64, i64 ptrtoint ([17 x i8]* @__asan_gen_.1 to i64),
i64 ptrtoint ([8 x i8]* @__asan_gen_ to i64), i64 0, i64 ptrtoint ({ [8 x i8]*,
i32, i32 }* @__asan_gen_.3 to i64), i64 0 }]
@llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void
()*, i8* } { i32 1, void ()* @asan.module_dtor, i8* null }]

; Function Attrs: noinline nounwind sanitize_address uwtable
define i32 @main() #0 {
  %retval = alloca i32, align 4
  store i32 0, i32* %retval, align 4
  %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ({ [13 x i8],
[51 x i8] }, { [13 x i8], [51 x i8] }* @.str, i32 0, i32 0, i32 0))
  ret i32 0
}

declare i32 @printf(i8*, ...) #1

define internal void @asan.module_ctor() {
  call void @__asan_init()
  call void @__asan_version_mismatch_check_v8()
  call void @__asan_register_globals(i64 ptrtoint ([1 x { i64, i64, i64, i64,
i64, i64, i64, i64 }]* @0 to i64), i64 1)
  ret void
}

declare void @__asan_init()

declare void @__asan_version_mismatch_check_v8()

declare void @__asan_report_load_n(i64, i64)

declare void @__asan_loadN(i64, i64)

declare void @__asan_report_load1(i64)

declare void @__asan_load1(i64)

declare void @__asan_report_load2(i64)

declare void @__asan_load2(i64)

declare void @__asan_report_load4(i64)

declare void @__asan_load4(i64)

declare void @__asan_report_load8(i64)

declare void @__asan_load8(i64)

declare void @__asan_report_load16(i64)

declare void @__asan_load16(i64)

declare void @__asan_report_store_n(i64, i64)

declare void @__asan_storeN(i64, i64)

declare void @__asan_report_store1(i64)

declare void @__asan_store1(i64)

declare void @__asan_report_store2(i64)

declare void @__asan_store2(i64)

declare void @__asan_report_store4(i64)

declare void @__asan_store4(i64)

declare void @__asan_report_store8(i64)

declare void @__asan_store8(i64)

declare void @__asan_report_store16(i64)

declare void @__asan_store16(i64)

declare void @__asan_report_exp_load_n(i64, i64, i32)

declare void @__asan_exp_loadN(i64, i64, i32)

declare void @__asan_report_exp_load1(i64, i32)

declare void @__asan_exp_load1(i64, i32)

declare void @__asan_report_exp_load2(i64, i32)

declare void @__asan_exp_load2(i64, i32)

declare void @__asan_report_exp_load4(i64, i32)

declare void @__asan_exp_load4(i64, i32)

declare void @__asan_report_exp_load8(i64, i32)

declare void @__asan_exp_load8(i64, i32)

declare void @__asan_report_exp_load16(i64, i32)

declare void @__asan_exp_load16(i64, i32)

declare void @__asan_report_exp_store_n(i64, i64, i32)

declare void @__asan_exp_storeN(i64, i64, i32)

declare void @__asan_report_exp_store1(i64, i32)

declare void @__asan_exp_store1(i64, i32)

declare void @__asan_report_exp_store2(i64, i32)

declare void @__asan_exp_store2(i64, i32)

declare void @__asan_report_exp_store4(i64, i32)

declare void @__asan_exp_store4(i64, i32)

declare void @__asan_report_exp_store8(i64, i32)

declare void @__asan_exp_store8(i64, i32)

declare void @__asan_report_exp_store16(i64, i32)

declare void @__asan_exp_store16(i64, i32)

declare i8* @__asan_memmove(i8*, i8*, i64)

declare i8* @__asan_memcpy(i8*, i8*, i64)

declare i8* @__asan_memset(i8*, i32, i64)

declare void @__asan_handle_no_return()

declare void @__sanitizer_ptr_cmp(i64, i64)

declare void @__sanitizer_ptr_sub(i64, i64)

declare void @__asan_before_dynamic_init(i64)

declare void @__asan_after_dynamic_init()

declare void @__asan_register_globals(i64, i64)

declare void @__asan_unregister_globals(i64, i64)

declare void @__asan_register_image_globals(i64)

declare void @__asan_unregister_image_globals(i64)

define internal void @asan.module_dtor() {
  call void @__asan_unregister_globals(i64 ptrtoint ([1 x { i64, i64, i64, i64,
i64, i64, i64, i64 }]* @0 to i64), i64 1)
  ret void
}

attributes #0 = { noinline nounwind sanitize_address uwtable
"correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false"
"less-precise-fpmad"="false" "no-frame-pointer-elim"="true"
"no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false"
"no-jump-tables"="false" "no-nans-fp-math"="false"
"no-signed-zeros-fp-math"="false" "no-trapping-math"="false"
"stack-protector-buffer-size"="8" "target-cpu"="x86-64"
"target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false"
"use-soft-float"="false" }
attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false"
"disable-tail-calls"="false" "less-precise-fpmad"="false"
"no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
"no-infs-fp-math"="false" "no-nans-fp-math"="false"
"no-signed-zeros-fp-math"="false" "no-trapping-math"="false"
"stack-protector-buffer-size"="8" "target-cpu"="x86-64"
"target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false"
"use-soft-float"="false" }

!llvm.asan.globals = !{!0}
!llvm.ident = !{!2}

!0 = !{[13 x i8]* getelementptr inbounds ({ [13 x i8], [51 x i8] }, { [13 x
i8], [51 x i8] }* @.str, i32 0, i32 0), !1, !"<string literal>", i1 false, i1
false}
!1 = !{!"hello.c", i32 5, i32 12}
!2 = !{!"clang version 5.0.0-svn294894-1 (trunk)"}

============================================================

cat > hello2.c << EOF
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello %s\n", argv[0]);
    return 0;
}
EOF
# Now ignoring previous error:
export ASAN_OPTIONS=detect_odr_violation=0
clang-5.0 -fsanitize=address -S -emit-llvm hello2.c -o hello2.clang500.ll
clang-5.0 -fsanitize=address hello2.clang500.ll -o hello2.clang500
./hello2.clang500
ASAN:DEADLYSIGNAL
=================================================================
==26433==ERROR: AddressSanitizer: SEGV on unknown address 0x0200865f1067 (pc
0x00000050a0ce bp 0x7ffd97e81910 sp 0x7ffd97e818e0 T0)
==26433==The signal is caused by a READ memory access.
    #0 0x50a0cd  (/tmp/hello2.clang500+0x50a0cd)
    #1 0x7ff1255cb2b0  (/lib/x86_64-linux-gnu/libc.so.6+0x202b0)
    #2 0x41bef9  (/tmp/hello2.clang500+0x41bef9)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/tmp/hello2.clang500+0x50a0cd) 
==26433==ABORTING

============================================================
; ModuleID = 'hello2.c'
source_filename = "hello2.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

@.str = internal unnamed_addr constant { [10 x i8], [54 x i8] } { [10 x i8]
c"Hello %s\0A\00", [54 x i8] zeroinitializer }, align 32
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void
()*, i8* } { i32 1, void ()* @asan.module_ctor, i8* null }]
@__asan_gen_ = private constant [9 x i8] c"hello2.c\00", align 1
@__asan_gen_.1 = private unnamed_addr constant [17 x i8] c"<string
literal>\00", align 1
@__asan_gen_.2 = private unnamed_addr constant [9 x i8] c"hello2.c\00", align 1
@__asan_gen_.3 = private unnamed_addr constant { [9 x i8]*, i32, i32 } { [9 x
i8]* @__asan_gen_.2, i32 5, i32 12 }
@0 = internal global [1 x { i64, i64, i64, i64, i64, i64, i64, i64 }] [{ i64,
i64, i64, i64, i64, i64, i64, i64 } { i64 ptrtoint ({ [10 x i8], [54 x i8] }*
@.str to i64), i64 10, i64 64, i64 ptrtoint ([17 x i8]* @__asan_gen_.1 to i64),
i64 ptrtoint ([9 x i8]* @__asan_gen_ to i64), i64 0, i64 ptrtoint ({ [9 x i8]*,
i32, i32 }* @__asan_gen_.3 to i64), i64 0 }]
@llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void
()*, i8* } { i32 1, void ()* @asan.module_dtor, i8* null }]

; Function Attrs: noinline nounwind sanitize_address uwtable
define i32 @main(i32 %argc, i8** %argv) #0 {
  %retval = alloca i32, align 4
  %argc.addr = alloca i32, align 4
  %argv.addr = alloca i8**, align 8
  store i32 0, i32* %retval, align 4
  store i32 %argc, i32* %argc.addr, align 4
  store i8** %argv, i8*** %argv.addr, align 8
  %1 = load i8**, i8*** %argv.addr, align 8
  %arrayidx = getelementptr inbounds i8*, i8** %1, i64 0
  %2 = ptrtoint i8** %arrayidx to i64
  %3 = lshr i64 %2, 3
  %4 = add i64 %3, 2147450880
  %5 = inttoptr i64 %4 to i8*
  %6 = load i8, i8* %5
  %7 = icmp ne i8 %6, 0
  br i1 %7, label %8, label %9

; <label>:8:                                      ; preds = %0
  call void @__asan_report_load8(i64 %2)
  call void asm sideeffect "", ""()
  unreachable

; <label>:9:                                      ; preds = %0
  %10 = load i8*, i8** %arrayidx, align 8
  %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ({ [10 x i8],
[54 x i8] }, { [10 x i8], [54 x i8] }* @.str, i32 0, i32 0, i32 0), i8* %10)
  ret i32 0
}

declare i32 @printf(i8*, ...) #1

define internal void @asan.module_ctor() {
  call void @__asan_init()
  call void @__asan_version_mismatch_check_v8()
  call void @__asan_register_globals(i64 ptrtoint ([1 x { i64, i64, i64, i64,
i64, i64, i64, i64 }]* @0 to i64), i64 1)
  ret void
}

declare void @__asan_init()

declare void @__asan_version_mismatch_check_v8()

declare void @__asan_report_load_n(i64, i64)

declare void @__asan_loadN(i64, i64)

declare void @__asan_report_load1(i64)

declare void @__asan_load1(i64)

declare void @__asan_report_load2(i64)

declare void @__asan_load2(i64)

declare void @__asan_report_load4(i64)

declare void @__asan_load4(i64)

declare void @__asan_report_load8(i64)

declare void @__asan_load8(i64)

declare void @__asan_report_load16(i64)

declare void @__asan_load16(i64)

declare void @__asan_report_store_n(i64, i64)

declare void @__asan_storeN(i64, i64)

declare void @__asan_report_store1(i64)

declare void @__asan_store1(i64)

declare void @__asan_report_store2(i64)

declare void @__asan_store2(i64)

declare void @__asan_report_store4(i64)

declare void @__asan_store4(i64)

declare void @__asan_report_store8(i64)

declare void @__asan_store8(i64)

declare void @__asan_report_store16(i64)

declare void @__asan_store16(i64)

declare void @__asan_report_exp_load_n(i64, i64, i32)

declare void @__asan_exp_loadN(i64, i64, i32)

declare void @__asan_report_exp_load1(i64, i32)

declare void @__asan_exp_load1(i64, i32)

declare void @__asan_report_exp_load2(i64, i32)

declare void @__asan_exp_load2(i64, i32)

declare void @__asan_report_exp_load4(i64, i32)

declare void @__asan_exp_load4(i64, i32)

declare void @__asan_report_exp_load8(i64, i32)

declare void @__asan_exp_load8(i64, i32)

declare void @__asan_report_exp_load16(i64, i32)

declare void @__asan_exp_load16(i64, i32)

declare void @__asan_report_exp_store_n(i64, i64, i32)

declare void @__asan_exp_storeN(i64, i64, i32)

declare void @__asan_report_exp_store1(i64, i32)

declare void @__asan_exp_store1(i64, i32)

declare void @__asan_report_exp_store2(i64, i32)

declare void @__asan_exp_store2(i64, i32)

declare void @__asan_report_exp_store4(i64, i32)

declare void @__asan_exp_store4(i64, i32)

declare void @__asan_report_exp_store8(i64, i32)

declare void @__asan_exp_store8(i64, i32)

declare void @__asan_report_exp_store16(i64, i32)

declare void @__asan_exp_store16(i64, i32)

declare i8* @__asan_memmove(i8*, i8*, i64)

declare i8* @__asan_memcpy(i8*, i8*, i64)

declare i8* @__asan_memset(i8*, i32, i64)

declare void @__asan_handle_no_return()

declare void @__sanitizer_ptr_cmp(i64, i64)

declare void @__sanitizer_ptr_sub(i64, i64)

declare void @__asan_before_dynamic_init(i64)

declare void @__asan_after_dynamic_init()

declare void @__asan_register_globals(i64, i64)

declare void @__asan_unregister_globals(i64, i64)

declare void @__asan_register_image_globals(i64)

declare void @__asan_unregister_image_globals(i64)

define internal void @asan.module_dtor() {
  call void @__asan_unregister_globals(i64 ptrtoint ([1 x { i64, i64, i64, i64,
i64, i64, i64, i64 }]* @0 to i64), i64 1)
  ret void
}

attributes #0 = { noinline nounwind sanitize_address uwtable
"correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false"
"less-precise-fpmad"="false" "no-frame-pointer-elim"="true"
"no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false"
"no-jump-tables"="false" "no-nans-fp-math"="false"
"no-signed-zeros-fp-math"="false" "no-trapping-math"="false"
"stack-protector-buffer-size"="8" "target-cpu"="x86-64"
"target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false"
"use-soft-float"="false" }
attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false"
"disable-tail-calls"="false" "less-precise-fpmad"="false"
"no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
"no-infs-fp-math"="false" "no-nans-fp-math"="false"
"no-signed-zeros-fp-math"="false" "no-trapping-math"="false"
"stack-protector-buffer-size"="8" "target-cpu"="x86-64"
"target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false"
"use-soft-float"="false" }

!llvm.asan.globals = !{!0}
!llvm.ident = !{!2}

!0 = !{[10 x i8]* getelementptr inbounds ({ [10 x i8], [54 x i8] }, { [10 x
i8], [54 x i8] }* @.str, i32 0, i32 0), !1, !"<string literal>", i1 false, i1
false}
!1 = !{!"hello2.c", i32 5, i32 12}
!2 = !{!"clang version 5.0.0-svn294894-1 (trunk)"}

============================================================</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>