mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-13 20:26:03 +08:00
add unit-test checking the assertion on unaligned arrays -- checking
that it's triggered when and only when it should.
This commit is contained in:
parent
164f410bb5
commit
3958e7f751
@ -159,6 +159,7 @@ ei_add_test(dynalloc)
|
||||
ei_add_test(nomalloc)
|
||||
ei_add_test(mixingtypes)
|
||||
ei_add_test(packetmath)
|
||||
ei_add_test(unalignedassert)
|
||||
ei_add_test(basicstuff)
|
||||
ei_add_test(linearstructure)
|
||||
ei_add_test(cwiseop)
|
||||
|
105
test/unalignedassert.cpp
Normal file
105
test/unalignedassert.cpp
Normal file
@ -0,0 +1,105 @@
|
||||
// This file is part of Eigen, a lightweight C++ template library
|
||||
// for linear algebra. Eigen itself is part of the KDE project.
|
||||
//
|
||||
// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
|
||||
//
|
||||
// Eigen is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 3 of the License, or (at your option) any later version.
|
||||
//
|
||||
// Alternatively, you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License as
|
||||
// published by the Free Software Foundation; either version 2 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License and a copy of the GNU General Public License along with
|
||||
// Eigen. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "main.h"
|
||||
|
||||
struct Good1
|
||||
{
|
||||
MatrixXd m; // good: m will allocate its own array, taking care of alignment.
|
||||
Good1() : m(20,20) {}
|
||||
};
|
||||
|
||||
struct Good2
|
||||
{
|
||||
Matrix3d m; // good: m's size isn't a multiple of 16 bytes, so m doesn't have to be aligned
|
||||
};
|
||||
|
||||
struct Good3
|
||||
{
|
||||
Vector2f m; // good: same reason
|
||||
};
|
||||
|
||||
struct Bad4
|
||||
{
|
||||
Vector2d m; // bad: sizeof(m)%16==0 so alignment is required
|
||||
};
|
||||
|
||||
struct Bad5
|
||||
{
|
||||
Matrix<float, 2, 6> m; // bad: same reason
|
||||
};
|
||||
|
||||
struct Bad6
|
||||
{
|
||||
Matrix<double, 3, 4> m; // bad: same reason
|
||||
};
|
||||
|
||||
struct Good7 : Eigen::WithAlignedOperatorNew
|
||||
{
|
||||
Vector2d m;
|
||||
float f; // make the struct have sizeof%16!=0 to make it a little more tricky when we allow an array of 2 such objects
|
||||
};
|
||||
|
||||
struct Good8 : Eigen::WithAlignedOperatorNew
|
||||
{
|
||||
float f; // try the f at first -- the EIGEN_ALIGN_128 attribute of m should make that still work
|
||||
Matrix4f m;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
void check_unalignedassert_good()
|
||||
{
|
||||
T *x, *y;
|
||||
x = new T;
|
||||
delete x;
|
||||
y = new T[2];
|
||||
delete[] y;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void check_unalignedassert_bad()
|
||||
{
|
||||
float buf[1000];
|
||||
float *unaligned = buf;
|
||||
while((reinterpret_cast<size_t>(unaligned)&0xf)==0) ++unaligned; // make sure unaligned is really unaligned
|
||||
T *x = new(static_cast<void*>(unaligned)) T;
|
||||
x->~T();
|
||||
}
|
||||
|
||||
void unalignedassert()
|
||||
{
|
||||
check_unalignedassert_good<Good1>();
|
||||
check_unalignedassert_good<Good2>();
|
||||
check_unalignedassert_good<Good3>();
|
||||
VERIFY_RAISES_ASSERT(check_unalignedassert_bad<Bad4>());
|
||||
VERIFY_RAISES_ASSERT(check_unalignedassert_bad<Bad5>());
|
||||
VERIFY_RAISES_ASSERT(check_unalignedassert_bad<Bad6>());
|
||||
check_unalignedassert_good<Good7>();
|
||||
check_unalignedassert_good<Good8>();
|
||||
}
|
||||
|
||||
void test_unalignedassert()
|
||||
{
|
||||
CALL_SUBTEST(unalignedassert());
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user