// Executes the program in "batch" mode, where the user passes some command-line args bool slamdemoApp::doCommandLineProcess() { // Declare the supported options. TCLAP::CmdLine cmd("2d-slam-demo", ' ', mrpt::system::MRPT_getVersion().c_str()); TCLAP::ValueArg<std::string> arg_cfgFil("c","config","Config file to load",false,"","params.ini",cmd); TCLAP::SwitchArg arg_nogui("n","nogui","Don't stay in the GUI, exit after the experiment.",cmd, false); TCLAP::SwitchArg arg_norun("r","norun","Just load the config file, don't run it.",cmd, false); #ifdef MRPT_OS_WINDOWS CMyCmdLineOut out_buf; cmd.setOutput(&out_buf); #endif vector<char*> auxArgs(argc); for (int i=0;i<argc;i++) { wxString s(argv[i]); auxArgs[i]=new char[s.size()+10]; strcpy(auxArgs[i],s.ToUTF8().data()); } // Parse arguments: bool res_parse = cmd.parse( argc, &auxArgs[0] ); // Free aux mem: for (int i=0;i<argc;i++) delete[] auxArgs[i]; if (!res_parse) { #ifdef MRPT_OS_WINDOWS if (!out_cmdLine.str().empty()) wxMessageBox(_U(out_cmdLine.str().c_str()),_("2d-slam-demo")); #endif return false; } const std::string cfgFil = arg_cfgFil.getValue(); if ( !mrpt::system::fileExists(cfgFil) ) { cerr << "The indicated config file does not exist: " << cfgFil << endl; #ifdef MRPT_OS_WINDOWS wxMessageBox(wxT("The indicated config file does not exist"),_("2d-slam-demo")); #endif return false; } else { m_option_norun = arg_norun.getValue(); if (!arg_nogui.getValue()) { win->Show(); SetTopWindow(win); } try { DoBatchExperiments(cfgFil); } catch (std::exception &e) { cerr << e.what() << endl; #ifdef MRPT_OS_WINDOWS wxMessageBox(_U(e.what()),_("2d-slam-demo")); #endif } } // return false to exit the program now and NOT proceed with the GUI. // return true to continue with the program: return !arg_nogui.getValue(); }
void deallocuse1() { check("void f(char *p) {\n" " free(p);\n" " *p = 0;\n" "}"); ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout.str()); check("void f(char *p) {\n" " free(p);\n" " char c = *p;\n" "}"); ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout.str()); }
void deallocuse3() { check("void f(struct str *p) {\n" " free(p);\n" " p = p->next;\n" "}"); ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout.str()); }
void test1() { check("class Fred\n" "{\n" "private:\n" " unsigned int f();\n" "public:\n" " Fred();\n" "};\n" "\n" "Fred::Fred()\n" "{ }\n" "\n" "unsigned int Fred::f()\n" "{ }"); ASSERT_EQUALS("[test.cpp:4]: (style) Unused private function: 'Fred::f'\n", errout.str()); check("#file \"p.h\"\n" "class Fred\n" "{\n" "private:\n" " unsigned int f();\n" "public:\n" " Fred();\n" "};\n" "\n" "#endfile\n" "Fred::Fred()\n" "{ }\n" "\n" "unsigned int Fred::f()\n" "{ }"); ASSERT_EQUALS("[p.h:4]: (style) Unused private function: 'Fred::f'\n", errout.str()); check("#file \"p.h\"\n" "class Fred\n" "{\n" "private:\n" "void f();\n" "};\n" "\n" "\n" "#endfile\n" "\n" "void Fred::f()\n" "{\n" "}"); ASSERT_EQUALS("[p.h:4]: (style) Unused private function: 'Fred::f'\n", errout.str()); // Don't warn about include files which implementation we don't see check("#file \"p.h\"\n" "class Fred\n" "{\n" "private:\n" "void f();\n" "void g() {}\n" "};\n" "\n" "#endfile\n" "\n" "int main()\n" "{\n" "}"); ASSERT_EQUALS("", errout.str()); }
~ExpectedStreamOutput() { original_stream.rdbuf(&original_streambuf); original_stream << substituted_stream.str(); }
void sizeofVoid() { check("void f() {\n" " int size = sizeof(void);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (portability) Behaviour of 'sizeof(void)' is not covered by the ISO C standard.\n", errout.str()); check("void f() {\n" " void* p;\n" " int size = sizeof(*p);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (portability) '*p' is of type 'void', the behaviour of 'sizeof(void)' is not covered by the ISO C standard.\n", errout.str()); check("void f() {\n" " void* p = malloc(10);\n" " int* p2 = p + 4;\n" " int* p3 = p - 1;\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (portability) 'p' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n" "[test.cpp:4]: (portability) 'p' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); check("void f() {\n" " void* p1 = malloc(10);\n" " void* p2 = malloc(5);\n" " p1--;\n" " p2++;\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (portability) 'p1' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n" "[test.cpp:5]: (portability) 'p2' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); check("void f() {\n" " void** p1 = malloc(10);\n" " p1--;\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " void** p1;\n" " int j = sizeof(*p1);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " void* p1[5];\n" " int j = sizeof(*p1);\n" "}"); ASSERT_EQUALS("", errout.str()); // Calculations on void* with casts check("void f(void *data) {\n" " *((unsigned char *)data + 1) = 0;\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f(void *data) {\n" " *((unsigned char *)(data) + 1) = 0;\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f(void *data) {\n" " unsigned char* c = (unsigned char *)(data + 1);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); check("void f(void *data) {\n" " unsigned char* c = (unsigned char *)data++;\n" " unsigned char* c2 = (unsigned char *)++data;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n" "[test.cpp:3]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); check("void f(void *data) {\n" " void* data2 = (void *)data + 1;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); // #4908 (void pointer as a member of a struct/class) check("struct FOO {\n" " void *data;\n" "};\n" "char f(struct FOO foo) {\n" " char x = *((char*)(foo.data+1));\n" " foo.data++;\n" " return x;\n" "}\n"); ASSERT_EQUALS("[test.cpp:5]: (portability) 'foo.data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n" "[test.cpp:6]: (portability) 'foo.data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); check("struct FOO {\n" " void *data;\n" "};\n" "char f(struct FOO foo) {\n" " char x = *((char*)foo.data+1);\n" " return x;\n" "}\n" "char f2(struct FOO foo) {\n" " char x = *((char*)((FOO)foo).data + 1);\n" " return x;\n" "}\n" "char f3(struct FOO* foo) {\n" " char x = *((char*)foo->data + 1);\n" " return x;\n" "}\n" "struct BOO {\n" " FOO data;\n" "};\n" "void f4(struct BOO* boo) {\n" " char c = *((char*)boo->data.data + 1);\n" "}\n"); ASSERT_EQUALS("", errout.str()); check("struct FOO {\n" " void *data;\n" "};\n" "char f(struct FOO* foo) {\n" " *(foo[1].data + 1) = 0;\n" "}\n"); ASSERT_EQUALS("[test.cpp:5]: (portability) 'foo[1].data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); check("struct FOO {\n" " void *data;\n" "};\n" "void f2(struct FOO* foo) {\n" " (foo[0]).data++;\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (portability) '(foo[0]).data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); }
void test6() { // ticket #2602 segmentation fault check("class A {\n" " A& operator=(const A&);\n" "};"); ASSERT_EQUALS("", errout.str()); }
void division2() { check("void f()\n" "{\n" " int ivar = -2;\n" " unsigned int uvar = 2;\n" " return uvar / ivar;\n" "}", true); ASSERT_EQUALS("[test.cpp:5]: (warning, inconclusive) Division with signed and unsigned operators. The result might be wrong.\n", errout.str()); }
void Logger::error(std::ostringstream& stream) throw() { string text = stream.str(); error(text.data()); }
void division10() { // Ticket: #2932 - don't segfault check("i / i", true); ASSERT_EQUALS("", errout.str()); }
void division11() { check("void f(int x, unsigned char y) {\n" " int z = x / y;\n" // no error, y is promoted "}", true); ASSERT_EQUALS("", errout.str()); }
void division7() { check("void foo()\n" "{\n" " unsigned int val = 32;\n" " int i = -96 / val; }"); ASSERT_EQUALS("[test.cpp:4]: (error) Unsigned division. The result will be wrong.\n", errout.str()); }
void structmember() { check("struct Foo { int *p };\n" "void f(struct Foo *foo) {\n" " int i = foo->p;\n" "}"); TODO_ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning a pointer to an integer is not portable.\n", "", errout.str()); }
// RSA::PublicKey p; // StringSource source(T, sizeof(T), true); // p.Load(source); BOOST_REQUIRE_NO_THROW(c.encode()); // ofstream of("cert.out"); // of.write((const char*)c.getContent().value(), c.getContent().value_size()); // const Block &wire = i.wireEncode(); BOOST_REQUIRE_EQUAL_COLLECTIONS(CERT, CERT+sizeof(CERT), c.getContent().value_begin(), c.getContent().value_end()); std::ostringstream os; os << c << std::endl; std::string info(os.str()); BOOST_REQUIRE_EQUAL_COLLECTIONS(CERT_INFO.begin(), CERT_INFO.end(), info.begin(), info.end()); } const unsigned char REAL_CERT[] = { 0x30, 0x82, 0x01, 0x63, 0x30, 0x22, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x33, 0x31, 0x31, 0x30, 0x31, 0x31, 0x37, 0x31, 0x31, 0x32, 0x32, 0x5a, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x34, 0x31, 0x31, 0x30, 0x31, 0x31, 0x37, 0x31, 0x31, 0x32, 0x32, 0x5a, 0x30, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x29, 0x13, 0x10, 0x4e, 0x44, 0x4e, 0x20, 0x54, 0x65, 0x73, 0x74, 0x62, 0x65, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd3, 0xac, 0x7e, 0x7a, 0x5c, 0x33, 0x58, 0x21, 0xda, 0xe0, 0x8d, 0xdb, 0xca, 0xb6, 0x02, 0x30, 0x02, 0x15, 0xc5, 0x0a, 0x51, 0x54, 0xbb, 0x8e, 0x5e, 0x9d, 0x21, 0xf8, 0x14, 0xbe, 0xe4, 0x63, 0x60, 0x31, 0x53, 0xe2, 0xef, 0xee, 0x34, 0xa3, 0x8c, 0xd2, 0x24, 0x6f, 0xa4, 0x89, 0x4f, 0x02, 0x20, 0x7d, 0x66, 0xb6, 0x3f, 0x11, 0x40, 0x0c, 0xc1, 0x5f, 0xd8, 0x45, 0x23, 0x95, 0x40, 0xc8, 0xe0, 0xbc, 0x9d, 0x2f, 0x03, 0xf1, 0x83, 0x9f, 0x07, 0x0b, 0x76, 0xc9, 0x10, 0xd9, 0x3e, 0x0b, 0x75, 0x13, 0x93, 0xe9, 0xc9, 0x85, 0x01, 0x88, 0x36, 0x2e, 0xab, 0xfc, 0xe6, 0x24, 0x32, 0xfc, 0xc6, 0x3c, 0x40, 0x97, 0x1a, 0xcc, 0xcd, 0x53, 0xaa, 0x0f, 0xfb, 0xa3, 0xfe, 0xf9, 0x24, 0x70, 0x13, 0x3f, 0x4f, 0x5b, 0x7d, 0x43, 0xaa, 0x75, 0x0a, 0x94, 0x72, 0xab, 0xe1, 0x8c, 0x45, 0xb5, 0x78, 0x10, 0x01, 0xef, 0x1f, 0xb3, 0x05, 0x6f, 0xa6, 0xc3, 0xac, 0x7f, 0x6d, 0xf0, 0x31, 0xc4, 0x83, 0xb3, 0x4f, 0x50, 0x26, 0x92, 0x40, 0x1a, 0xdd, 0xec, 0xfb, 0xcb, 0xef, 0x63, 0xfe, 0x41, 0xd8, 0x8d, 0x1f, 0xdc, 0xec, 0xfc, 0x48, 0x95, 0xcc, 0x09, 0x1e, 0x30, 0x6e, 0x22, 0x9e, 0x24, 0x97, 0x2e, 0xe6, 0x0c, 0xdf, 0x3d, 0x20, 0x32, 0xaa, 0x9c, 0xc9, 0x45, 0x14, 0xaf, 0xaa, 0xf5, 0x17, 0xd2, 0x01, 0x98, 0x33, 0xbe, 0x2a, 0x9f, 0x7b, 0x9d, 0x98, 0x7c, 0x54, 0x22, 0xfe, 0x72, 0x72, 0x04, 0xc3, 0x2c, 0xc0, 0x14, 0x0b, 0xa9, 0x40, 0x7e, 0x46, 0xa1, 0x75, 0x16, 0x1a, 0x27, 0x9e, 0xf2, 0x82, 0x96, 0xc0, 0x7d, 0xaf, 0x18, 0x75, 0xfb, 0xbb, 0xab, 0x16, 0x66, 0xc0, 0xa9, 0xd7, 0x93, 0x4c, 0x48, 0x6d, 0xce, 0x0b, 0x88, 0xd4, 0x21, 0x93, 0x84, 0x89, 0x55, 0x05, 0xd5, 0x02, 0x01, 0x11 }; const std::string REAL_CERT_INFO = "Certificate name:\n" " /tmp\n" "Validity:\n" " NotBefore: 20131101T171122.000000\n" " NotAfter: 20141101T171122.000000\n" "Subject Description:\n" " 2.5.4.41: NDN Testbed Root\n"
void sizeofForNumericParameter() { check("void f() {\n" " std::cout << sizeof(10) << std::endl;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout.str()); check("void f() {\n" " std::cout << sizeof(-10) << std::endl;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout.str()); check("void f() {\n" " std::cout << sizeof 10 << std::endl;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout.str()); check("void f() {\n" " std::cout << sizeof -10 << std::endl;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout.str()); }
void Logger::always(std::ostringstream& stream) throw() { string text = stream.str(); always(text.data()); }
void checkPointerSizeof() { check("void f() {\n" " char *x = malloc(10);\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(*x));\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(x));\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(&x));\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = malloc(100 * sizeof(x));\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(x) * 100);\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = malloc(sizeof *x);\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = malloc(sizeof x);\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = malloc(100 * sizeof x);\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = calloc(1, sizeof(*x));\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = calloc(1, sizeof *x);\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = calloc(1, sizeof(x));\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = calloc(1, sizeof x);\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = calloc(1, sizeof(int));\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " char x[10];\n" " memset(x, 0, sizeof(x));\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " char* x[10];\n" " memset(x, 0, sizeof(x));\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " char x[10];\n" " memset(x, 0, sizeof x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " memset(x, 0, sizeof(int));\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " memset(x, 0, sizeof(*x));\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " memset(x, 0, sizeof *x);\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " memset(x, 0, sizeof x);\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " memset(x, 0, sizeof(x));\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int) * 10);\n" " memset(x, 0, sizeof(x) * 10);\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int) * 10);\n" " memset(x, 0, sizeof x * 10);\n" " free(x);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Size of pointer 'x' used instead of size of its data.\n", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int) * 10);\n" " memset(x, 0, sizeof(*x) * 10);\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int) * 10);\n" " memset(x, 0, sizeof *x * 10);\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int *x = malloc(sizeof(int) * 10);\n" " memset(x, 0, sizeof(int) * 10);\n" " free(x);\n" "}"); ASSERT_EQUALS("", errout.str()); check( "int fun(const char *buf1)\n" "{\n" " const char *buf1_ex = \"foobarbaz\";\n" " return strncmp(buf1, buf1_ex, sizeof(buf1_ex)) == 0;\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) Size of pointer 'buf1_ex' used instead of size of its data.\n", errout.str()); check( "int fun(const char *buf1) {\n" " return strncmp(buf1, foo(buf2), sizeof(buf1)) == 0;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Size of pointer 'buf1' used instead of size of its data.\n", errout.str()); // #ticket 3874 check("void f()\n" "{\n" " int * pIntArray[10];\n" " memset(pIntArray, 0, sizeof(pIntArray));\n" "}"); ASSERT_EQUALS("", errout.str()); }
void Logger::buffer(std::ostringstream& stream) throw() { string text = stream.str(); buffer(text.data()); }
void deallocThrow() { check("int * p;\n" "void f(int x)\n" "{\n" " delete p;\n" " if (x)\n" " throw 123;\n" " p = 0;\n" "}\n"); ASSERT_EQUALS("[test.cpp:6]: (error) Throwing exception in invalid state, p points at deallocated memory\n", errout.str()); }
void Logger::info(std::ostringstream& stream) throw() { string text = stream.str(); info(text.data()); }
void func_pointer1() { check("class Fred\n" "{\n" "private:\n" " typedef void (*testfp)();\n" "\n" " testfp get()\n" " {\n" " return test;\n" " }\n" "\n" " static void test()\n" " { }\n" "\n" "public:\n" " Fred();\n" "};\n" "\n" "Fred::Fred()\n" "{}"); ASSERT_EQUALS("[test.cpp:6]: (style) Unused private function: 'Fred::get'\n", errout.str()); }
void Logger::trace(std::ostringstream& stream) throw() { string text = stream.str(); trace(text.data()); }
bool check() { return substituted_stream.str() == expected; }
void Logger::debug(std::ostringstream& stream) throw() { string text = stream.str(); debug(text.data()); }
void assign11() { // #3942 - FP for x = a(b(p)); check("void f() {\n" " char *p = malloc(10);\n" " x = a(b(p));\n" "}"); ASSERT_EQUALS("[test.c:4]: (information) --check-library: Function b() should have <use>/<ignore> configuration\n", errout.str()); }
int main(int argc, char **argv) { MPI_Init(&argc, &argv); LONG_DESC << "This program simulates a transport problem on a sphere" " according to a benchmark from a Nair & Lauritzen paper.\n" << "It starts with a partitioned mesh on a sphere, add a tracer, and steps through.\n" << "The flow reverses after half time, and it should return to original configuration, if the integration was exact. "; ProgOptions opts(LONG_DESC.str(), BRIEF_DESC); // read a homme file, partitioned in 16 so far std::string fileN= TestDir + "/HN16.h5m"; const char *filename_mesh1 = fileN.c_str(); opts.addOpt<double>("gtolerance,g", "geometric absolute tolerance (used for point concidence on the sphere)", >ol); std::string input_file; opts.addOpt<std::string>("input_file,i", "input mesh file, partitioned", &input_file); std::string extra_read_opts; opts.addOpt<std::string>("extra_read_options,O", "extra read options ", &extra_read_opts); //int field_type; opts.addOpt<int>("field_type,f", "field type-- 1: quasi-smooth; 2: smooth; 3: slotted cylinders (non-smooth)", &field_type); opts.addOpt<int>("num_steps,n", "number of steps ", &numSteps); //bool reorder = false; opts.addOpt<void>("write_debug_files,w", "write debugging files during simulation ", &writeFiles); opts.addOpt<void>("write_velocity_files,v", "Reorder mesh to group entities by partition", &velocity); opts.addOpt<void>("write_result_in_parallel,p", "write tracer result files", ¶llelWrite); opts.parseCommandLine(argc, argv); if (!input_file.empty()) filename_mesh1=input_file.c_str(); // read in parallel, in the "euler_set", the initial mesh std::string optsRead = std::string("PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION")+ std::string(";PARALLEL_RESOLVE_SHARED_ENTS")+extra_read_opts; Core moab; Interface & mb = moab; EntityHandle euler_set; ErrorCode rval; rval = mb.create_meshset(MESHSET_SET, euler_set); CHECK_ERR(rval); rval = mb.load_file(filename_mesh1, &euler_set, optsRead.c_str()); ParallelComm* pcomm = ParallelComm::get_pcomm(&mb, 0); CHECK_ERR(rval); rval = pcomm->check_all_shared_handles(); CHECK_ERR(rval); int rank = pcomm->proc_config().proc_rank(); if (0==rank) { std::cout << " case 1: use -gtol " << gtol << " -R " << radius << " -input " << filename_mesh1 << " -f " << field_type << " numSteps: " << numSteps << "\n"; std::cout<<" write debug results: " << (writeFiles ? "yes" : "no") << "\n"; std::cout<< " write tracer in parallel: " << ( parallelWrite ? "yes" : "no") << "\n"; std::cout <<" output velocity: " << (velocity? "yes" : "no") << "\n"; } // tagTracer is the value at nodes Tag tagTracer = 0; std::string tag_name("Tracer"); rval = mb.tag_get_handle(tag_name.c_str(), 1, MB_TYPE_DOUBLE, tagTracer, MB_TAG_DENSE | MB_TAG_CREAT); CHECK_ERR(rval); // tagElem is the average computed at each element, from nodal values Tag tagElem = 0; std::string tag_name2("TracerAverage"); rval = mb.tag_get_handle(tag_name2.c_str(), 1, MB_TYPE_DOUBLE, tagElem, MB_TAG_DENSE | MB_TAG_CREAT); CHECK_ERR(rval); // area of the euler element is fixed, store it; it is used to recompute the averages at each // time step Tag tagArea = 0; std::string tag_name4("Area"); rval = mb.tag_get_handle(tag_name4.c_str(), 1, MB_TYPE_DOUBLE, tagArea, MB_TAG_DENSE | MB_TAG_CREAT); CHECK_ERR(rval); // add a field value, quasi smooth first rval = add_field_value(&mb, euler_set, rank, tagTracer, tagElem, tagArea); CHECK_ERR(rval); // iniVals are used for 1-norm error computation Range redEls; rval = mb.get_entities_by_dimension(euler_set, 2, redEls); CHECK_ERR(rval); std::vector<double> iniVals(redEls.size()); rval = mb.tag_get_data(tagElem, redEls, &iniVals[0]); CHECK_ERR(rval); Tag tagh = 0; std::string tag_name3("Case1"); rval = mb.tag_get_handle(tag_name3.c_str(), 3, MB_TYPE_DOUBLE, tagh, MB_TAG_DENSE | MB_TAG_CREAT); CHECK_ERR(rval); EntityHandle out_set, lagr_set; rval = mb.create_meshset(MESHSET_SET, out_set); CHECK_ERR(rval); rval = mb.create_meshset(MESHSET_SET, lagr_set); CHECK_ERR(rval); // copy the initial mesh in the lagrangian set // initial vertices will be at the same position as euler; rval = create_lagr_mesh(&mb, euler_set, lagr_set); CHECK_ERR(rval); Intx2MeshOnSphere worker(&mb); worker.SetRadius(radius); worker.SetErrorTolerance(gtol); Range local_verts; rval = worker.build_processor_euler_boxes(euler_set, local_verts);// output also the local_verts // these stay fixed for one run // other things from intersection might need to change, like input blue set (departure set) // so we need also a method to clean memory CHECK_ERR(rval); for (int i=1; i<numSteps+1; i++) { // time depends on i; t = i*T/numSteps: ( 0, T/numSteps, 2*T/numSteps, ..., T ) // this is really just to create some plots; it is not really needed to proceed // the compute_tracer_case1 method actually computes the departure point position if (velocity) { rval = compute_velocity_case1(&mb, euler_set, tagh, rank, i); CHECK_ERR(rval); } // this is to actually compute concentrations at time step i, using the // current concentrations // rval = compute_tracer_case1(&mb, worker, euler_set, lagr_set, out_set, tagElem, tagArea, rank, i, local_verts); CHECK_ERR(rval); } //final vals and 1-norm Range::iterator iter = redEls.begin(); double norm1 = 0.; int count =0; void * data; int j=0;// index in iniVals while (iter != redEls.end()) { rval = mb.tag_iterate(tagElem, iter, redEls.end(), count, data); CHECK_ERR(rval); double * ptrTracer=(double*)data; rval = mb.tag_iterate(tagArea, iter, redEls.end(), count, data); CHECK_ERR(rval); double * ptrArea=(double*)data; for (int i=0; i<count; i++, iter++, ptrTracer++, ptrArea++, j++) { //double area = *ptrArea; norm1+=fabs(*ptrTracer - iniVals[j])* (*ptrArea); } } double total_norm1=0; int mpi_err = MPI_Reduce(&norm1, &total_norm1, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (MPI_SUCCESS != mpi_err) return 1; if (0==rank) std::cout << " numSteps:" << numSteps << " 1-norm:" << total_norm1 << "\n"; MPI_Finalize(); return 0; }
void deallocuse2() { check("void f(char *p) {\n" " free(p);\n" " strcpy(a, p);\n" "}"); TODO_ASSERT_EQUALS("error (free,use)", "[test.c:3]: (information) --check-library: Function strcpy() should have <noreturn> configuration\n", errout.str()); check("void f(char *p) {\n" // #3041 - assigning pointer when it's used " free(p);\n" " strcpy(a, p=b());\n" "}"); TODO_ASSERT_EQUALS("", "[test.c:3]: (information) --check-library: Function strcpy() should have <noreturn> configuration\n", errout.str()); }
void sizeofForArrayParameter() { check("void f() {\n" " int a[10];\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " unsigned int a = 2;\n" " unsigned int b = 2;\n" " int c[(a+b)];\n" " std::cout << sizeof(c) / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " unsigned int a = { 2 };\n" " unsigned int b[] = { 0 };\n" " int c[a[b[0]]];\n" " std::cout << sizeof(c) / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " unsigned int a[] = { 1 };\n" " unsigned int b = 2;\n" " int c[(a[0]+b)];\n" " std::cout << sizeof(c) / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int a[] = { 1, 2, 3 };\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " int a[3] = { 1, 2, 3 };\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("", errout.str()); check("void f( int a[]) {\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("[test.cpp:2]: (error) Using 'sizeof' on array given as " "function argument returns size of a pointer.\n", errout.str()); check("void f( int a[]) {\n" " std::cout << sizeof a / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("[test.cpp:2]: (error) Using 'sizeof' on array given as " "function argument returns size of a pointer.\n", errout.str()); check("void f( int a[3] ) {\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("[test.cpp:2]: (error) Using 'sizeof' on array given as " "function argument returns size of a pointer.\n", errout.str()); check("void f(int *p) {\n" " p[0] = 0;\n" " int unused = sizeof(p);\n" "}\n" ); ASSERT_EQUALS("", errout.str()); check("void f() {\n" " char p[] = \"test\";\n" " int unused = sizeof(p);\n" "}\n" ); ASSERT_EQUALS("", errout.str()); // ticket #2495 check("void f() {\n" " static float col[][3]={\n" " {1,0,0},\n" " {0,0,1},\n" " {0,1,0},\n" " {1,0,1},\n" " {1,0,1},\n" " {1,0,1},\n" " };\n" " const int COL_MAX=sizeof(col)/sizeof(col[0]);\n" "}\n" ); ASSERT_EQUALS("", errout.str()); // ticket #155 check("void f() {\n" " char buff1[1024*64],buff2[sizeof(buff1)*2];\n" "}\n" ); ASSERT_EQUALS("", errout.str()); // ticket #2510 check("void f( int a[], int b) {\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("[test.cpp:2]: (error) Using 'sizeof' on array given as " "function argument returns size of a pointer.\n", errout.str()); // ticket #2510 check("void f( int a[3] , int b[2] ) {\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}\n" ); ASSERT_EQUALS("[test.cpp:2]: (error) Using 'sizeof' on array given as " "function argument returns size of a pointer.\n", errout.str()); // ticket #2510 check("void f() {\n" " char buff1[1024*64],buff2[sizeof(buff1)*(2+1)];\n" "}\n" ); ASSERT_EQUALS("", errout.str()); }
void deallocuse4() { check("void f(char *p) {\n" " free(p);\n" " return p;\n" "}"); ASSERT_EQUALS("[test.c:3]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", errout.str()); }
std::string statsStr(data.get(), length); std::istringstream statsStream(statsStr); boost::archive::text_iarchive ia(statsStream); Statistics::Registry slaveRegistry; ia >> slaveRegistry; Statistics::Registry::getInstance().merge(slaveRegistry); } writeStatistics(vm); } else { std::ostringstream statsStream; boost::archive::text_oarchive oa(statsStream); oa << Statistics::Registry::getInstance(); std::string statsStr = statsStream.str(); MPI_Send(const_cast<char *>(statsStr.data()), statsStr.length(), MPI_CHAR, root, MLSGPU_TAG_WORK, comm); } } /** * Execution in @c --resume mode * * @param comm Communicator indicating the group to run on * @param out Output filename or basename * @param vm Command-line options * @return Number of output files written */ static std::size_t runResume( MPI_Comm comm, const std::string &out, const po::variables_map &vm)