http://llvm.org/bugs/show_bug.cgi?id=14994

             Bug #: 14994
           Summary: AsmPrinter: uint64_t -> unsigned truncation bug
           Product: new-bugs
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: new bugs
        AssignedTo: [email protected]
        ReportedBy: [email protected]
                CC: [email protected]
    Classification: Unclassified


Created attachment 9888
  --> http://llvm.org/bugs/attachment.cgi?id=9888
Example used in bug description.

Found while testing out -fsanitize=implicit-integer-conversion (coming soon to
a clang near you?):

/home/wdietz2/llvm/33-src/lib/CodeGen/AsmPrinter/DIE.cpp:229:63: runtime error:
value 4886718345 =[=0x123456789] of type 'uint64_t' (aka 'unsigned long') is
outside the range of representable values of type 'unsigned int'
/home/wdietz2/llvm/33-src/lib/CodeGen/AsmPrinter/DIE.cpp:203:47: runtime error:
value 4886718345 =[=0x123456789] of type 'uint64_t' (aka 'unsigned long') is
outside the range of representable values of type 'unsigned int'

This truncation results in generating wrong encodings of integer constants
larger than 32bits:

$ cat die_test.c
int main() {                          
  unsigned long long val = VAL;
  return 0;
}

(source also attached)

$ bin/clang -O2 -g die_test.c -DVAL=0x123456789ULL -o die_test; objdump -g
die_test|grep -m1 const_value
    <5f>   DW_AT_const_value : 5 byte block: 89 cf 95 9a 2
$ bin/clang -O2 -g die_test.c -DVAL=0x23456789ULL -o die_test; objdump -g
die_test|grep -m1 const_value
    <5f>   DW_AT_const_value : 5 byte block: 89 cf 95 9a 2
$ bin/clang -O2 -g die_test.c -DVAL=0x3456789ULL -o die_test; objdump -g
die_test|grep -m1 const_value                                                   
    <5f>   DW_AT_const_value : 4 byte block: 89 cf 95 1a

The first example shows the value generated for a 64bit constant, which as can
be seen in the second example is the encoding of that value truncated to
32bits.  The third example is included only to briefly demonstrate that
changing the constant used does change the value generated :).

Changing AsmPrinter::EmitULEB128 and others to take a uint64_t instead of
unsigned should fix this, although there might be other places as well
(sanitizers only catch issues that are actually encountered; I'm not fuzzing).

Let me know if you have any questions or need further information.

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to