Unit Test

Unit Test ํ…Œ์ŠคํŠธ์˜ ์†์„ฑ ์ข‹์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ๊ธฐ์ค€์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ€๋…์„ฑ 3A(Arrange / Act / Assert) ์ˆœ์„œ๋Œ€๋กœ test case ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. test case ๊ฐ€ ์–ด๋–ค ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. test case ์˜ ์ด๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑ ํ•„์š” ์ตœ์‹  test framework (java ์—์„œ ์‚ฌ์šฉํ•˜๋Š” spock)์—์„œ๋Š” ์ž์—ฐ์–ด๋กœ test case ์ด๋ฆ„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. (google test ๋Š” ๋ฏธ์ง€์›) test case ์‹คํ–‰ ์‹œ printf ๋ฌธ์„ ํ•œ ๋ฒˆ ์ถœ๋ ฅ ํ•˜๋„๋ก ๊ทœ์น™์„ ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. #define SPEC(msg) printf("[SPEC] %s\n", msg) TEST(SampleTestCase, SampleTest) { SPEC("์ด ํ…Œ์ŠคํŠธ๋Š” ๋ฌด์—‡์„ ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž…๋‹ˆ๋‹ค"); } ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜์˜ ์›์ธ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ž์—ฐ์—ฌ์™€ ๊ฐ€๊น๊ฒŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ž์—ฐ์–ด๋กœ ์ƒ์„ธํžˆ ์ง€์ • ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ž์—ฐ์–ด๋กœ ์ถœ๋ ฅ ์œ ์ง€๋ณด์ˆ˜์„ฑ ...

<span title='2024-08-19 04:00:00 +0900 KST'>August 19, 2024</span>&nbsp;ยท&nbsp;37 min&nbsp;ยท&nbsp;AswinBlue

GDB

GDB GNU Debugger์˜ ์•ฝ์ž ์œ ๋‹‰์Šค์˜ ๋””๋ฒ„๊ฑฐ๋Š” ์˜คํ”ˆ์†Œ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ GNU์—์„œ ์ƒˆ๋กœ ๊ฐœ๋ฐœํ•œ ๋””๋ฒ„๊ฑฐ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด์„œ๋Š” register(๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’), disassem(rip ๋ถ€๊ทผ ์ฃผ์†Œ๋ฅผ ๋””์Šค์–ด์…ˆ ํ•œ ๊ฐ’), stack(์Šคํƒ์˜ ๊ฐ’), backtrace(ํ˜„์žฌ rip์— ๋„๋‹ฌ ํ•  ๋•Œ ๊นŒ์ง€ ๊ฑฐ์ณ๊ฐ„ ํ•จ์ˆ˜๋“ค) ์„ ํŒŒ์•…ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ context(๋งฅ๋ฝ) ์ด๋ผ ํ•œ๋‹ค. pwndbg ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๋ฉด hacking์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค. https://github.com/pwndbg/pwndbg ์ฃผ์†Œ์—์„œ git์„ clone ๋ฐ›๊ณ , ./setup.sh๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ดํ›„ gdb ๋ช…๋ น์„ ์น  ๋•Œ ์ž๋™์œผ๋กœ pwndbg ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ ์šฉ๋œ gdb๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ปดํŒŒ์ผ gcc๋กœ ์ปดํŒŒ์ผ์‹œ ์˜ต์…˜์— -g ๋ฅผ ๋ถ™์—ฌ์•ผ ์†Œ์Šค๋ฅผ ๋ณด๋ฉด์„œ ๋””๋ฒ„๊น…์ด ๊ฐ€๋Šฅ ๋ฆฌ๋ˆ…์Šค์—์„œ ์ปดํŒŒ์ผํ•œ ํŒŒ์ผ์€ ELF (Executable and Linkable Format) ์˜ ์‹คํ–‰ ํŒŒ์ผ์ด ๋œ๋‹ค. ELF ํŒŒ์ผ์€ ํŒŒ์ผ ์‹คํ–‰์— ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ๋“  ํ—ค๋”์™€ ์—ฌ๋Ÿฌ ์„น์…˜๋“ค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์„น์…˜์—๋Š” ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ ๋“ฑ์˜ ์ •๋ณด๋“ค์ด ๋“ค์–ด์žˆ๋‹ค. readelf -h [ELFํŒŒ์ผ] ๋ช…๋ น์œผ๋กœ ELF ํŒŒ์ผ์˜ ํ—ค๋” ์ •๋ณด๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. gdb ์˜ต์…˜ gdb [ํŒŒ์ผ์ด๋ฆ„] : ํ•ด๋‹น ํŒŒ์ผ์ด๋ฆ„ ๋””๋ฒ„๊น… ์‹คํ–‰ --args [arg1] [arg2] [...] : ํŒŒ์ผ ์‹คํ–‰์— ํ•„์š”ํ•œ argument๋ฅผ ์ „๋‹ฌ ๊ธฐํƒ€ ๋ช…๋ น์–ด ์‹คํ–‰ ์ „ ์„ค์ •์‚ฌํ•ญ coredumb ํŒŒ์ผ ...

