Re: [Debian-med-packaging] Bug#853568: No idea how to fix abs arguments in nanopolish

2017-09-01 Thread Gert Wollny
Am Donnerstag, den 31.08.2017, 21:00 -0700 schrieb Walter Landry:
> Andreas Tille  wrote:
> > Hi,
> > 
> > to fix bug #853568 I tried a patch (gcc-7.patch) to fix abs()
> > arguments
> > in nanopolish[1] but I have no idea how to deal with this:
> > 
> > ...
> > 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 extract_variants(const string&, const
> > string&)':
> > src/common/nanopolish_variant.cpp:32:69: error: call of overloaded
> > 'abs(std::__cxx11::basic_string::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 is
> 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(reference.size() -
> haplotype.size()));

Casting the difference may result in undefined behavior. Consider the
case 

   reference.size() == 1
   haplotype.size() == 2 

then 

   reference.size() - haplotype.size() 

will be 0x (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 



Re: No idea how to fix abs arguments in nanopolish

2017-08-31 Thread Walter Landry
Andreas Tille  wrote:
> Hi,
> 
> to fix bug #853568 I tried a patch (gcc-7.patch) to fix abs() arguments
> in nanopolish[1] but I have no idea how to deal with this:
> 
> ...
> 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 
> extract_variants(const string&, const string&)':
> src/common/nanopolish_variant.cpp:32:69: error: call of overloaded 
> 'abs(std::__cxx11::basic_string::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 is
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(reference.size() - 
haplotype.size()));

Or you could do it in two lines

  ptrdiff_t diff_signed (reference.size() - haplotype.size());
  size_t difference = std::abs(diff_signed);

Cheers,
Walter Landry



No idea how to fix abs arguments in nanopolish

2017-08-31 Thread Andreas Tille
Hi,

to fix bug #853568 I tried a patch (gcc-7.patch) to fix abs() arguments
in nanopolish[1] but I have no idea how to deal with this:

...
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 
extract_variants(const string&, const string&)':
src/common/nanopolish_variant.cpp:32:69: error: call of overloaded 
'abs(std::__cxx11::basic_string::size_type)' is ambiguous
 size_t difference = std::abs(reference.size() - haplotype.size());
 ^
In file included from /usr/include/c++/7/cstdlib:77:0,
 from /usr/include/c++/7/bits/stl_algo.h:59,
 from /usr/include/c++/7/algorithm:62,
 from src/common/nanopolish_variant.cpp:8:
/usr/include/c++/7/bits/std_abs.h:78:3: note: candidate: constexpr long double 
std::abs(long double)
   abs(long double __x)
   ^~~
/usr/include/c++/7/bits/std_abs.h:74:3: note: candidate: constexpr float 
std::abs(float)
   abs(float __x)
   ^~~
/usr/include/c++/7/bits/std_abs.h:70:3: note: candidate: constexpr double 
std::abs(double)
   abs(double __x)
   ^~~
/usr/include/c++/7/bits/std_abs.h:61:3: note: candidate: long long int 
std::abs(long long int)
   abs(long long __x) { return __builtin_llabs (__x); }
   ^~~
/usr/include/c++/7/bits/std_abs.h:56:3: note: candidate: long int std::abs(long 
int)
   abs(long __i) { return __builtin_labs(__i); }
   ^~~
In file included from /usr/include/c++/7/cstdlib:75:0,
 from /usr/include/c++/7/bits/stl_algo.h:59,
 from /usr/include/c++/7/algorithm:62,
 from src/common/nanopolish_variant.cpp:8:
/usr/include/stdlib.h:735:12: note: candidate: int abs(int)
 extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur;
^~~
Makefile:98: recipe for target 'src/common/nanopolish_variant.o' failed


Any idea how to patch this?

Kind regards

 Andreas.

[1] https://anonscm.debian.org/git/debian-med/nanopolish.git

-- 
http://fam-tille.de