[UBsan suppression] implicit-integer-sign-change

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)

I tried with this line in my suppressions file (which works great for other types of warnings)

implicit-integer-sign-change:/path/to/boost/*

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.

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.

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
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

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.

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