<span title='2021-08-23 18:49:15 +0900 KST'>August 23, 2021</span>&nbsp;ยท&nbsp;7 min&nbsp;ยท&nbsp;AswinBlue

C++ basic

C++ basics ๋งคํฌ๋กœ #define MACRO 1 : MACRO ๊ฐ’์œผ๋กœ 1์„ ์ง€์ • #undef MACRO : MACRO๊ฐ’์— ์ง€์ •๋œ ๋‚ด์šฉ ํ•ด์ œ ์—ฌ๋Ÿฌ์ค„์˜ ๋งคํฌ๋กœ ๊ฐ’ ์ง€์ • : #define PRINT(X) printf("%d", X);\ printf("%d", (X) + 1);\ printf("%d", (X) + 2); ๋งคํฌ๋กœ ํ•ฉ์„ฑ : #define A 1 #define B 1 #define C A##B // A##B = 12 ํ•จ์ˆ˜ํ˜•ํƒœ ๋งคํฌ๋กœ ์ž‘์„ฑ : // ์ผ๋ฐ˜ํ•จ์ˆ˜์—๋Š” ';' ๋ฅผ ๋ถ™์ด์ง€๋งŒ ๋งคํฌ๋กœ ํ•จ์ˆ˜์—๋Š” ';'๋ฅผ ๋ถ™์ผ ํ•„์š”๊ฐ€ ์—†๋‹ค. // ์ผ๊ด€์„ฑ์„ ๊ฐ–๊ธฐ ์œ„ํ•ด do-while๋ฌธ ์•ˆ์— ์ž‘์„ฑํ•˜๋ฉด ๋งคํฌ๋กœ ํ•จ์ˆ˜์—๋„ ';'๋ฅผ ๋ถ™์ด๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. #define FUNC(a, b) do { \ a = b * 2;\ } while (0) ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ : // ๋งคํฌ๋กœ ํ•จ์ˆ˜๋Š” ๊ณ„์‚ฐ ์ „ ์น˜ํ™˜์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•œ๋‹ค. ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„์— ์ฃผ์˜ํ•œ๋‹ค. #define ADD1(a,b) a+b #define ADD2(a,b) (a+b) #define MULT(a,b) a*b #define MULT2(a,b) (a)*(b) ... printf("%d",ADD1(3,4) * 2) // ์˜ˆ์ƒ๊ฐ’ (3 + 4) * 2 = 14 // 3 + 4 * 2 ๋กœ ์น˜ํ™˜ํ•˜์—ฌ ๊ณ„์‚ฐ๋˜์–ด ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” 11 // ADD2 ์ฒ˜๋Ÿผ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์•ผ ์•ˆ์ „ํ•˜๋‹ค. printf("%d",MULT(2+2,3+3)) // ์˜ˆ์ƒ๊ฐ’ (4 * 6) * 2 = 26 // (2 + 2 * 3 + 3) ๋กœ ์น˜ํ™˜ํ•˜์—ฌ ๊ณ„์‚ฐ๋˜์–ด ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” 11 // MULT2 ์ฒ˜๋Ÿผ ๊ฐ ๋ณ€์ˆ˜๋ฅผ ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์•ผ ์•ˆ์ „ํ•˜๋‹ค. // ADD1, MULT2 ๊ฒฝ์šฐ๋ฅผ ์ข…ํ•ฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์ž #define ADD3(a,b) ((a) + (b)) #define MULT3(a,b) ((a) * (b)) ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ if-elif-else ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์กฐ๊ฑด์— !, && || ๋…ผ๋ฆฌ์—ฐ์‚ฐ ๊ฐ€๋Šฅ #define MACRO #define DEBUG 1 #ifdef MACRO // ์ •์˜๊ฐ€ ๋˜์–ด์žˆ์œผ๋ฉด ์ˆ˜ํ–‰ #endif #if DEBUG // DEBUG๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’ ๋˜๋Š” ์‹์ด ์ฐธ์ด๋ฉด ์ˆ˜ํ–‰ #endif ํŒŒ์ผ ํฌํ•จ #include <FILE_NAME> // ํ‘œ์ค€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํŒŒ์ผ ์ฐธ์กฐ #include "FILE_NAME" // ํ˜„์žฌ ๊ฒฝ๋กœ ๊ธฐ์ค€ ํŒŒ์ผ ์ฐธ์กฐ โ†’ [ํ™œ์šฉ]: ํ—ค๋”ํŒŒ์ผ ์ค‘๋ณต ์ฐธ์กฐ ๋ฐฉ์ง€๋ฒ• ...

