Merge pull request #78 from cmazakas/feature/test-suite-ub-fixes

Fix integer overflow UB in test suite
This commit is contained in:
Peter Dimov
2022-01-11 21:11:08 +02:00
committed by GitHub
3 changed files with 26 additions and 16 deletions

View File

@ -49,6 +49,7 @@ jobs:
cxxstd: "03,11,14,17,2a"
os: ubuntu-20.04
install: g++-11
sanitizers: true
- toolset: clang
compiler: clang++-3.9
cxxstd: "03,11,14"
@ -96,9 +97,11 @@ jobs:
compiler: clang++-12
cxxstd: "03,11,14,17,2a"
os: ubuntu-20.04
sanitizers: true
- toolset: clang
cxxstd: "03,11,14,17"
os: macos-10.15
sanitizers: true
runs-on: ${{matrix.os}}
@ -139,7 +142,11 @@ jobs:
- name: Run tests
run: |
cd ../boost-root
./b2 -j3 libs/$LIBRARY/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} variant=debug,release
./b2 -j3 libs/$LIBRARY/test \
toolset=${{matrix.toolset}} \
cxxstd=${{matrix.cxxstd}} \
variant=debug,release \
${{(matrix.sanitizers && 'address-sanitizer=norecover undefined-sanitizer=norecover') || ''}}
windows:
strategy:

View File

@ -194,18 +194,19 @@ namespace test {
std::size_t hash_impl(object const& x) const
{
int result;
unsigned result;
switch (tag_) {
case 1:
result = x.tag1_;
result = static_cast<unsigned>(x.tag1_);
break;
case 2:
result = x.tag2_;
result = static_cast<unsigned>(x.tag2_);
break;
default:
result = x.tag1_ + x.tag2_;
result =
static_cast<unsigned>(x.tag1_) + static_cast<unsigned>(x.tag2_);
}
return static_cast<std::size_t>(result);
return result;
}
friend bool operator==(hash const& x1, hash const& x2)

View File

@ -195,34 +195,36 @@ namespace test {
std::size_t operator()(object const& x) const
{
int result;
unsigned result;
switch (type_) {
case 1:
result = x.tag1_;
result = static_cast<unsigned>(x.tag1_);
break;
case 2:
result = x.tag2_;
result = static_cast<unsigned>(x.tag2_);
break;
default:
result = x.tag1_ + x.tag2_;
result =
static_cast<unsigned>(x.tag1_) + static_cast<unsigned>(x.tag2_);
}
return static_cast<std::size_t>(result);
return result;
}
std::size_t operator()(movable const& x) const
{
int result;
unsigned result;
switch (type_) {
case 1:
result = x.tag1_;
result = static_cast<unsigned>(x.tag1_);
break;
case 2:
result = x.tag2_;
result = static_cast<unsigned>(x.tag2_);
break;
default:
result = x.tag1_ + x.tag2_;
result =
static_cast<unsigned>(x.tag1_) + static_cast<unsigned>(x.tag2_);
}
return static_cast<std::size_t>(result);
return result;
}
std::size_t operator()(int x) const