[cfe-dev] [UBsan suppression] implicit-integer-sign-change

Pascal Cremer via cfe-dev cfe-dev at lists.llvm.org
Mon Jan 28 00:00:06 PST 2019


On 25/01/2019 19:25, Roman Lebedev wrote:
> On Fri, Jan 25, 2019 at 7:37 PM Pascal Cremer <cremer at or.uni-bonn.de> wrote:
>> Thanks Roman,
>>
>> Here is a more detailed report:
>>
>> My program is
>>
>> int main() {
>>       int i = 1073741824;
>>       while (i > 0) {
>>           i *= 2;
>>       }
>>
>>       i = 139;
>>       char c = i;
>> }
>>
>> I use clang version 7.0.1
>>
>> My suppression file:
>>
>> #implicit-integer-sign-change:main.cpp
> Let's take this one step back.
> Why do you think that the sanitizer saying it's implicit-integer-sign-change?
>
> $ export UBSAN_OPTIONS=report_error_type=1
> $ ./main
> main.cpp:4:12: runtime error: signed integer overflow: 1073741824 * 2
> cannot be represented in type 'int'
> SUMMARY: UndefinedBehaviorSanitizer: signed-integer-overflow main.cpp:4:12 in
> main.cpp:8:15: runtime error: implicit conversion from type 'int' of
> value 139 (32-bit, signed) to type 'char' changed the value to -117
> (8-bit, signed)
> SUMMARY: UndefinedBehaviorSanitizer: implicit-integer-truncation
> main.cpp:8:15 in
>
> And now:
> $ cat suppression
> signed-integer-overflow:main.cpp
> implicit-integer-truncation:main.cpp
> $ export UBSAN_OPTIONS=suppressions=suppression:report_error_type=1
> $ ./main
> $
>
> Roman.

Wonderful! Thanks a lot.

Pascal

>> signed-integer-overflow:main.cpp
>>
>> I start and compile in fish shell:
>>
>> export UBSAN_OPTIONS=suppressions=suppression; and clang++
>> -fsanitize=address,integer main.cpp -o main; and ./main
>>
>> which gives the output:
>>
>> main.cpp:8:11: runtime error: implicit conversion from type 'int' of
>> value 139 (32-bit, signed) to type 'char' changed the value to -117
>> (8-bit, signed)
>> SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior main.cpp:8:11 in
>>
>> If I remove the implicit-integer-sign-change suppression, I get as expected
>>
>> main.cpp:4:5: runtime error: signed integer overflow: 1073741824 * 2
>> cannot be represented in type 'int'
>> SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior main.cpp:4:5 in
>> main.cpp:8:11: runtime error: implicit conversion from type 'int' of
>> value 139 (32-bit, signed) to type 'char' changed the value to -117
>> (8-bit, signed)
>> SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior main.cpp:8:11 in
>>
>> If I have both suppressions active, I get:
>>
>> AddressSanitizer: failed to parse suppressions
>>
>> I double checked: changes in the suppression file need no recompilation.
>>
>> Pascal
>>
>> On 25/01/2019 14:21, Roman Lebedev wrote:
>>> On Fri, Jan 25, 2019 at 4:07 PM Pascal Cremer via cfe-dev
>>> <cfe-dev at lists.llvm.org> wrote:
>>>> I would like to suppress implicit-integer-sign-change warnings which
>>>> encounter in
>>>>
>>>> boost/1_64_0/include/boost/iostreams/filter/gzip.hpp:674:16: runtime
>>>> error: implicit conversion from type 'int' of value 139 (32-bit, signed)
>>>> to type 'char' changed the value to -117 (8-bit, signed)
>>>>        #0 0x7fed40b77bc2 in
>>>> boost::iostreams::basic_gzip_compressor<std::allocator<char>
>>>>    >::basic_gzip_compressor(boost::iostreams::gzip_params const&, long)
>>> Can you please show the whole output, including "SUMMARY:
>>> UndefinedBehaviorSanitizer: implicit-????" line?
>>> (IIRC you need to also enable asan to get that line)
>>>
>>>> I tried with this line in my suppressions file (which works great for
>>>> other types of warnings)
>>>>
>>>> implicit-integer-sign-change:/path/to/boost/*
>>> Assuming that you are actually seeing the implicit-integer-sign-change
>>> issue, according to
>>> https://github.com/llvm-mirror/compiler-rt/blob/dd358a8a7ce65eb3189740d99b6a450605947aab/test/ubsan/TestCases/ImplicitConversion/integer-sign-change-blacklist.c#L12
>>> that should work.
>>>
>>> I'm not sure, is that blacklist read at runtime or not, do you need to
>>> recompile the code in order for it to be updated?
>>>
>>>> However, I get at runtime:
>>>>
>>>> UndefinedBehaviorSanitizer: failed to parse suppressions
>>>>
>>>> I also reported this on SO a while ago:
>>>>
>>>> https://stackoverflow.com/questions/53466501/c-clang-ubsan-suppression-flag-name
>>>>
>>>> Any help would be much appreciated.
>>> Roman.
>>>
>>>> _______________________________________________
>>>> cfe-dev mailing list
>>>> cfe-dev at lists.llvm.org
>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev


More information about the cfe-dev mailing list