<span title='2021-08-12 10:41:00 +0900 KST'>August 12, 2021</span>&nbsp;ยท&nbsp;4 min&nbsp;ยท&nbsp;AswinBlue

CMake

CMake Cmake๋ž€ : C,C++ ์–ธ์–ด ์ปดํŒŒ์ผ์‹œ make ํˆด์„ ์ด์šฉํ•  ๋•Œ, ๊ทœ๋ชจ๊ฐ€ ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์ปดํŒŒ์ผ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ ๋ช…๋ น์–ด cmake CMakeList.txt : CMakeList.txtํŒŒ์ผ ์•ˆ์˜ ๋‚ด์šฉ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. cmake . : ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ์—์„œ CMakeList.txtํŒŒ์ผ์„ ์ฐพ์•„์„œ ์ˆ˜ํ–‰. make : cmake๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑํ•œ ํŒŒ์ผ๋“ค์„ ์ด์šฉํ•ด make๋กœ ์ปดํŒŒ์ผ cmake ๋ช…๋ น ํ›„ make๋ฅผ ์ด์šฉํ•ด ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ถ€์‚ฐ๋ฌผ๋“ค์ด ๋งŽ์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณดํ†ต ์ƒˆ๋กœ์šด ํด๋”๋ฅผ ๋งŒ๋“ค์–ด ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. 1. mkdir build 2. vi CMakeList.txt ํ›„ ๋‚ด์šฉ ์ž‘์„ฑ 3. cd build 4. cmake .. 5. make CmakeLists.txt ์ž‘์„ฑ์€ ์‰˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์œ ์‚ฌํ•˜๋‹ค. cmake ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•ด ์ฃผ๋ฉด ๋œ๋‹ค. ๋ฏธ๋ฆฌ ์ง€์ •๋œ ๋ณ€์ˆ˜๋“ค๋„ ์žˆ๋Š”๋ฐ, ํ•ด๋‹น ๋ณ€์ˆ˜๋“ค์— ์ฃผ์˜ํ•˜๋ฉฐ ์ž‘์„ฑํ•œ๋‹ค. ๋ฌธ๋ฒ• ๋นŒ๋“œ ์„ค์ • ADD_EXECUTABLE : ์‹คํ–‰ํŒŒ์ผ ์ƒ์„ฑ ex) ADD_EXECUTABLE(main.exe main.cpp function.cpp) : main.cpp์™€ function.cpp๋ฅผ ์‚ฌ์šฉํ•ด main.exe๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ—ค๋” ํŒŒ์ผ์€ ์ž๋™์œผ๋กœ ์ ์šฉ๋œ๋‹ค. ...

<span title='2021-08-12 10:41:00 +0900 KST'>August 12, 2021</span>&nbsp;ยท&nbsp;2 min&nbsp;ยท&nbsp;AswinBlue

Json in C++

Json library in C++ Rapid Json ์ปค๋ฎค๋‹ˆํ‹ฐ ์˜คํ”ˆ์†Œ์Šค๋กœ ๋‹ค์–‘ํ•œ ์˜ˆ์ œ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. parsing ์†๋„ ๋‹ค๋ฅธ Json ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋น„๊ต์‹œ ์ƒ์œ„๊ถŒ์— ์œ„์น˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ—ค๋” ์˜จ๋ฆฌ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ ์ฐธ์กฐ https://joycecoder.tistory.com/9 https://github.com/Tencent/rapidjson/

<span title='2021-08-12 10:41:00 +0900 KST'>August 12, 2021</span>&nbsp;ยท&nbsp;1 min&nbsp;ยท&nbsp;AswinBlue