Gert Wollny
2017-09-01 08:00:03 UTC
Hi,
to fix bug #853568 I tried a patch (gcc-7.patch) to fix abs()
arguments
...
g++ -o src/hmm/nanopolish_pore_model_set.o -c -g -O2 -fdebug-
prefix-map=/build/nanopolish-0.5.0=. -fstack-protector-strong
-Wformat -Werror=format-security -g -O3 -std=c++11 -fopenmp -Wdate-
t
src/common/nanopolish_variant.cpp: In function
'std::vector<Variant> extract_variants(const string&, const
src/common/nanopolish_variant.cpp:32:69: error: call of overloaded
'abs(std::__cxx11::basic_string<char>::size_type)' is ambiguous
size_t difference = std::abs(reference.size() -
haplotype.size());
The result of subtracting two size_t's is still a size_t, which isto fix bug #853568 I tried a patch (gcc-7.patch) to fix abs()
arguments
...
g++ -o src/hmm/nanopolish_pore_model_set.o -c -g -O2 -fdebug-
prefix-map=/build/nanopolish-0.5.0=. -fstack-protector-strong
-Wformat -Werror=format-security -g -O3 -std=c++11 -fopenmp -Wdate-
t
src/common/nanopolish_variant.cpp: In function
'std::vector<Variant> extract_variants(const string&, const
src/common/nanopolish_variant.cpp:32:69: error: call of overloaded
'abs(std::__cxx11::basic_string<char>::size_type)' is ambiguous
size_t difference = std::abs(reference.size() -
haplotype.size());
unsigned. So you need to cast it to a signed type. The correct type
is ptrdiff_t.
http://en.cppreference.com/w/cpp/types/ptrdiff_t
The line then becomes
size_t difference =
std::abs(static_cast<ptrdiff_t>(reference.size() -
haplotype.size()));
case
reference.size() == 1
haplotype.size() == 2
then
reference.size() - haplotype.size()
will be 0xFFFFFFFF (on 32 bit), and how this is casted to a signed type
is implementation dependent (i.e. it is not guaranteed that this simply
wraps to -1, it may also raise a trap because of integer overflow).
It would be better to avoid the cast altogether by doing something like
size_t difference = reference.size() > haplotype.size() ?
reference.size() - haplotype.size() :
haplotype.size() - reference.size();
or cast both values before doing the subtraction.
Best,
Gert