Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Prog2
/
labor_peldak
/
lab_05
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
0e5adcae
authored
Mar 10, 2021
by
Szeberényi Imre
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
memtrace c++11 javítás
parent
85d27c54
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
114 additions
and
31 deletions
+114
-31
Makefile
+3
-3
gtest_lite.h
+68
-9
memtrace.cpp
+11
-1
memtrace.h
+29
-15
string5.cbp
+1
-1
string5_test.cpp
+2
-2
No files found.
Makefile
View file @
0e5adcae
#
# Makefile pelda a string1 feladat (
3
. labor) megoldasanak forditasara
# Makefile pelda a string1 feladat (
5
. labor) megoldasanak forditasara
# gnumake valtozat
# Linuxokon es ural2-n is elerheto
#
...
...
@@ -9,12 +9,12 @@ PROG_H = string5.h # program header fajljai
PROG_L
=
# program libjei
MTRACE_O
=
memtrace.o
# memtrace object fajl
MTRACE_H
=
memtrace.h
# memtrace
es memcheck
header fajlja
MTRACE_H
=
memtrace.h
# memtrace header fajlja
CXX
=
g++
# a C fordito neve
#CXX = clang++ # clang-ot (llvm) is erdemes kiprobalni
CXXFLAGS
=
-pedantic
-Wall
-Werror
# kapcsolok: legyen bobeszedu es pedans
CXXFLAGS
+=
-g
-DMEMTRACE
# es
legyeb
debug info is
CXXFLAGS
+=
-g
-DMEMTRACE
# es debug info is
LDFLAGS
=
-g
# debug a linkelesnel
# osszes object, osszes header osszes lib
...
...
gtest_lite.h
View file @
0e5adcae
...
...
@@ -8,6 +8,7 @@
* Sz.I. 2015., 2016., 2017. (_Has_X)
* Sz.I. 2018 (template), ENDM, ENDMsg, nullptr_t
* Sz.I. 2019 singleton
* Sz.I. 2021 ASSERT.., STRCASE...
*
* A tesztelés legalapvetőbb funkcióit támogató függvények és makrók.
* Nem szálbiztos megvalósítás.
...
...
@@ -26,6 +27,14 @@
* ...
* 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.
*/
...
...
@@ -35,6 +44,7 @@
#include <cmath>
#include <cstring>
#include <limits>
#include <cstdlib>
#include <string>
#include <fstream>
#ifdef MEMTRACE
...
...
@@ -50,19 +60,19 @@
/// a gtest keretrendszerbe.
/// @param C - teszteset neve (csak a gtest kompatibilitás miatt van külön neve az eseteknek)
/// @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.
#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
/// 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
/// Ez az ellenőrzés nem bomba biztos.
/// 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.
// A paraméterek és a funkciók a gtest keretrendszerrel megegyeznek.
...
...
@@ -70,11 +80,13 @@
/// Sikeres teszt makrója
#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)
/// 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 ")" )
/// Eltérést elváró makró
...
...
@@ -110,6 +122,12 @@
/// 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" )
/// 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
#define EXPECT_THROW(statement, exception_type) try { gtest_lite::test.tmp = false; statement; } \
catch (exception_type) { gtest_lite::test.tmp = true; } \
...
...
@@ -126,16 +144,35 @@
catch (...) { gtest_lite::test.tmp = false; }\
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; } \
catch (...) { gtest_lite::test.tmp = false; }\
EXPEC
TTHROW(statement, "nem dob kivetelt.", "kivetelt dobott.")
ASSER
TTHROW(statement, "nem dob kivetelt.", "kivetelt dobott.")
/// 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; } \
catch (exception_type) { gtest_lite::test.tmp = true; throw; } \
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 ")" )
////--------------------------------------------------------------------------------------------
/// 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
/// Ötlet:
/// https://cpptalk.wordpress.com/2009/09/12/substitution-failure-is-not-an-error-2
...
...
@@ -159,7 +196,7 @@ inline void hasMember(...) {}
/// Segédsablon típuskonverzió futás közbeni ellenőrzésere
template
<
typename
F
,
typename
T
>
struct
_Is_Types
{
template
<
typename
D
>
static
char
(
&
f
(
D
*
))[
1
];
template
<
typename
D
>
static
char
(
&
f
(
D
))[
1
];
template
<
typename
D
>
static
char
(
&
f
(...))[
2
];
static
bool
const
convertable
=
sizeof
(
f
<
T
>
(
F
()))
==
1
;
};
...
...
@@ -174,6 +211,13 @@ struct _Is_Types {
<< "** Az utasitas " << (act) \
<< "\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
#define GTINIT(is) \
int magic; \
...
...
@@ -243,6 +287,8 @@ public:
bool
fail
()
{
return
failed
;
}
bool
astatus
()
{
return
status
;
}
/// 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
)
{
if
(
!
st
)
{
...
...
@@ -323,6 +369,19 @@ bool eqstr(const char *a, const char *b) {
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
>
bool
ne
(
T1
a
,
T2
b
)
{
return
a
!=
b
;
}
...
...
memtrace.cpp
View file @
0e5adcae
...
...
@@ -7,7 +7,6 @@ VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016.
meset felszabaditaskor: 2018.
typo: 2019.
singleton: 2019.
*********************************/
/*definialni kell, ha nem paracssorbol allitjuk be (-DMEMTRACE) */
...
...
@@ -489,6 +488,13 @@ void operator delete[](void * p) THROW_NOTHING {
memtrace
::
traced_delete
(
p
,
FDELETEARR
);
}
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
);
}
/* 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
{
...
...
@@ -530,5 +536,9 @@ START_NAMESPACE
}
}
#if defined(MEMTRACE_TO_MEMORY) && defined(USE_ATEXIT_OBJECT)
int
atexit_class
::
counter
=
0
;
int
atexit_class
::
err
=
0
;
#endif
END_NAMESPACE
#endif
memtrace.h
View file @
0e5adcae
...
...
@@ -5,8 +5,7 @@ Keszitette: Peregi Tamas, BME IIT, 2011
Kanari: Szeberenyi Imre, 2013.,
VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016.
inclue-ok: 2017., 2018. 2019.
singleton: 2019.
inclue-ok: 2017., 2018., 2019., 2021.
*********************************/
#ifndef MEMTRACE_H
...
...
@@ -111,20 +110,23 @@ END_NAMESPACE
START_NAMESPACE
class
atexit_class
{
private
:
static
int
counter
;
static
int
err
;
public
:
atexit_class
()
{
#if defined(CPORTA) && !defined(CPORTA_NOSETBUF)
setbuf
(
stdout
,
0
);
setbuf
(
stderr
,
0
);
if
(
counter
==
0
)
{
setbuf
(
stdout
,
0
);
setbuf
(
stderr
,
0
);
}
#endif
counter
++
;
}
public
:
static
atexit_class
&
get_atexit_obj
()
{
static
atexit_class
instance
;
// singleton példány
return
instance
;
}
int
check
()
{
return
mem_check
();
if
(
--
counter
==
0
)
err
=
mem_check
();
return
err
;
}
~
atexit_class
()
{
...
...
@@ -132,9 +134,7 @@ START_NAMESPACE
}
};
/// A statikus referencia minden fordítási egységben keletkezik, de
/// mindegyik egyetlen példányra fog hivatkozni a singleton minta miatt
static
atexit_class
&
atexit_obj
=
atexit_class
::
get_atexit_obj
();
static
atexit_class
atexit_obj
;
END_NAMESPACE
#endif
/*MEMTRACE_TO_MEMORY && USE_ATEXIT_OBJECT*/
...
...
@@ -153,6 +153,13 @@ END_NAMESPACE
#include <map>
#include <algorithm>
#include <functional>
#include <memory>
#include <iomanip>
#include <locale>
#include <typeinfo>
#include <ostream>
#include <stdexcept>
#include <ctime>
#endif
#ifdef MEMTRACE_CPP
namespace
std
{
...
...
@@ -178,7 +185,7 @@ START_NAMESPACE
#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
mem_dump
(
void
const
*
mem
,
size_t
size
,
FILE
*
fp
);
void
mem_dump
(
void
const
*
mem
,
size_t
size
,
FILE
*
fp
=
stdout
);
END_NAMESPACE
...
...
@@ -200,6 +207,10 @@ void * operator new[](size_t size) THROW_BADALLOC;
void
operator
delete
(
void
*
p
)
THROW_NOTHING
;
void
operator
delete
[](
void
*
p
)
THROW_NOTHING
;
// 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
;
/* 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
;
...
...
@@ -215,5 +226,8 @@ void operator delete[](void *p, int, const char *) THROW_NOTHING;
#endif
/*MEMTRACE_CPP*/
#endif
/*FROM_MEMTRACE_CPP*/
#endif
/*MEMCHECK*/
#else
#pragma message ( "MEMTRACE NOT DEFINED" )
#endif
/*MEMTRACE*/
#endif
/*MEMTRACE_H*/
string5.cbp
View file @
0e5adcae
...
...
@@ -30,7 +30,7 @@
</Target>
</Build>
<Compiler>
<Add
option=
"-
Wextra
"
/>
<Add
option=
"-
pedantic
"
/>
<Add
option=
"-Wall"
/>
<Add
option=
"-Werror"
/>
</Compiler>
...
...
string5_test.cpp
View file @
0e5adcae
...
...
@@ -15,7 +15,7 @@
#include "memtrace.h" // a standard header-ek után kell lennie
#include "gtest_lite.h"
#include "string5.h"
#if ELKESZUT >= 12 && !defined(CPORTA)
#if ELKESZU
L
T >= 12 && !defined(CPORTA)
# include "rendez.h"
#endif
...
...
@@ -287,7 +287,7 @@ int main() {
/// Itt a vége
if
(
ELKESZULT
<
6
&&
!
gtest_lite
::
test
.
fail
())
FAIL
()
<<
"
\n
Legalabb az elso hat feladatot oldja meg!"
<<
std
::
endl
;
ADD_FAILURE
()
<<
"
\n
Legalabb az elso hat feladatot oldja meg!"
<<
std
::
endl
;
if
(
ELKESZULT
>=
10
&&
!
gtest_lite
::
test
.
fail
())
std
::
cout
<<
"Szuper! Mind kesz"
<<
std
::
endl
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment