Commit 3e3e752c by Szeberényi Imre

me,trace c++14 jav

parent 2f95a4cd
No preview for this file type
...@@ -3,12 +3,13 @@ Memoriaszivargas-detektor ...@@ -3,12 +3,13 @@ Memoriaszivargas-detektor
Keszitette: Peregi Tamas, BME IIT, 2011 Keszitette: Peregi Tamas, BME IIT, 2011
petamas@iit.bme.hu petamas@iit.bme.hu
Kanari: Szeberenyi Imre, 2013. Kanari: Szeberenyi Imre, 2013.
VS 2012: Szebernyi Imre, 2015., VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016. mem_dump: 2016.
meset felszabaditaskor: 2018. meset felszabaditaskor: 2018.
typo: 2019.
*********************************/ *********************************/
/*definiealni kell, ha nem paracssorbol allitjuk be (-DMEMTRACE) */ /*definialni kell, ha nem paracssorbol allitjuk be (-DMEMTRACE) */
/*#define MEMTRACE */ /*#define MEMTRACE */
#ifdef _MSC_VER #ifdef _MSC_VER
...@@ -167,7 +168,7 @@ START_NAMESPACE ...@@ -167,7 +168,7 @@ START_NAMESPACE
fprintf(fperror,"%s\n",msg); fprintf(fperror,"%s\n",msg);
if (p) { if (p) {
fprintf(fperror, "\tPointer:\t%p", PU(p)); fprintf(fperror, "\tPointer:\t%p", PU(p));
if (size) fprintf(fperror," (%u byte)", (unsigned)size); if (size) fprintf(fperror," (%d byte)", (int)size);
fprintf(fperror,"\n"); fprintf(fperror,"\n");
} }
if (a) print_call("\tFoglalas:\t", *a); if (a) print_call("\tFoglalas:\t", *a);
...@@ -199,7 +200,7 @@ START_NAMESPACE ...@@ -199,7 +200,7 @@ START_NAMESPACE
static void print_registry_item(registry_item * p) { static void print_registry_item(registry_item * p) {
if (p) { if (p) {
print_registry_item(p->next); print_registry_item(p->next);
fprintf(fperror, "\t%p%5u byte ",p->p, (unsigned)p->size); fprintf(fperror, "\t%p%5d byte ",p->p, (int)p->size);
print_call(NULL, p->call); print_call(NULL, p->call);
if(p->call.par_txt) free(p->call.par_txt); if(p->call.par_txt) free(p->call.par_txt);
if(p->call.file) free(p->call.file); if(p->call.file) free(p->call.file);
...@@ -207,10 +208,10 @@ START_NAMESPACE ...@@ -207,10 +208,10 @@ START_NAMESPACE
} }
} }
/* ha nincs hiba, akkor 0-val tr vissza */ /* ha nincs hiba, akkor 0-val tér vissza */
int mem_check(void) { int mem_check(void) {
initialize(); initialize();
if(dying) return 2; /* cmzsi hiba */ if(dying) return 2; /* címzési hiba */
if(registry.next) { if(registry.next) {
/*szivarog*/ /*szivarog*/
...@@ -220,7 +221,7 @@ START_NAMESPACE ...@@ -220,7 +221,7 @@ START_NAMESPACE
fprintf(fperror, "Szivargas:\n"); fprintf(fperror, "Szivargas:\n");
print_registry_item(registry.next); print_registry_item(registry.next);
registry.next = NULL; registry.next = NULL;
return 1; /* memria fogys */ return 1; /* memória fogyás */
} }
return 0; return 0;
} }
...@@ -250,7 +251,7 @@ START_NAMESPACE ...@@ -250,7 +251,7 @@ START_NAMESPACE
initialize(); initialize();
allocated_blks++; allocated_blks++;
#ifdef MEMTRACE_TO_FILE #ifdef MEMTRACE_TO_FILE
fprintf(trace_file, "%p\t%d\t%s%s", PU(p), size, pretty[call.f], call.par_txt ? call.par_txt : "?"); fprintf(trace_file, "%p\t%d\t%s%s", PU(p), (int)size, pretty[call.f], call.par_txt ? call.par_txt : "?");
if (call.f <= 3) fprintf(trace_file, ")"); if (call.f <= 3) fprintf(trace_file, ")");
fprintf(trace_file, "\t%d\t%s\n", call.line, call.file ? call.file : "?"); fprintf(trace_file, "\t%d\t%s\n", call.line, call.file ? call.file : "?");
fflush(trace_file); fflush(trace_file);
...@@ -320,7 +321,7 @@ START_NAMESPACE ...@@ -320,7 +321,7 @@ START_NAMESPACE
END_NAMESPACE END_NAMESPACE
/*******************************************************************/ /*******************************************************************/
/* C-stlus memriakezels */ /* C-stílusú memóriakezelés */
/*******************************************************************/ /*******************************************************************/
#ifdef MEMTRACE_C #ifdef MEMTRACE_C
...@@ -414,7 +415,7 @@ END_NAMESPACE ...@@ -414,7 +415,7 @@ END_NAMESPACE
#endif/*MEMTRACE_C*/ #endif/*MEMTRACE_C*/
/*******************************************************************/ /*******************************************************************/
/* C++-stlus memriakezels */ /* C++-stílusú memóriakezelés */
/*******************************************************************/ /*******************************************************************/
#ifdef MEMTRACE_CPP #ifdef MEMTRACE_CPP
...@@ -431,7 +432,7 @@ START_NAMESPACE ...@@ -431,7 +432,7 @@ START_NAMESPACE
void set_delete_call(int line, const char * file) { void set_delete_call(int line, const char * file) {
initialize(); initialize();
delete_call=pack(0,"",line,file); /*func rtke lnyegtelen, majd fellrjuk*/ delete_call=pack(0,"",line,file); /*func értéke lényegtelen, majd felülírjuk*/
delete_called = TRUE; delete_called = TRUE;
} }
...@@ -486,9 +487,17 @@ void operator delete(void * p) THROW_NOTHING { ...@@ -486,9 +487,17 @@ void operator delete(void * p) THROW_NOTHING {
void operator delete[](void * p) THROW_NOTHING { void operator delete[](void * p) THROW_NOTHING {
memtrace::traced_delete(p,FDELETEARR); memtrace::traced_delete(p,FDELETEARR);
} }
#if __cplusplus >= 201402L
void operator delete(void * p, size_t) THROW_NOTHING {
memtrace::traced_delete(p,FDELETE);
}
void operator delete[](void * p, size_t) THROW_NOTHING {
memtrace::traced_delete(p,FDELETEARR);
}
#endif
/* Visual C++ 2012 miatt kell, mert hklis, hogy nincs megfelel delete, br senki sem hasznlja */ /* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void * p, int, const char *) THROW_NOTHING { void operator delete(void * p, int, const char *) THROW_NOTHING {
memtrace::traced_delete(p,FDELETE); memtrace::traced_delete(p,FDELETE);
} }
...@@ -514,7 +523,7 @@ START_NAMESPACE ...@@ -514,7 +523,7 @@ START_NAMESPACE
#ifdef MEMTRACE_TO_MEMORY #ifdef MEMTRACE_TO_MEMORY
registry.next = NULL; registry.next = NULL;
#if !defined(USE_ATEXIT_OBJECT) && defined(MEMTRACE_AUTO) #if !defined(USE_ATEXIT_OBJECT) && defined(MEMTRACE_AUTO)
atexit((void(*)())mem_check); atexit((void(*)(void))mem_check);
#endif #endif
#endif #endif
#ifdef MEMTRACE_TO_FILE #ifdef MEMTRACE_TO_FILE
......
...@@ -5,7 +5,7 @@ Keszitette: Peregi Tamas, BME IIT, 2011 ...@@ -5,7 +5,7 @@ Keszitette: Peregi Tamas, BME IIT, 2011
Kanari: Szeberenyi Imre, 2013., Kanari: Szeberenyi Imre, 2013.,
VS 2012: Szeberényi Imre, 2015., VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016. mem_dump: 2016.
include-ok: 2017, 2018. inclue-ok: 2017., 2018., 2019., 2021.
*********************************/ *********************************/
#ifndef MEMTRACE_H #ifndef MEMTRACE_H
...@@ -71,15 +71,28 @@ include-ok: 2017, 2018. ...@@ -71,15 +71,28 @@ include-ok: 2017, 2018.
#define TRACEC(func) func #define TRACEC(func) func
#endif #endif
/* A Visual Studio figyelmen kivul hagyja a "throw" deklaraciokat, a gcc -pedantic pedig igenyli.*/ // THROW deklaráció változatai
#ifdef _MSC_VER #if defined(_MSC_VER)
/* Ha studio */ // VS rosszul kezeli az __cplusplus makrot
#if _MSC_VER < 1900
// * nem biztos, hogy jó így *
#define THROW_BADALLOC #define THROW_BADALLOC
#define THROW_NOTHING #define THROW_NOTHING
#else
// C++11 vagy újabb
#define THROW_BADALLOC noexcept(false)
#define THROW_NOTHING noexcept
#endif
#else #else
/* Normalis forditok */ #if __cplusplus < 201103L
// C++2003 vagy régebbi
#define THROW_BADALLOC throw (std::bad_alloc) #define THROW_BADALLOC throw (std::bad_alloc)
#define THROW_NOTHING throw () #define THROW_NOTHING throw ()
#else
// C++11 vagy újabb
#define THROW_BADALLOC noexcept(false)
#define THROW_NOTHING noexcept
#endif
#endif #endif
START_NAMESPACE START_NAMESPACE
...@@ -131,12 +144,26 @@ END_NAMESPACE ...@@ -131,12 +144,26 @@ END_NAMESPACE
#include <stdlib.h> #include <stdlib.h>
#ifdef __cplusplus #ifdef __cplusplus
#include <iostream> #include <iostream>
/* ide gyűjtjük a nemtrace-szel összeakadó headereket, hogy elõbb legyenek */ /* ide gyűjtjük a nemtrace-vel összeakadó headereket, hogy előbb legyenek */
#include <fstream> // VS 2013 headerjében van deleted definició #include <fstream> // VS 2013 headerjében van deleted definició
#include <sstream> #include <sstream>
#include <vector> #include <vector>
#include <list>
#include <map>
#include <algorithm> #include <algorithm>
#include <functional>
#include <memory>
#include <iomanip>
#include <locale>
#include <typeinfo>
#include <ostream>
#include <stdexcept>
#include <ctime>
#if __cplusplus >= 201103L
#include <iterator>
#include <regex>
#endif
#endif #endif
#ifdef MEMTRACE_CPP #ifdef MEMTRACE_CPP
namespace std { namespace std {
...@@ -162,7 +189,7 @@ START_NAMESPACE ...@@ -162,7 +189,7 @@ START_NAMESPACE
#define realloc(old,size) TRACEC(traced_realloc)(old,size,#size,__LINE__,__FILE__) #define realloc(old,size) TRACEC(traced_realloc)(old,size,#size,__LINE__,__FILE__)
void * traced_realloc(void * old, size_t size, const char *size_txt, int line, const char * file); void * traced_realloc(void * old, size_t size, const char *size_txt, int line, const char * file);
void mem_dump(void const *mem, size_t size, FILE* fp); void mem_dump(void const *mem, size_t size, FILE* fp = stdout);
END_NAMESPACE END_NAMESPACE
...@@ -184,7 +211,13 @@ void * operator new[](size_t size) THROW_BADALLOC; ...@@ -184,7 +211,13 @@ void * operator new[](size_t size) THROW_BADALLOC;
void operator delete(void * p) THROW_NOTHING; void operator delete(void * p) THROW_NOTHING;
void operator delete[](void * p) THROW_NOTHING; void operator delete[](void * p) THROW_NOTHING;
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelõ delete, bár senki sem használja */ #if __cplusplus >= 201402L
// sized delete miatt: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3536.html
void operator delete(void * p, size_t) THROW_NOTHING;
void operator delete[](void * p, size_t) THROW_NOTHING;
#endif
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void *p, int, const char *) THROW_NOTHING; void operator delete(void *p, int, const char *) THROW_NOTHING;
void operator delete[](void *p, int, const char *) THROW_NOTHING; void operator delete[](void *p, int, const char *) THROW_NOTHING;
...@@ -193,11 +226,14 @@ void operator delete[](void *p, int, const char *) THROW_NOTHING; ...@@ -193,11 +226,14 @@ void operator delete[](void *p, int, const char *) THROW_NOTHING;
#define delete memtrace::set_delete_call(__LINE__, __FILE__),delete #define delete memtrace::set_delete_call(__LINE__, __FILE__),delete
#ifdef CPORTA #ifdef CPORTA
//#define system(...) // system(__VA_ARGS__) #define system(...) // system(__VA_ARGS__)
#endif #endif
#endif /*MEMTRACE_CPP*/ #endif /*MEMTRACE_CPP*/
#endif /*FROM_MEMTRACE_CPP*/ #endif /*FROM_MEMTRACE_CPP*/
#endif /*MEMCHECK*/ #else
#pragma message ( "MEMTRACE NOT DEFINED" )
#endif /*MEMTRACE*/
#endif /*MEMTRACE_H*/ #endif /*MEMTRACE_H*/
...@@ -25,4 +25,5 @@ ...@@ -25,4 +25,5 @@
5 stop destruktor 5 stop destruktor
10 ez mar a vége 10 ez mar a vége
11 ne tovább 11 ne tovább
99
0 0
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
* Sz.I. 2015., 2016., 2017. (_Has_X) * Sz.I. 2015., 2016., 2017. (_Has_X)
* Sz.I. 2018 (template), ENDM, ENDMsg, nullptr_t * Sz.I. 2018 (template), ENDM, ENDMsg, nullptr_t
* Sz.I. 2019 singleton * Sz.I. 2019 singleton
* Sz.I. 2021 ASSERT.., STRCASE...
* Sz.I. 2021 EXPEXT_REGEXP
* *
* A tesztelés legalapvetőbb funkcióit támogató függvények és makrók. * A tesztelés legalapvetőbb funkcióit támogató függvények és makrók.
* Nem szálbiztos megvalósítás. * Nem szálbiztos megvalósítás.
...@@ -26,6 +28,14 @@ ...@@ -26,6 +28,14 @@
* ... * ...
* END * END
* ... * ...
* // Fatális hiba esetén a teszteset nem fut tovább. Ezek az ASSERT... makrók.
* // Nem lehet a kiírásukhoz további üzenetet fűzni. PL:
* TEST(TeszEsetNeve, TesztNeve)
* ASSERT_NO_THROW(f(0)); // itt nem lehet << "duma"
* EXPECT_EQ(4, f(2)) << "A függvény hibás eredményt adott" << std::endl;
* ...
* END
* ...
* *
* A működés részleteinek megértése szorgalmi feladat. * A működés részleteinek megértése szorgalmi feladat.
*/ */
...@@ -35,10 +45,15 @@ ...@@ -35,10 +45,15 @@
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
#include <limits> #include <limits>
#include <cstdlib>
#include <string> #include <string>
#include <fstream> #include <fstream>
#if __cplusplus >= 201103L
# include <iterator>
# include <regex>
#endif
#ifdef MEMTRACE #ifdef MEMTRACE
#include "memtrace.h" # include "memtrace.h"
#endif #endif
// Két makró az egyes tesztek elé és mögé: // Két makró az egyes tesztek elé és mögé:
...@@ -50,19 +65,19 @@ ...@@ -50,19 +65,19 @@
/// a gtest keretrendszerbe. /// a gtest keretrendszerbe.
/// @param C - teszteset neve (csak a gtest kompatibilitás miatt van külön neve az eseteknek) /// @param C - teszteset neve (csak a gtest kompatibilitás miatt van külön neve az eseteknek)
/// @param N - teszt neve /// @param N - teszt neve
#define TEST(C, N) { gtest_lite::test.begin(#C"."#N); #define TEST(C, N) do { gtest_lite::test.begin(#C"."#N);
/// Teszteset vége. /// Teszteset vége.
#define END gtest_lite::test.end(); } #define END gtest_lite::test.end(); } while (false);
/// Teszteset vége allokált blokkok számának összehasonlításával /// Teszteset vége allokált blokkok számának összehasonlításával
/// Ez az ellenőrzés nem bomba biztos. /// Ez az ellenőrzés nem bomba biztos.
#define ENDM gtest_lite::test.end(true); } #define ENDM gtest_lite::test.end(true); } while (false);
/// Teszteset vége allokált blokkok számának összehasonlításával /// Teszteset vége allokált blokkok számának összehasonlításával
/// Ez az ellenőrzés nem bomba biztos. /// Ez az ellenőrzés nem bomba biztos.
/// Ha hiba van kiírja az üzenetet. /// Ha hiba van kiírja az üzenetet.
#define ENDMsg(t) gtest_lite::test.end(true) << t << std::endl; } #define ENDMsg(t) gtest_lite::test.end(true) << t << std::endl; } while (false);
// Eredmények vizsgálatát segítő makrók. // Eredmények vizsgálatát segítő makrók.
// A paraméterek és a funkciók a gtest keretrendszerrel megegyeznek. // A paraméterek és a funkciók a gtest keretrendszerrel megegyeznek.
...@@ -70,11 +85,13 @@ ...@@ -70,11 +85,13 @@
/// Sikeres teszt makrója /// Sikeres teszt makrója
#define SUCCEED() gtest_lite::test.expect(true, __FILE__, __LINE__, "SUCCEED()", true) #define SUCCEED() gtest_lite::test.expect(true, __FILE__, __LINE__, "SUCCEED()", true)
/// Sikertelen teszt makrója /// Sikertelen teszt fatális hiba makrója
#define FAIL() gtest_lite::test.expect(false, __FILE__, __LINE__, "FAIL()", true) #define FAIL() gtest_lite::test.expect(false, __FILE__, __LINE__, "FAIL()", true)
/// Azonosságot elváró makró /// Sikertelen teszt makrója
#define ADD_FAILURE() gtest_lite::test.expect(false, __FILE__, __LINE__, "ADD_FAILURE()", true)
/// Azonosságot elváró makró
#define EXPECT_EQ(expected, actual) gtest_lite::EXPECT_(expected, actual, gtest_lite::eq, __FILE__, __LINE__, "EXPECT_EQ(" #expected ", " #actual ")" ) #define EXPECT_EQ(expected, actual) gtest_lite::EXPECT_(expected, actual, gtest_lite::eq, __FILE__, __LINE__, "EXPECT_EQ(" #expected ", " #actual ")" )
/// Eltérést elváró makró /// Eltérést elváró makró
...@@ -110,6 +127,12 @@ ...@@ -110,6 +127,12 @@
/// C stringek (const char *) eltéréset tesztelő makró /// C stringek (const char *) eltéréset tesztelő makró
#define EXPECT_STRNE(expected, actual) gtest_lite::EXPECTSTR(expected, actual, gtest_lite::nestr, __FILE__, __LINE__, "EXPECT_STRNE(" #expected ", " #actual ")", "etalon" ) #define EXPECT_STRNE(expected, actual) gtest_lite::EXPECTSTR(expected, actual, gtest_lite::nestr, __FILE__, __LINE__, "EXPECT_STRNE(" #expected ", " #actual ")", "etalon" )
/// C stringek (const char *) azonosságát tesztelő makró (kisbetű/nagybetű azonos)
#define EXPECT_STRCASEEQ(expected, actual) gtest_lite::EXPECTSTR(expected, actual, gtest_lite::eqstrcase, __FILE__, __LINE__, "EXPECT_STRCASEEQ(" #expected ", " #actual ")" )
/// C stringek (const char *) eltéréset tesztelő makró (kisbetű/nagybetű azonos)
#define EXPECT_STRCASENE(expected, actual) gtest_lite::EXPECTSTR(expected, actual, gtest_lite::nestrcase, __FILE__, __LINE__, "EXPECT_STRCASENE(" #expected ", " #actual ")", "etalon" )
/// Kivételt várunk /// Kivételt várunk
#define EXPECT_THROW(statement, exception_type) try { gtest_lite::test.tmp = false; statement; } \ #define EXPECT_THROW(statement, exception_type) try { gtest_lite::test.tmp = false; statement; } \
catch (exception_type) { gtest_lite::test.tmp = true; } \ catch (exception_type) { gtest_lite::test.tmp = true; } \
...@@ -126,16 +149,39 @@ ...@@ -126,16 +149,39 @@
catch (...) { gtest_lite::test.tmp = false; }\ catch (...) { gtest_lite::test.tmp = false; }\
EXPECTTHROW(statement, "nem dob kivetelt.", "kivetelt dobott.") EXPECTTHROW(statement, "nem dob kivetelt.", "kivetelt dobott.")
/// Nem várunk kivételt gtest kompatibilitás miatt /// Nem várunk kivételt
#define ASSERT_NO_THROW(statement) try { gtest_lite::test.tmp = true; statement; } \ #define ASSERT_NO_THROW(statement) try { gtest_lite::test.tmp = true; statement; } \
catch (...) { gtest_lite::test.tmp = false; }\ catch (...) { gtest_lite::test.tmp = false; }\
EXPECTTHROW(statement, "nem dob kivetelt.", "kivetelt dobott.") ASSERTTHROW(statement, "nem dob kivetelt.", "kivetelt dobott.")
/// Kivételt várunk és továbbdobjuk -- ilyen nincs a gtest-ben /// Kivételt várunk és továbbdobjuk -- ilyen nincs a gtest-ben
#define EXPECT_THROW_THROW(statement, exception_type) try { gtest_lite::test.tmp = false; statement; } \ #define EXPECT_THROW_THROW(statement, exception_type) try { gtest_lite::test.tmp = false; statement; } \
catch (exception_type) { gtest_lite::test.tmp = true; throw; } \ catch (exception_type) { gtest_lite::test.tmp = true; throw; } \
EXPECTTHROW(statement, "kivetelt dob.", "nem dobott '"#exception_type"' kivetelt.") EXPECTTHROW(statement, "kivetelt dob.", "nem dobott '"#exception_type"' kivetelt.")
/// Környezeti változóhoz hasonlít -- ilyen nincs a gtest-ben
#define EXPECT_ENVEQ(expected, actual) gtest_lite::EXPECTSTR(std::getenv(expected), actual, gtest_lite::eqstr, __FILE__, __LINE__, "EXPECT_ENVEQ(" #expected ", " #actual ")" )
/// Környezeti változóhoz hasonlít -- ilyen nincs a gtest-ben (kisbetű/nagybetű azonos)
#define EXPECT_ENVCASEEQ(expected, actual) gtest_lite::EXPECTSTR(std::getenv(expected), actual, gtest_lite::eqstrcase, __FILE__, __LINE__, "EXPECT_ENVCASEEQ(" #expected ", " #actual ")" )
#if __cplusplus >= 201103L
/// Reguláris kifejezés illesztése
# define EXPECT_REGEXP(expected, actual, match, err) gtest_lite::EXPECTREGEXP(expected, actual, match, err, __FILE__, __LINE__, "EXPECT_REGEXP(" #expected ", " #actual ", " #match ")" )
#endif
////--------------------------------------------------------------------------------------------
/// ASSERT típusú ellenőrzések. CSak 1-2 van megvalósítva. Nem ostream& -val térnek vissza !!!
/// Kivételt várunk
/// Azonosságot elváró makró
#define ASSERT_EQ(expected, actual) gtest_lite::ASSERT_(expected, actual, gtest_lite::eq, "ASSER_EQ")
/// Nem várunk kivételt
#define ASSERT_NO_THROW(statement) try { gtest_lite::test.tmp = true; statement; } \
catch (...) { gtest_lite::test.tmp = false; }\
ASSERTTHROW(statement, "nem dob kivetelt.", "kivetelt dobott.")
/// Segédmakró egy adattag, vagy tagfüggvény létezésének tesztelésére futási időben /// Segédmakró egy adattag, vagy tagfüggvény létezésének tesztelésére futási időben
/// Ötlet: /// Ötlet:
/// https://cpptalk.wordpress.com/2009/09/12/substitution-failure-is-not-an-error-2 /// https://cpptalk.wordpress.com/2009/09/12/substitution-failure-is-not-an-error-2
...@@ -174,6 +220,13 @@ struct _Is_Types { ...@@ -174,6 +220,13 @@ struct _Is_Types {
<< "** Az utasitas " << (act) \ << "** Az utasitas " << (act) \
<< "\n** Azt vartuk, hogy " << (exp) << std::endl << "\n** Azt vartuk, hogy " << (exp) << std::endl
#define ASSERTTHROW(statement, exp, act) gtest_lite::test.expect(gtest_lite::test.tmp, __FILE__, __LINE__, #statement) \
<< "** Az utasitas " << (act) \
<< "\n** Azt vartuk, hogy " << (exp) << std::endl; if (!gtest_lite::test.status) { gtest_lite::test.end(); break; }
#define ASSERT_(expected, actual, fn, op) EXPECT_(expected, actual, fn, __FILE__, __LINE__, #op "(" #expected ", " #actual ")" ); \
if (!gtest_lite::test.status) { gtest_lite::test.end(); break; }
#ifdef CPORTA #ifdef CPORTA
#define GTINIT(is) \ #define GTINIT(is) \
int magic; \ int magic; \
...@@ -243,6 +296,8 @@ public: ...@@ -243,6 +296,8 @@ public:
bool fail() { return failed; } bool fail() { return failed; }
bool astatus() { return status; }
/// Eredményt adminisztráló tagfüggvény True a jó eset. /// Eredményt adminisztráló tagfüggvény True a jó eset.
std::ostream& expect(bool st, const char *file, int line, const char *expr, bool pr = false) { std::ostream& expect(bool st, const char *file, int line, const char *expr, bool pr = false) {
if (!st) { if (!st) {
...@@ -311,6 +366,29 @@ std::ostream& EXPECTSTR(const char *exp, const char *act, bool (*pred)(const cha ...@@ -311,6 +366,29 @@ std::ostream& EXPECTSTR(const char *exp, const char *act, bool (*pred)(const cha
<< "\n** " << rhs << ": " << (act == NULL ? "NULL pointer" : std::string("\"") + act + std::string("\"")) << std::endl; << "\n** " << rhs << ": " << (act == NULL ? "NULL pointer" : std::string("\"") + act + std::string("\"")) << std::endl;
} }
#if __cplusplus >= 201103L
/// regexp összehasonlításhoz.
template <typename E, typename S>
int count_regexp(E exp, S str) {
std::regex rexp(exp);
auto w_beg = std::sregex_iterator(str.begin(), str.end(), rexp);
auto w_end = std::sregex_iterator();
return std::distance(w_beg, w_end);
}
template <typename E, typename S>
std::ostream& EXPECTREGEXP(E exp, S str, int match, const char *err, const char *file, int line,
const char *expr, const char *lhs = "regexp", const char *rhs = "string",
const char *m = "elvart/illeszkedik") {
int cnt = count_regexp(exp, str);
if (match < 0) match = cnt;
return test.expect(cnt == match, file, line, expr)
<< "** " << lhs << ": " << std::string("\"") + exp + std::string("\"")
<< "\n** " << rhs << ": " << (err == NULL ? std::string("\"") + str + std::string("\"") : err)
<< "\n** " << m << ": " << match << "/" << cnt << std::endl;
}
#endif
/// segéd sablonok a relációkhoz. /// segéd sablonok a relációkhoz.
/// azért nem STL (algorithm), mert csak a függvény lehet, hogy menjen a deduckció /// azért nem STL (algorithm), mert csak a függvény lehet, hogy menjen a deduckció
template <typename T1, typename T2> template <typename T1, typename T2>
...@@ -323,6 +401,19 @@ bool eqstr(const char *a, const char *b) { ...@@ -323,6 +401,19 @@ bool eqstr(const char *a, const char *b) {
return false; return false;
} }
inline
bool eqstrcase(const char *a, const char *b) {
if (a != NULL && b != NULL) {
while (toupper(*a) == toupper(*b) && *a != '\0') {
a++;
b++;
}
return *a == *b;
}
return false;
}
template <typename T1, typename T2> template <typename T1, typename T2>
bool ne(T1 a, T2 b) { return a != b; } bool ne(T1 a, T2 b) { return a != b; }
......
...@@ -487,7 +487,15 @@ void operator delete(void * p) THROW_NOTHING { ...@@ -487,7 +487,15 @@ void operator delete(void * p) THROW_NOTHING {
void operator delete[](void * p) THROW_NOTHING { void operator delete[](void * p) THROW_NOTHING {
memtrace::traced_delete(p,FDELETEARR); memtrace::traced_delete(p,FDELETEARR);
} }
#if __cplusplus >= 201402L
void operator delete(void * p, size_t) THROW_NOTHING {
memtrace::traced_delete(p,FDELETE);
}
void operator delete[](void * p, size_t) THROW_NOTHING {
memtrace::traced_delete(p,FDELETEARR);
}
#endif
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */ /* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void * p, int, const char *) THROW_NOTHING { void operator delete(void * p, int, const char *) THROW_NOTHING {
......
...@@ -5,7 +5,7 @@ Keszitette: Peregi Tamas, BME IIT, 2011 ...@@ -5,7 +5,7 @@ Keszitette: Peregi Tamas, BME IIT, 2011
Kanari: Szeberenyi Imre, 2013., Kanari: Szeberenyi Imre, 2013.,
VS 2012: Szeberényi Imre, 2015., VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016. mem_dump: 2016.
inclue-ok: 2017., 2018. 2019. inclue-ok: 2017., 2018., 2019., 2021.
*********************************/ *********************************/
#ifndef MEMTRACE_H #ifndef MEMTRACE_H
...@@ -159,6 +159,11 @@ END_NAMESPACE ...@@ -159,6 +159,11 @@ END_NAMESPACE
#include <typeinfo> #include <typeinfo>
#include <ostream> #include <ostream>
#include <stdexcept> #include <stdexcept>
#include <ctime>
#if __cplusplus >= 201103L
#include <iterator>
#include <regex>
#endif
#endif #endif
#ifdef MEMTRACE_CPP #ifdef MEMTRACE_CPP
namespace std { namespace std {
...@@ -184,7 +189,7 @@ START_NAMESPACE ...@@ -184,7 +189,7 @@ START_NAMESPACE
#define realloc(old,size) TRACEC(traced_realloc)(old,size,#size,__LINE__,__FILE__) #define realloc(old,size) TRACEC(traced_realloc)(old,size,#size,__LINE__,__FILE__)
void * traced_realloc(void * old, size_t size, const char *size_txt, int line, const char * file); void * traced_realloc(void * old, size_t size, const char *size_txt, int line, const char * file);
void mem_dump(void const *mem, size_t size, FILE* fp); void mem_dump(void const *mem, size_t size, FILE* fp = stdout);
END_NAMESPACE END_NAMESPACE
...@@ -206,6 +211,12 @@ void * operator new[](size_t size) THROW_BADALLOC; ...@@ -206,6 +211,12 @@ void * operator new[](size_t size) THROW_BADALLOC;
void operator delete(void * p) THROW_NOTHING; void operator delete(void * p) THROW_NOTHING;
void operator delete[](void * p) THROW_NOTHING; void operator delete[](void * p) THROW_NOTHING;
#if __cplusplus >= 201402L
// sized delete miatt: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3536.html
void operator delete(void * p, size_t) THROW_NOTHING;
void operator delete[](void * p, size_t) THROW_NOTHING;
#endif
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */ /* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void *p, int, const char *) THROW_NOTHING; void operator delete(void *p, int, const char *) THROW_NOTHING;
void operator delete[](void *p, int, const char *) THROW_NOTHING; void operator delete[](void *p, int, const char *) THROW_NOTHING;
...@@ -221,5 +232,8 @@ void operator delete[](void *p, int, const char *) THROW_NOTHING; ...@@ -221,5 +232,8 @@ void operator delete[](void *p, int, const char *) THROW_NOTHING;
#endif /*MEMTRACE_CPP*/ #endif /*MEMTRACE_CPP*/
#endif /*FROM_MEMTRACE_CPP*/ #endif /*FROM_MEMTRACE_CPP*/
#endif /*MEMCHECK*/ #else
#pragma message ( "MEMTRACE NOT DEFINED" )
#endif /*MEMTRACE*/
#endif /*MEMTRACE_H*/ #endif /*MEMTRACE_H*/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment