bmstu-rk6 / libgod Goto Github PK
View Code? Open in Web Editor NEWGlobal Optimization Data Library
License: BSD 3-Clause "New" or "Revised" License
Global Optimization Data Library
License: BSD 3-Clause "New" or "Revised" License
Works on osx/gcc-4.2, osx/clang-4.0, but fails on linux/gcc-4.4
2/8 Test #2: test_comparable ..................***Failed 0.01 sec
Running main() from gtest_main.cc
[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from Comparable
[ RUN ] Comparable.Strict
[ OK ] Comparable.Strict (1 ms)
[ RUN ] Comparable.NonStrict
[ OK ] Comparable.NonStrict (0 ms)
[ RUN ] Comparable.Union
/home/irix/projects/libgod/test/test_comparable.cxx:85: Failure
Value of: c(u1,u2)
Actual: false
Expected: true
/home/irix/projects/libgod/test/test_comparable.cxx:86: Failure
Value of: !c(u2,u1)
Actual: false
Expected: true
[ FAILED ] Comparable.Union (1 ms)
[----------] 3 tests from Comparable (2 ms total)
Тест testunionio считывает с диска входной файл с данными в память, потом снова его серилизует на диск и мы сравниваем, что два файла равны друг другу.
Если вызывать вот так:
testunionio input.union1 input.union1.out
Все ОК. Но если вот так:
testunionio /home/artyom/workspace/libgod/build/input.union1 /home/artyom/workspace/libgod/build/input.union1.out
То кидает эксепшн:
Running test /home/artyom/workspace/libgod/test/testunionio.cxx
#0 ./testunionio
#1 /home/artyom/workspace/libgod/build/input.union1
#2 /home/artyom/workspace/libgod/build/input.union1.out
Test error: basic_ios::clear
Тест вроде предельно похож на то, что реализовано было в fileread, команды CTest в CMakeList тоже аналогичны. Но падает.
Привет. Может я сам и внес багу, криво добавив Union::Union(). Но он по-любому нужен для того, чтобы инициализировать множества из файла. Я использовал вот такой код:
libgod::Union un;
libgod::Storage st( argv[1] );
st.read(un);
//Print dump to stdout
st.dump(std::cout, un);
И вывод получается как будто ничего не было считано. Вывод dump() как раз это и показывает:
// Pass pointers to array smaller than specified in dimensions
int testpoint_constructor_array_larger_dim() {
bool is_thrown = false;
double* a = new double [10];
double* b = new double [6];
try {
libgod::Point pt1(4,3,a,b);
}
catch (libgod::GodError& ge) {
is_thrown = true;
}
ASSERT_TRUE(is_thrown);
return !is_thrown;
}
Это бага или фича. По идее ты в memcpy указываешь сколько надо скопировать. Поэтому мы не получаем ошибку сегментации, но логически это неправильно. Или оставим на совесть пользователя?
Вроде установил gtest по твоей и еще куче гугловским инструкциям, поправил build.conf, но при попытке собрать весь проект получаю:
/home/artyom/workspace/gtest-1.6.0/libgtest.a(gtest-all.cc.o): In function 'testing::internal::ThreadLocal<testing::TestPartResultReporterInterface*>::~ThreadLocal()':
gtest-all.cc:(.text._ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED1Ev[testing::internal::ThreadLocal<testing::TestPartResultReporterInterface*>::~ThreadLocal()]+0x11): undefined reference to `pthread_getspecific'
Нашел что-то подобное на stackoverflow (http://stackoverflow.com/questions/10315016/error-during-making-gtest), но честно хз, так как там говорят надо внести изменения в g++ строчку, а это твоя привилегия :)
P.S. Я пытался клинить весь проект и пересобирать, тоже самое.
Привет, вот такой вот код не кидает эксепшена. Может я томожу конечно, но по идее должно кидаться
// Check if dim paramteres is negative and dim criteria is positive
is_thrown = false;
try {
libgod::Set set1(-10, 2);
}
catch (libgod::GodError& ge) {
is_thrown = true;
}
ASSERT_TRUE(is_thrown);
// Check if only dim criteria is negative
is_thrown = false;
try {
libgod::Set set1(3, -5);
}
catch (libgod::GodError& ge) {
is_thrown = true;
}
ASSERT_TRUE(is_thrown);
// Check if both parameters are negative
is_thrown = false;
try {
libgod::Set set1(-7, -5);
}
catch (libgod::GodError& ge) {
is_thrown = true;
}
ASSERT_TRUE(is_thrown);
В ответ
terminate called after throwing an instance of 'libgod::assert_exception'
what(): assertTrue at 63 : false - 0
Аварийный останов
Я попытлся вызвать un.~Union(); чтобы убить объект в явном виде, скомпилилось, но упало с ошибкой.
Надо бы прояснить вопрос с тем стоит ли вызывать деструкторы или просто как убивать объекты корректно.
*** glibc detected *** ./gendata4test: double free or corruption (fasttop): 0x08c1f038 ***
======= Backtrace: =========
/lib/i686/cmov/libc.so.6(+0x6b381)[0xb752c381]
/lib/i686/cmov/libc.so.6(+0x6cbd8)[0xb752dbd8]
/lib/i686/cmov/libc.so.6(cfree+0x6d)[0xb7530cbd]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7708701]
./gendata4test(_ZN9__gnu_cxx13new_allocatorISt10_List_nodeIN6libgod3SetEEE10deallocateEPS4_j+0x11)[0x804a4f3]
./gendata4test(_ZNSt10_List_baseIN6libgod3SetESaIS1_EE11_M_put_nodeEPSt10_List_nodeIS1_E+0x20)[0x804a3a8]
./gendata4test(_ZNSt10_List_baseIN6libgod3SetESaIS1_EE8_M_clearEv+0x84)[0x804a242]
./gendata4test(_ZNSt10_List_baseIN6libgod3SetESaIS1_EED2Ev+0x13)[0x804a0a3]
./gendata4test(_ZNSt4listIN6libgod3SetESaIS1_EED1Ev+0x11)[0x804a019]
./gendata4test(_ZN6libgod9ContainerINS_3SetESt4listIS1_SaIS1_EEED2Ev+0x44)[0x804a060]
./gendata4test(_ZN6libgod5UnionD1Ev+0x11)[0x804a079]
./gendata4test(main+0x155)[0x8049f09]
/lib/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb74d7ca6]
./gendata4test[0x8049d21]
======= Memory map: ========
08048000-0804c000 r-xp 00000000 08:01 1217240 /home/artyom/workspace/libgod/build/examples/gendata/gendata4test
0804c000-0804d000 rw-p 00003000 08:01 1217240 /home/artyom/workspace/libgod/build/examples/gendata/gendata4test
08c1f000-08c40000 rw-p 00000000 00:00 0 [heap]
b7300000-b7321000 rw-p 00000000 00:00 0
b7321000-b7400000 ---p 00000000 00:00 0
b74c0000-b74c1000 rw-p 00000000 00:00 0
b74c1000-b7601000 r-xp 00000000 08:01 538817 /lib/i686/cmov/libc-2.11.3.so
b7601000-b7602000 ---p 00140000 08:01 538817 /lib/i686/cmov/libc-2.11.3.so
b7602000-b7604000 r--p 00140000 08:01 538817 /lib/i686/cmov/libc-2.11.3.so
b7604000-b7605000 rw-p 00142000 08:01 538817 /lib/i686/cmov/libc-2.11.3.so
b7605000-b7608000 rw-p 00000000 00:00 0
b7608000-b7625000 r-xp 00000000 08:01 522243 /lib/libgcc_s.so.1
b7625000-b7626000 rw-p 0001c000 08:01 522243 /lib/libgcc_s.so.1
b7626000-b764a000 r-xp 00000000 08:01 538799 /lib/i686/cmov/libm-2.11.3.so
b764a000-b764b000 r--p 00023000 08:01 538799 /lib/i686/cmov/libm-2.11.3.so
b764b000-b764c000 rw-p 00024000 08:01 538799 /lib/i686/cmov/libm-2.11.3.so
b764c000-b764d000 rw-p 00000000 00:00 0
b764d000-b7736000 r-xp 00000000 08:01 728156 /usr/lib/libstdc++.so.6.0.13
b7736000-b773a000 r--p 000e9000 08:01 728156 /usr/lib/libstdc++.so.6.0.13
b773a000-b773b000 rw-p 000ed000 08:01 728156 /usr/lib/libstdc++.so.6.0.13
b773b000-b7742000 rw-p 00000000 00:00 0
b7751000-b7752000 rw-p 00000000 00:00 0
b7752000-b779d000 r-xp 00000000 08:01 1217201 /home/artyom/workspace/libgod/build/lib/libgod.so.1.0.0
b779d000-b77a0000 rw-p 0004a000 08:01 1217201 /home/artyom/workspace/libgod/build/lib/libgod.so.1.0.0
b77a0000-b77a2000 rw-p 00000000 00:00 0
b77a2000-b77a3000 r-xp 00000000 00:00 0 [vdso]
b77a3000-b77be000 r-xp 00000000 08:01 523984 /lib/ld-2.11.3.so
b77be000-b77bf000 r--p 0001b000 08:01 523984 /lib/ld-2.11.3.so
b77bf000-b77c0000 rw-p 0001c000 08:01 523984 /lib/ld-2.11.3.so
bfeba000-bfecf000 rw-p 00000000 00:00 0 [stack]
Общая идея, чтобы вот такой код работал:
libgod::Set set1;
libgod::Point pt(4,3);
set1.add(pt);
То есть, если используется конструктор по умолчанию для Union и Set, то первый добавленный элемент со значимыми параметрами инициализирует параметры Set или Union.
Текущая реализация класса Storage не позволяет менять файл ввода или вывода. То есть, если я хочу ввести или распечатать данные для нескольких union, то придется создавать несколько экземпляров класса Storage.
Так же класс Storage поддерживает только Union в даный момент. Может имеет смысл расширить его до Set и Point?
// Pass not valid pointers to libgod::Point constructor
int testpoint_constructor_null_ptrs() {
bool is_thrown = false;
double a[5];
try {
libgod::Point pt1(7,2, a, 0);
libgod::Point pt2(7,2, 0, a);
libgod::Point pt3(3,4, 0, 0);
}
catch (libgod::GodError& ge) {
is_thrown = true;
}
ASSERT_TRUE(is_thrown);
return !is_thrown;
}
Segmentation fault.
И как в развитие мысли. Если мы туда будем передавать не нулевые поинтеры, а невалидные. Например (double*)1000, то тоже будет падать с ошибкой сегментирования. Оставим это как есть или можно что-нибудь сделать?
// Pass equal pointers to array
int testpoint_constructor_array_eq_ptr() {
bool is_thrown = false;
double* a = new double [10];
try {
libgod::Point pt1(10,10,a,a);
}
catch (libgod::GodError& ge) {
is_thrown = true;
}
ASSERT_TRUE(is_thrown);
delete(a);
return !is_thrown;
}
Формально все корректно. Но имхо либа не должна этого позволять, так как это с точки зрения задачи абсолютно не логично и ведет к косякам в программировании алгоритмов.
Two problems:
Текущая реализация класса Storage не позволяет менять файл ввода или вывода. То есть, если я хочу ввести или распечатать данные для нескольких union, то придется создавать несколько экземпляров класса Storage.
Так же класс Storage поддерживает только Union в даный момент. Может имеет смысл расширить его до Set и Point?
Если я пишу вот такой код
//input.union2: Union with 2 sets each has 2 points
libgod::Union un2(5,3);
double parameters[] = {1.2, -0.9, 6.7, 1.209, 4.731};
double criteria[] = {0.99, 0.76, 0.12};
for (int i=0; i<un2.size(); i++) {
libgod::Set& s = un2.add();
for (int j=0; j<2; j++) {
libgod::Point& p = s.add();
p.setParameters(parameters);
p.setCriteria(criteria);
}
}
libgod::Storage st2("input.union2");
st2.write(un2);
st2.dump(std::cout, un2);
то dump() выводит:
Да и input.union2 получается подозрительно маленький
-rw-r--r-- 1 artyom artyom 22 Июл 8 01:38 input.union2
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.