Patch to_string.cpp to fix bug found using -fsanitize=undefined' complier flag
This commit is contained in:
parent
1f5281417e
commit
3ba78cfdce
1 changed files with 20 additions and 128 deletions
148
cppad.spec
148
cppad.spec
|
|
@ -96,135 +96,26 @@ sed -i.bak CppAD-%{version}/cmake/set_compile_flags.cmake \
|
|||
sed -i.bak CppAD-%{version}/test_more/debug_rel/CMakeLists.txt \
|
||||
-e 's|-DCPPAD_DEBUG_AND_RELEASE||'
|
||||
# ----------------------------------------------------------------------------
|
||||
# Temporarly replace to_string.cpp in order to debug ppc64le arch problem
|
||||
cat << EOF > CppAD-%{version}/example/utility/to_string.cpp
|
||||
// Examples with fundamental types
|
||||
# include <cppad/utility/to_string.hpp>
|
||||
namespace {
|
||||
template <class Type>
|
||||
void print_error(
|
||||
const char* routine_name,
|
||||
const char* value_name,
|
||||
Type value,
|
||||
Type check,
|
||||
Type eps = Type(0) )
|
||||
{ std::cout << routine_name << " error : ";
|
||||
std::cout << value_name << " - check = " << value - check;
|
||||
std::cout << ", eps = " << eps << "\n";
|
||||
return;
|
||||
}
|
||||
template <class Integer>
|
||||
Integer string2signed(const std::string& s)
|
||||
{ Integer result = 0;
|
||||
size_t index = 0;
|
||||
if( s[0] == '-' )
|
||||
++index;
|
||||
while( index < s.size() )
|
||||
result = Integer( 10 * result + (s[index++] - '0') );
|
||||
if( s[0] == '-' )
|
||||
return - result;
|
||||
return result;
|
||||
}
|
||||
template <class Integer>
|
||||
Integer string2unsigned(const std::string& s)
|
||||
{ Integer result = 0;
|
||||
size_t index = 0;
|
||||
while( index < s.size() )
|
||||
result = Integer(10 * result + Integer(s[index++]) - '0');
|
||||
return result;
|
||||
}
|
||||
template <class Integer>
|
||||
bool signed_integer(void)
|
||||
{ bool ok = true;
|
||||
//
|
||||
Integer max = std::numeric_limits<Integer>::max();
|
||||
std::string s = CppAD::to_string(max);
|
||||
Integer check = string2signed<Integer>(s);
|
||||
ok &= max == check;
|
||||
if( max != check )
|
||||
print_error("signed_integer", "max", max, check);
|
||||
//
|
||||
Integer min = std::numeric_limits<Integer>::min();
|
||||
s = CppAD::to_string(min);
|
||||
check = string2signed<Integer>(s);
|
||||
ok &= min == check;
|
||||
if( min != check )
|
||||
print_error("signed_integer", "min", min, check);
|
||||
//
|
||||
return ok;
|
||||
}
|
||||
template <class Integer>
|
||||
bool unsigned_integer(void)
|
||||
{ bool ok = true;
|
||||
//
|
||||
Integer max = std::numeric_limits<Integer>::max();
|
||||
std::string s = CppAD::to_string(max);
|
||||
Integer check = string2unsigned<Integer>(s);
|
||||
ok &= max == check;
|
||||
if( max != check )
|
||||
print_error("unsigned_integer", "max", max, check);
|
||||
ok &= std::numeric_limits<Integer>::min() == 0;
|
||||
if( std::numeric_limits<Integer>::min() != 0 )
|
||||
std::cout << "unsigned_integer: min != 0 \n";
|
||||
//
|
||||
return ok;
|
||||
}
|
||||
template <class Float>
|
||||
bool floating(void)
|
||||
{ bool ok = true;
|
||||
Float eps = std::numeric_limits<Float>::epsilon();
|
||||
Float pi = Float( 4.0 * std::atan(1.0) );
|
||||
//
|
||||
std::string s = CppAD::to_string( pi );
|
||||
Float check = Float( std::atof( s.c_str() ) );
|
||||
ok &= std::fabs( check / pi - 1.0 ) <= Float(2.0) * eps;
|
||||
if( ! ok )
|
||||
print_error("floating", "pi", pi, check, eps);
|
||||
//
|
||||
return ok;
|
||||
}
|
||||
}
|
||||
// Examples with AD types
|
||||
# include <cppad/cppad.hpp>
|
||||
namespace {
|
||||
template <class Base>
|
||||
bool ad_floating(void)
|
||||
{ bool ok = true;
|
||||
Base eps = std::numeric_limits<Base>::epsilon();
|
||||
Base pi = Base( 4.0 * std::atan(1.0) );
|
||||
//
|
||||
std::string s = CppAD::to_string( CppAD::AD<Base>( pi ) );
|
||||
Base check = Base( std::atof( s.c_str() ) );
|
||||
ok &= fabs( check / pi - Base(1.0) ) <= Base( 2.0 ) * eps;
|
||||
if( ! ok )
|
||||
print_error("ad_floating", "pi", pi, check, eps);
|
||||
//
|
||||
return ok;
|
||||
}
|
||||
}
|
||||
// Test driver
|
||||
bool to_string(void)
|
||||
{ bool ok = true;
|
||||
|
||||
ok &= unsigned_integer<unsigned short>();
|
||||
ok &= signed_integer<signed int>();
|
||||
//
|
||||
ok &= unsigned_integer<unsigned long>();
|
||||
ok &= signed_integer<signed long>();
|
||||
ok &= unsigned_integer<unsigned long long>();
|
||||
ok &= signed_integer<signed long long>();
|
||||
//
|
||||
ok &= floating<float>();
|
||||
ok &= floating<double>();
|
||||
ok &= floating<long double>();
|
||||
//
|
||||
ok &= ad_floating<float>();
|
||||
ok &= ad_floating<double>();
|
||||
//
|
||||
return ok;
|
||||
}
|
||||
# Patch to fix example/utility/to_string.cpp
|
||||
# This will no longer be necessary once the upstread source > 20220000.1
|
||||
cat << EOF > to_string.patch
|
||||
32,36c32,39
|
||||
< ++index;
|
||||
< while( index < s.size() )
|
||||
< result = Integer( 10 * result + (s[index++] - '0') );
|
||||
< if( s[0] == '-' )
|
||||
< return - result;
|
||||
---
|
||||
> { ++index;
|
||||
> while( index < s.size() )
|
||||
> result = Integer(10) * result - Integer(s[index++] - '0' );
|
||||
> }
|
||||
> else
|
||||
> { while( index < s.size() )
|
||||
> result = Integer(10) * result + Integer(s[index++] - '0' );
|
||||
> }
|
||||
EOF
|
||||
#
|
||||
patch CppAD-%{version}/example/utility/to_string.cpp to_string.patch
|
||||
# -----------------------------------------------------------------------------
|
||||
# build
|
||||
# -----------------------------------------------------------------------------
|
||||
|
|
@ -318,6 +209,7 @@ make %{?_smp_mflags} check
|
|||
- 1. cppad_test_vector -> cppad_testvector
|
||||
- 2. cppad_max_num_theads -> cppad_max_num_threads
|
||||
- Temporary change to debug ppc64le build failure: replace to_string.cpp
|
||||
- Replace temporary change by a patch to example/utility/to_string.cpp
|
||||
|
||||
* Mon Jan 24 2022 Brad Bell <bradbell at seanet dot com> - 20220000.1-1
|
||||
- Advance to upstream source 20220000.1
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue