From aa9150ec4f7ef6ba659ef6c9376e5e548455cb79 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Thu, 14 Nov 2024 07:46:12 -0300 Subject: [PATCH 01/21] checking on the secret --- .../87014aef1d77646b/core.program.113099.core | Bin 0 -> 458752 bytes docs/secret_files/87014aef1d77646b/header1 | Bin 0 -> 15504 bytes docs/secret_files/87014aef1d77646b/header2 | Bin 0 -> 64 bytes .../87014aef1d77646b/pendrive_image.bmp | Bin 0 -> 94398 bytes docs/secret_files/87014aef1d77646b/program | Bin 0 -> 21504 bytes .../secret_files/87014aef1d77646b/program.asm | 288 ++++++ docs/secret_files/PracticalBinary_Ch5.pdf | Bin 0 -> 326208 bytes docs/secret_files/decoded_secret | Bin 0 -> 47891 bytes docs/secret_files/secret | 841 ++++++++++++++++++ docs/secret_files/secret_solution.md | 95 ++ 10 files changed, 1224 insertions(+) create mode 100644 docs/secret_files/87014aef1d77646b/core.program.113099.core create mode 100644 docs/secret_files/87014aef1d77646b/header1 create mode 100644 docs/secret_files/87014aef1d77646b/header2 create mode 100644 docs/secret_files/87014aef1d77646b/pendrive_image.bmp create mode 100755 docs/secret_files/87014aef1d77646b/program create mode 100644 docs/secret_files/87014aef1d77646b/program.asm create mode 100644 docs/secret_files/PracticalBinary_Ch5.pdf create mode 100644 docs/secret_files/decoded_secret create mode 100644 docs/secret_files/secret create mode 100644 docs/secret_files/secret_solution.md diff --git a/docs/secret_files/87014aef1d77646b/core.program.113099.core b/docs/secret_files/87014aef1d77646b/core.program.113099.core new file mode 100644 index 0000000000000000000000000000000000000000..81eff0ec78a0e369782c680fb8b49259399b80c2 GIT binary patch literal 458752 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/secret_files/87014aef1d77646b/header1 b/docs/secret_files/87014aef1d77646b/header1 new file mode 100644 index 0000000000000000000000000000000000000000..197d6a614dc259a9041f6a208275a8da8db86dd5 GIT binary patch literal 15504 zcmeHOZEPGz8J@d1?WIj($3CYfcAIPEq6Wy;3HgG`$(`*xZ(1j9Y@gjEcGqj)**

eO#$m&iT zx7uD#AMo39o1(z6$hd%J+XDy7>7t4U8nDf>joi)ysy;VuReqqdPo#V7vXx+dE@V5n zDf~f!J4QHe=SM9_d#{RDEiVDpeo)n2*}otKTSuSnqjB-QUp;-X?YWlAcl`C07izTP zFFyR%uP3=J4CkCMPPVUu7*$xmP&jiZQ8Mf2xXq zjP&=>$6ey2s23Z>jxDz3t8g%kiA*kQ6f84u8HO+p_a8A5$$WAmRj`uz{v(~~TsGNn zj;52gt+K@!n=y^?RMt$VPAA29E+;Z(I-MI66GzY?;Ov|4*l)226YMBly!WMQ37F`V?B>il)A9Zv0nW&!Q@dd z16~Ha40svvGT>#v%Yc^wF9ZMg8PMlH2UVMPkH}QK z|0i^<-5w^6?*SuRq!{|7Ad()-Gil;2>Pm-<&0rF@#?@$(GeqMvKOKnnfb`fo7# z%&OH$;SVxT;WreQYq!s_-$g~qe^&bM%`@3?Q(w5MzxAg>`dh2(bl)ZY=Qph&Rj^4_ z5GXE>*KY4x!~doBo`24@?D9NPBKCqCUOU)M68{uU5Z;T10fUIx4jcp30A;AOzefR_O;16~Ha4E%3r z0Q)(ye-nErc~2;pjW#K55Z$EY@2h>FA5${+i8d=4k4)QuSNlcz8I23z}h}x`)y`N{4{SJ1f@{~;kHVro^S;54L+9#@DLRWS?KVt9bT}r=LV>8eB8gZ@YP)U}@m7hk}l!^m8y%U%EmtFdM zl^)|1{`-mXiMvE7Y-^DBPN}CI;A-62Rv|t|49CT|hyIlG-y$%Mp?{v3O6~u;^rzN_ zY){?|z@=J$Uy-&t5#o-xN~QY0O+J3HN#J`1$m_)T#8%N1hQ_9EOMQcI-`}4~b8YDy z0Z_}*e`_gk(0?HHjiv7o^nU7?pH6!S*L?|)zS2JXX3~cMcF_G*{2#93f4qu+TIz4z zXFpY?o@YsapQ9Zmb}Vldtm*M_ZA`3f$2Y8uF~%G63&JoGIb$N78#U8L!ph|fhB-YW z#&VgdG;O(0Xl<1}c$0q0F!OnH)<|Zp{Hz$yo0+7Mn9gKo3F43p^0dlaY5P7kCzC7` z%n3RUV8nVON1{gbXcr$G;EFkBA!kgQ*#w^#=sJEha^!F)Y3T@t5!Dqy@9HHL9W4N~ zyXVo4NRRPoEY=t8H~J$TJyEKV!>jWHVdrsye|JQ|K4(zwUVgyAK9^AD!N(P3r61vJ zLm5zLh1rZ{juN%IVg9Rj?g$aobO%vr#QmM-D&R*H z1KO%QF^^%MLBrexQ7ghv#<4nBPG|Dww)RBMHW>(L{T8li4Q3pXt?BQGnf`Yzu>};C<7?k zi)tW)KI6h;odC-7g|i?obmxe1wjc8-DAsZCclZBm3Xl6ILdsK7?w_-SoC5Lo`e5z; z&nXAcR+qm!{sppg`w{Ers!gbq&t!i@Vm;$&u5i>KluBBwmb2wyKU*42&9ZIQSjqoCH#wfY``^z16jlW3#Z$? A&j0`b literal 0 HcmV?d00001 diff --git a/docs/secret_files/87014aef1d77646b/header2 b/docs/secret_files/87014aef1d77646b/header2 new file mode 100644 index 0000000000000000000000000000000000000000..c5121e0e3eb5d350cba697c9f971a5c9bd28680e GIT binary patch literal 64 tcmb<-^>JfjWMqH=W(GS35U)T0BH{p*u-F4-04WCs3kFUgsm!3n005f01Xln6 literal 0 HcmV?d00001 diff --git a/docs/secret_files/87014aef1d77646b/pendrive_image.bmp b/docs/secret_files/87014aef1d77646b/pendrive_image.bmp new file mode 100644 index 0000000000000000000000000000000000000000..128f265b896d46174a0936d8bdb805bb1c8500f4 GIT binary patch literal 94398 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 WS*}zp1Cz~u++%1wXfiN~?7sjF656H! literal 0 HcmV?d00001 diff --git a/docs/secret_files/87014aef1d77646b/program.asm b/docs/secret_files/87014aef1d77646b/program.asm new file mode 100644 index 0000000..2d5524c --- /dev/null +++ b/docs/secret_files/87014aef1d77646b/program.asm @@ -0,0 +1,288 @@ + +program: file format elf64-x86-64 + + +Disassembly of section .init: + +0000000000401000 <_init>: + 401000: f3 0f 1e fa endbr64 + 401004: 48 83 ec 08 sub $0x8,%rsp + 401008: 48 8b 05 e1 2f 00 00 mov 0x2fe1(%rip),%rax # 403ff0 <__gmon_start__> + 40100f: 48 85 c0 test %rax,%rax + 401012: 74 02 je 401016 <_init+0x16> + 401014: ff d0 call *%rax + 401016: 48 83 c4 08 add $0x8,%rsp + 40101a: c3 ret + +Disassembly of section .plt: + +0000000000401020 <.plt>: + 401020: ff 35 e2 2f 00 00 push 0x2fe2(%rip) # 404008 <_GLOBAL_OFFSET_TABLE_+0x8> + 401026: ff 25 e4 2f 00 00 jmp *0x2fe4(%rip) # 404010 <_GLOBAL_OFFSET_TABLE_+0x10> + 40102c: 0f 1f 40 00 nopl 0x0(%rax) + +0000000000401030 : + 401030: ff 25 e2 2f 00 00 jmp *0x2fe2(%rip) # 404018 + 401036: 68 00 00 00 00 push $0x0 + 40103b: e9 e0 ff ff ff jmp 401020 <.plt> + +0000000000401040 : + 401040: ff 25 da 2f 00 00 jmp *0x2fda(%rip) # 404020 + 401046: 68 01 00 00 00 push $0x1 + 40104b: e9 d0 ff ff ff jmp 401020 <.plt> + +0000000000401050 : + 401050: ff 25 d2 2f 00 00 jmp *0x2fd2(%rip) # 404028 + 401056: 68 02 00 00 00 push $0x2 + 40105b: e9 c0 ff ff ff jmp 401020 <.plt> + +0000000000401060 : + 401060: ff 25 ca 2f 00 00 jmp *0x2fca(%rip) # 404030 + 401066: 68 03 00 00 00 push $0x3 + 40106b: e9 b0 ff ff ff jmp 401020 <.plt> + +0000000000401070 : + 401070: ff 25 c2 2f 00 00 jmp *0x2fc2(%rip) # 404038 + 401076: 68 04 00 00 00 push $0x4 + 40107b: e9 a0 ff ff ff jmp 401020 <.plt> + +0000000000401080 : + 401080: ff 25 ba 2f 00 00 jmp *0x2fba(%rip) # 404040 + 401086: 68 05 00 00 00 push $0x5 + 40108b: e9 90 ff ff ff jmp 401020 <.plt> + +0000000000401090 : + 401090: ff 25 b2 2f 00 00 jmp *0x2fb2(%rip) # 404048 + 401096: 68 06 00 00 00 push $0x6 + 40109b: e9 80 ff ff ff jmp 401020 <.plt> + +00000000004010a0 : + 4010a0: ff 25 aa 2f 00 00 jmp *0x2faa(%rip) # 404050 + 4010a6: 68 07 00 00 00 push $0x7 + 4010ab: e9 70 ff ff ff jmp 401020 <.plt> + +00000000004010b0 : + 4010b0: ff 25 a2 2f 00 00 jmp *0x2fa2(%rip) # 404058 + 4010b6: 68 08 00 00 00 push $0x8 + 4010bb: e9 60 ff ff ff jmp 401020 <.plt> + +Disassembly of section .text: + +00000000004010c0 <_start>: + 4010c0: f3 0f 1e fa endbr64 + 4010c4: 31 ed xor %ebp,%ebp + 4010c6: 49 89 d1 mov %rdx,%r9 + 4010c9: 5e pop %rsi + 4010ca: 48 89 e2 mov %rsp,%rdx + 4010cd: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp + 4010d1: 50 push %rax + 4010d2: 54 push %rsp + 4010d3: 45 31 c0 xor %r8d,%r8d + 4010d6: 31 c9 xor %ecx,%ecx + 4010d8: 48 c7 c7 2c 12 40 00 mov $0x40122c,%rdi + 4010df: ff 15 fb 2e 00 00 call *0x2efb(%rip) # 403fe0 <__libc_start_main@GLIBC_2.34> + 4010e5: f4 hlt + 4010e6: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) + 4010ed: 00 00 00 + +00000000004010f0 <_dl_relocate_static_pie>: + 4010f0: f3 0f 1e fa endbr64 + 4010f4: c3 ret + 4010f5: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) + 4010fc: 00 00 00 + 4010ff: 90 nop + +0000000000401100 : + 401100: 48 8d 3d 61 2f 00 00 lea 0x2f61(%rip),%rdi # 404068 + 401107: 48 8d 05 5a 2f 00 00 lea 0x2f5a(%rip),%rax # 404068 + 40110e: 48 39 f8 cmp %rdi,%rax + 401111: 74 15 je 401128 + 401113: 48 8b 05 ce 2e 00 00 mov 0x2ece(%rip),%rax # 403fe8 <_ITM_deregisterTMCloneTable> + 40111a: 48 85 c0 test %rax,%rax + 40111d: 74 09 je 401128 + 40111f: ff e0 jmp *%rax + 401121: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) + 401128: c3 ret + 401129: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) + +0000000000401130 : + 401130: 48 8d 3d 31 2f 00 00 lea 0x2f31(%rip),%rdi # 404068 + 401137: 48 8d 35 2a 2f 00 00 lea 0x2f2a(%rip),%rsi # 404068 + 40113e: 48 29 fe sub %rdi,%rsi + 401141: 48 89 f0 mov %rsi,%rax + 401144: 48 c1 ee 3f shr $0x3f,%rsi + 401148: 48 c1 f8 03 sar $0x3,%rax + 40114c: 48 01 c6 add %rax,%rsi + 40114f: 48 d1 fe sar $1,%rsi + 401152: 74 14 je 401168 + 401154: 48 8b 05 9d 2e 00 00 mov 0x2e9d(%rip),%rax # 403ff8 <_ITM_registerTMCloneTable> + 40115b: 48 85 c0 test %rax,%rax + 40115e: 74 08 je 401168 + 401160: ff e0 jmp *%rax + 401162: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) + 401168: c3 ret + 401169: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) + +0000000000401170 <__do_global_dtors_aux>: + 401170: f3 0f 1e fa endbr64 + 401174: 80 3d f5 2e 00 00 00 cmpb $0x0,0x2ef5(%rip) # 404070 + 40117b: 75 13 jne 401190 <__do_global_dtors_aux+0x20> + 40117d: 55 push %rbp + 40117e: 48 89 e5 mov %rsp,%rbp + 401181: e8 7a ff ff ff call 401100 + 401186: c6 05 e3 2e 00 00 01 movb $0x1,0x2ee3(%rip) # 404070 + 40118d: 5d pop %rbp + 40118e: c3 ret + 40118f: 90 nop + 401190: c3 ret + 401191: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1) + 401198: 00 00 00 00 + 40119c: 0f 1f 40 00 nopl 0x0(%rax) + +00000000004011a0 : + 4011a0: f3 0f 1e fa endbr64 + 4011a4: eb 8a jmp 401130 + +00000000004011a6 : + 4011a6: 55 push %rbp + 4011a7: 48 89 e5 mov %rsp,%rbp + 4011aa: 48 83 ec 20 sub $0x20,%rsp + 4011ae: bf 7a 00 00 00 mov $0x7a,%edi + 4011b3: e8 d8 fe ff ff call 401090 + 4011b8: 48 89 45 f0 mov %rax,-0x10(%rbp) + 4011bc: bf 9a 20 40 00 mov $0x40209a,%edi + 4011c1: e8 6a fe ff ff call 401030 + 4011c6: 48 89 45 e8 mov %rax,-0x18(%rbp) + 4011ca: 48 8b 45 e8 mov -0x18(%rbp),%rax + 4011ce: 48 89 c7 mov %rax,%rdi + 4011d1: e8 8a fe ff ff call 401060 + 4011d6: 48 89 45 e0 mov %rax,-0x20(%rbp) + 4011da: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp) + 4011e1: eb 3b jmp 40121e + 4011e3: 8b 45 fc mov -0x4(%rbp),%eax + 4011e6: 48 98 cltq + 4011e8: 0f b6 80 20 20 40 00 movzbl 0x402020(%rax),%eax + 4011ef: 89 c6 mov %eax,%esi + 4011f1: 8b 45 fc mov -0x4(%rbp),%eax + 4011f4: 48 98 cltq + 4011f6: ba 00 00 00 00 mov $0x0,%edx + 4011fb: 48 f7 75 e0 divq -0x20(%rbp) + 4011ff: 48 8b 45 e8 mov -0x18(%rbp),%rax + 401203: 48 01 d0 add %rdx,%rax + 401206: 0f b6 10 movzbl (%rax),%edx + 401209: 8b 45 fc mov -0x4(%rbp),%eax + 40120c: 48 63 c8 movslq %eax,%rcx + 40120f: 48 8b 45 f0 mov -0x10(%rbp),%rax + 401213: 48 01 c8 add %rcx,%rax + 401216: 31 f2 xor %esi,%edx + 401218: 88 10 mov %dl,(%rax) + 40121a: 83 45 fc 01 addl $0x1,-0x4(%rbp) + 40121e: 8b 45 fc mov -0x4(%rbp),%eax + 401221: 83 f8 79 cmp $0x79,%eax + 401224: 76 bd jbe 4011e3 + 401226: 48 8b 45 f0 mov -0x10(%rbp),%rax + 40122a: c9 leave + 40122b: c3 ret + +000000000040122c
: + 40122c: 55 push %rbp + 40122d: 48 89 e5 mov %rsp,%rbp + 401230: 48 83 ec 10 sub $0x10,%rsp + 401234: 89 7d fc mov %edi,-0x4(%rbp) + 401237: 48 89 75 f0 mov %rsi,-0x10(%rbp) + 40123b: b8 00 00 00 00 mov $0x0,%eax + 401240: e8 15 00 00 00 call 40125a

+ 401245: 48 8b 45 f0 mov -0x10(%rbp),%rax + 401249: 48 83 c0 08 add $0x8,%rax + 40124d: 48 8b 00 mov (%rax),%rax + 401250: 48 89 c7 mov %rax,%rdi + 401253: e8 9f 00 00 00 call 4012f7 + 401258: c9 leave + 401259: c3 ret + +000000000040125a

: + 40125a: 55 push %rbp + 40125b: 48 89 e5 mov %rsp,%rbp + 40125e: bf aa 20 40 00 mov $0x4020aa,%edi + 401263: b8 00 00 00 00 mov $0x0,%eax + 401268: e8 03 fe ff ff call 401070 + 40126d: 48 8b 05 f4 2d 00 00 mov 0x2df4(%rip),%rax # 404068 + 401274: 48 89 c7 mov %rax,%rdi + 401277: e8 24 fe ff ff call 4010a0 + 40127c: bf 01 00 00 00 mov $0x1,%edi + 401281: e8 2a fe ff ff call 4010b0 + 401286: bf c7 20 40 00 mov $0x4020c7,%edi + 40128b: e8 c0 fd ff ff call 401050 + 401290: bf d8 20 40 00 mov $0x4020d8,%edi + 401295: b8 00 00 00 00 mov $0x0,%eax + 40129a: e8 d1 fd ff ff call 401070 + 40129f: 48 8b 05 c2 2d 00 00 mov 0x2dc2(%rip),%rax # 404068 + 4012a6: 48 89 c7 mov %rax,%rdi + 4012a9: e8 f2 fd ff ff call 4010a0 + 4012ae: bf 01 00 00 00 mov $0x1,%edi + 4012b3: e8 f8 fd ff ff call 4010b0 + 4012b8: bf c7 20 40 00 mov $0x4020c7,%edi + 4012bd: e8 8e fd ff ff call 401050 + 4012c2: bf 08 21 40 00 mov $0x402108,%edi + 4012c7: b8 00 00 00 00 mov $0x0,%eax + 4012cc: e8 9f fd ff ff call 401070 + 4012d1: 48 8b 05 90 2d 00 00 mov 0x2d90(%rip),%rax # 404068 + 4012d8: 48 89 c7 mov %rax,%rdi + 4012db: e8 c0 fd ff ff call 4010a0 + 4012e0: bf 01 00 00 00 mov $0x1,%edi + 4012e5: e8 c6 fd ff ff call 4010b0 + 4012ea: bf 44 21 40 00 mov $0x402144,%edi + 4012ef: e8 5c fd ff ff call 401050 + 4012f4: 90 nop + 4012f5: 5d pop %rbp + 4012f6: c3 ret + +00000000004012f7 : + 4012f7: 55 push %rbp + 4012f8: 48 89 e5 mov %rsp,%rbp + 4012fb: 48 83 ec 20 sub $0x20,%rsp + 4012ff: 48 89 7d e8 mov %rdi,-0x18(%rbp) + 401303: 48 8b 45 e8 mov -0x18(%rbp),%rax + 401307: be a3 20 40 00 mov $0x4020a3,%esi + 40130c: 48 89 c7 mov %rax,%rdi + 40130f: e8 6c fd ff ff call 401080 + 401314: 85 c0 test %eax,%eax + 401316: 75 75 jne 40138d + 401318: 48 8b 45 e8 mov -0x18(%rbp),%rax + 40131c: 48 89 c6 mov %rax,%rsi + 40131f: bf 58 21 40 00 mov $0x402158,%edi + 401324: b8 00 00 00 00 mov $0x0,%eax + 401329: e8 42 fd ff ff call 401070 + 40132e: 48 8b 05 33 2d 00 00 mov 0x2d33(%rip),%rax # 404068 + 401335: 48 89 c7 mov %rax,%rdi + 401338: e8 63 fd ff ff call 4010a0 + 40133d: bf 01 00 00 00 mov $0x1,%edi + 401342: e8 69 fd ff ff call 4010b0 + 401347: bf c7 20 40 00 mov $0x4020c7,%edi + 40134c: e8 ff fc ff ff call 401050 + 401351: b8 00 00 00 00 mov $0x0,%eax + 401356: e8 4b fe ff ff call 4011a6 + 40135b: 48 89 45 f8 mov %rax,-0x8(%rbp) + 40135f: 48 8b 45 f8 mov -0x8(%rbp),%rax + 401363: 48 89 c7 mov %rax,%rdi + 401366: e8 d5 fc ff ff call 401040 + 40136b: 48 8b 45 f8 mov -0x8(%rbp),%rax + 40136f: 0f b6 00 movzbl (%rax),%eax + 401372: 0f be c0 movsbl %al,%eax + 401375: 89 c6 mov %eax,%esi + 401377: bf 9c 21 40 00 mov $0x40219c,%edi + 40137c: b8 00 00 00 00 mov $0x0,%eax + 401381: e8 ea fc ff ff call 401070 + 401386: b8 00 00 00 00 mov $0x0,%eax + 40138b: eb 05 jmp 401392 + 40138d: b8 01 00 00 00 mov $0x1,%eax + 401392: c9 leave + 401393: c3 ret + +Disassembly of section .fini: + +0000000000401394 <_fini>: + 401394: f3 0f 1e fa endbr64 + 401398: 48 83 ec 08 sub $0x8,%rsp + 40139c: 48 83 c4 08 add $0x8,%rsp + 4013a0: c3 ret diff --git a/docs/secret_files/PracticalBinary_Ch5.pdf b/docs/secret_files/PracticalBinary_Ch5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a1dbe05b231898663d9c146797d2dc7ff764fa2e GIT binary patch literal 326208 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 z

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�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 literal 0 HcmV?d00001 diff --git a/docs/secret_files/decoded_secret b/docs/secret_files/decoded_secret new file mode 100644 index 0000000000000000000000000000000000000000..be24cdbbf36c1d72ac7402cac27b2f7bffb75d73 GIT binary patch literal 47891 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

hz$S#!Zw~mOJEw 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 decoded_secret`. + - `-d` flag tells Linux to decode the content of secret using *base64* format + +## 3. Identify what the secret really is + +- Now that we've decoded the secret, we need to check the type of the decoded file, for this do `file decoded_secret` inside the terminal, from which we get: + +```console +decoded_secret: gzip compressed data, was "program", last modified: Sun Nov 3 01:09:28 2024, from Unix, original size modulo 2^32 94398 +``` + +- Behind the layed of *Base64 encoding* we can see that its just a compressed archive that uses `gzip` as the outer compression layer. We can see its content without extraction using `file -z decoded_secret`, that outputs the following: + +```console +decoded_secret: POSIX tar archive (GNU) (gzip compressed data, from Unix) +``` + +## 4. Extract the contents of decoded_secret + +- Now that we've identified that `decoded_secret` is a compressed archive, we can decompress it using `tar xvzf decoded_secret`. + - `tar`: Calls the `tar` command, which is used for creating, extracting, and managing tar archives. + - `x`: Extracts the contents of the archive. + - `v`: Displays the progress in the terminal (verbose mode), showing the names of files as they’re extracted. + - `z`: Specifies that the archive is compressed with gzip (a `.gz` file). + - `f`: Indicates that the following argument, `decoded_secret`, is the name of the file to operate on. +- After doing this, the terminal gives us the next output: + +```console +87014aef1d77646b/ +87014aef1d77646b/pendrive_image.bmp.gz +87014aef1d77646b/program.gz +``` + +- This means that the content of `decoded_secret` has been extracted to a folder called `87014aef1d77646b` with contents inside. These are two single compressed files that we can decompress with `gzip`, as follows: + + - `gzip -d 87014aef1d77646b/program.gz` + - `gzip -d 87014aef1d77646b/pendrive_image.bmp.gz` + + +## 5. Analyze the executable + +Before doing anything risky and compromise our system, we should check what the executable contains, for this we can do the following: + +- `strings decompresed_secret`: displays any readable strings within the binary, which can sometimes provide hints about its functionality +- `objdump -x decompressed_secret`: To display information about sections, headers, and other low-level details +- `ldd decompressed_secret`: To check the shared libraries the executable depends on +- (Not recommended) `gdb decompressed_secret`: If you want to debug or step through the program’s execution, you can load it into the GNU debugger. This isnt recommended yet because you should never execute something without knowing what it does. + +From all of these options, the one that takes our attention is `ldd decompressed_secret`, which gives us: + +```console +linux-vdso.so.1 (0x00007ffcec9ae000) +lib87014aef.so => not found +libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000074c6d0200000) +/lib64/ld-linux-x86-64.so.2 (0x000074c6d044b000) +``` + +- Now we can see that there are no unresolved dependencies except one called `lib87014aef.so`. We need to figure out what this library is and how we can obtain it. + +Here's where maybe we can use the hint written in the room where our team found the usb with the secret file... + +```plaintext +Si a %0.3pi sumas 0.10 y multiplicas por 100, la verdad se revelará. +``` + +For what I understand, this means that we should do (3.14+0.10)*100 = 324 + +28470 + (64 * 28) = 15504 +48184 + (64 * 35) = 50424 From ba05ece2a897d70d5b3182f49524fc61df519dcf Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Fri, 22 Nov 2024 20:48:49 -0300 Subject: [PATCH 02/21] Commented code and added clang-format file --- .clang-format | 189 ++++++++++++++++++++ .gitignore | 3 + lib/memory/src/memory.c | 372 ++++++++++++++++++++++++---------------- 3 files changed, 419 insertions(+), 145 deletions(-) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..c061998 --- /dev/null +++ b/.clang-format @@ -0,0 +1,189 @@ +Language: Cpp +# BasedOnStyle: Microsoft +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: None +AlignConsecutiveMacros: None +AlignConsecutiveAssignments: None +AlignConsecutiveBitFields: None +AlignConsecutiveDeclarations: None +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortEnumsOnASingleLine: false +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: Always + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: true + AfterStruct: true + AfterUnion: false + AfterExternBlock: true + BeforeCatch: true + BeforeElse: true + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: true +BreakBeforeBraces: Custom +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 120 +CommentPragmas: '^ IWYU pragma:' +QualifierAlignment: Leave +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +PackConstructorInitializers: BinPack +BasedOnStyle: '' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +AllowAllConstructorInitializersOnNextLine: true +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseLabels: false +IndentCaseBlocks: false +IndentGotoLabels: true +IndentPPDirectives: None +IndentExternBlock: AfterExternBlock +IndentRequires: false +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertTrailingCommas: None +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +LambdaBodyIndentation: Signature +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 1000 +PenaltyIndentedWhitespace: 0 +PointerAlignment: Left +PPIndentWidth: -1 +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + BeforeNonEmptyParentheses: false +SpaceAroundPointerQualifiers: Default +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInConditionalStatement: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +BitFieldColonSpacing: Both +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 4 +UseCRLF: false +UseTab: Never +WhitespaceSensitiveMacros: + - STRINGIZE + - PP_STRINGIZE + - BOOST_PP_STRINGIZE + - NS_SWIFT_NAME + - CF_SWIFT_NAME diff --git a/.gitignore b/.gitignore index c6127b3..9049d53 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,6 @@ modules.order Module.symvers Mkfile.old dkms.conf + +# VSCode files +.vscode/ diff --git a/lib/memory/src/memory.c b/lib/memory/src/memory.c index 4e976cc..669caaa 100644 --- a/lib/memory/src/memory.c +++ b/lib/memory/src/memory.c @@ -1,243 +1,316 @@ -#include -#include +#include "lib/memory/include/memory.h" // Custom memory management header +#include // Memory management functions (e.g., mmap) -typedef struct s_block *t_block; -void *base = NULL; -int method = 0; +// Typedef for memory block structure +typedef struct s_block* t_block; +void* base = NULL; // Pointer to the beginning of the heap +int method = 0; // Memory allocation method (0 = First Fit, 1 = Best Fit) -t_block find_block(t_block *last, size_t size){ +// Function to find a suitable memory block based on the allocation method +t_block find_block(t_block* last, size_t size) +{ t_block b = base; - if (method == FIRST_FIT){ - while (b && !(b->free && b->size >= size)){ - *last = b; - b = b->next; + if (method == FIRST_FIT) + { // First Fit strategy + while (b && !(b->free && b->size >= size)) + { // Look for the first block large enough and free + *last = b; // Update the last block traversed + b = b->next; // Move to the next block } - - return (b); - } else { - size_t dif = PAGESIZE; - t_block best = NULL; - - while (b){ - if (b->free){ - if (b->size == size){ + return (b); // Return the found block or NULL + } + else + { // Best Fit strategy + size_t dif = PAGESIZE; // Difference between the requested size and the block size + t_block best = NULL; // Pointer to the best-fit block + + while (b) + { + if (b->free) + { // If the block is free + if (b->size == size) + { // Perfect match return b; } - if (b->size > size && (b->size - size) < dif){ + if (b->size > size && (b->size - size) < dif) + { // Smaller difference is better dif = b->size - size; best = b; } } - *last = b; - b = b->next; + *last = b; // Update the last traversed block + b = b->next; // Move to the next block } - return best; + return best; // Return the best-fit block or NULL } } -void split_block(t_block b, size_t s){ - if (b->size <= s + BLOCK_SIZE){ +// Function to split a memory block into two +void split_block(t_block b, size_t s) +{ + if (b->size <= s + BLOCK_SIZE) + { // Check if the block can be split return; } - - t_block new; - new = (t_block)(b->data + s); - new->size = b->size - s - BLOCK_SIZE; - new->next = b->next; - new->free = 1; - b->size = s; - b->next = new; + + t_block new; // Create a new block for the leftover memory + new = (t_block)(b->data + s); // Assign the new block after the allocated space + new->size = b->size - s - BLOCK_SIZE; // Adjust size for the new block + new->next = b->next; // Link the new block to the next block + new->free = 1; // Mark the new block as free + b->size = s; // Resize the original block + b->next = new; // Update the next link of the original block } -void copy_block(t_block src, t_block dst){ +// Function to copy data from one block to another +void copy_block(t_block src, t_block dst) +{ int *sdata, *ddata; size_t i; - sdata = src->ptr; - ddata = dst->ptr; - + + sdata = src->ptr; // Source data pointer + ddata = dst->ptr; // Destination data pointer + + // Copy data from the source block to the destination block for (i = 0; (i * 4) < src->size && (i * 4) < dst->size; i++) + { ddata[i] = sdata[i]; + } } -t_block get_block(void *p){ - char *tmp; - tmp = p; - - if (tmp >= (char *)base + BLOCK_SIZE){ - tmp -= BLOCK_SIZE; +// Function to get the block associated with a pointer +t_block get_block(void* p) +{ + char* tmp = p; // Convert to a character pointer + + if (tmp >= (char*)base + BLOCK_SIZE) + { // Ensure the pointer is within the heap range + tmp -= BLOCK_SIZE; // Move to the block metadata } - return (t_block)(tmp); + return (t_block)(tmp); // Return the block } -int valid_addr(void *p){ - if (base){ - if (p > base && p < sbrk(0)){ - t_block b = get_block(p); - return b && (p == b->ptr); +// Function to check if a pointer is valid and part of the heap +int valid_addr(void* p) +{ + if (base) + { // Ensure the heap exists + if (p > base && p < sbrk(0)) + { // Check if the pointer is within the heap range + t_block b = get_block(p); // Get the block associated with the pointer + return b && (p == b->ptr); // Validate the pointer } } - return (0); + return (0); // Invalid pointer } -t_block fusion(t_block b){ - if (b->next && b->next->free){ - b->size += BLOCK_SIZE + b->next->size; - b->next = b->next->next; - +// Function to merge adjacent free memory blocks +t_block fusion(t_block b) +{ + if (b->next && b->next->free) + { // Check if the next block is free + b->size += BLOCK_SIZE + b->next->size; // Merge the sizes + b->next = b->next->next; // Skip the merged block if (b->next) - b->next->prev = b; + { + b->next->prev = b; // Update the previous pointer of the next block + } } return b; } -t_block extend_heap(t_block last, size_t s){ +// Function to extend the heap by creating a new block +t_block extend_heap(t_block last, size_t s) +{ t_block b; - b = mmap(0, s, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - - if (b == MAP_FAILED){ + b = mmap(0, s, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); // Allocate memory with mmap + + if (b == MAP_FAILED) + { // Check if mmap failed return NULL; } - b->size = s; - b->next = NULL; - b->prev = last; - b->ptr = b->data; - + b->size = s; // Set the size of the block + b->next = NULL; // No next block + b->prev = last; // Link to the last block + b->ptr = b->data; // Pointer to the block's data section + if (last) - last->next = b; - - b->free = 0; + { + last->next = b; // Update the next link of the last block + } + b->free = 0; // Mark the block as allocated return b; } -void get_method(int m){ +// Function to set the allocation method +void get_method(int m) +{ method = m; } -void set_method(int m){ +// Function to set the allocation method +void set_method(int m) +{ method = m; } -void malloc_control(int m){ - if (m == 0) { - set_method(0); - } else if (m == 1) { - set_method(1); - } else { - printf("Error: invalid method\n"); +// Function to control allocation strategies +void malloc_control(int m) +{ + if (m == 0) + { + set_method(0); // First Fit + } + else if (m == 1) + { + set_method(1); // Best Fit + } + else + { + printf("Error: invalid method\n"); // Handle invalid methods } } -void *malloc(size_t size){ +// Function to allocate memory +void* malloc(size_t size) +{ t_block b, last; - size_t s; - s = align(size); + size_t s = align(size); // Align the requested size - if (base){ + if (base) + { // If the heap exists last = base; - b = find_block(&last, s); - if (b) { + b = find_block(&last, s); // Find a suitable block + if (b) + { if ((b->size - s) >= (BLOCK_SIZE + 4)) - split_block(b, s); - b->free = 0; - } else { - b = extend_heap(last, s); + { + split_block(b, s); // Split the block if there's excess space + } + b->free = 0; // Mark the block as allocated + } + else + { + b = extend_heap(last, s); // Extend the heap if no block is found if (!b) - return (NULL); + return NULL; } - } else { + } + else + { // Initialize the heap b = extend_heap(NULL, s); if (!b) - return (NULL); - base = b; + return NULL; + base = b; // Set the base pointer } - return (b->data); + return b->data; // Return a pointer to the allocated space } -void free(void *ptr){ +// Function to free allocated memory +void free(void* ptr) +{ t_block b; - if (valid_addr(ptr)){ - b = get_block(ptr); - b->free = 1; + if (valid_addr(ptr)) + { // Ensure the pointer is valid + b = get_block(ptr); // Get the block associated with the pointer + b->free = 1; // Mark the block as free if (b->next && b->next->free) - fusion(b); + { + fusion(b); // Merge with the next block if it's free + } if (b->prev && b->prev->free) - fusion(b->prev); - else{ - if (b->next) - b->next->prev = b; - if (b->prev) - b->prev->next = b; - else - base = b; - b->free = 1; - b->prev = NULL; + { + fusion(b->prev); // Merge with the previous block if it's free } } } -void *calloc(size_t number, size_t size){ - size_t *new; +// Function to allocate zero-initialized memory +void* calloc(size_t number, size_t size) +{ + size_t* new; size_t s4, i; - if (!number || !size){ - return (NULL); + if (!number || !size) + { + return NULL; } - new = malloc(number * size); - if (new){ + new = malloc(number * size); // Allocate memory + if (new) + { s4 = align(number * size) << 2; for (i = 0; i < s4; i++) - new[i] = 0; + { + new[i] = 0; // Zero-initialize the memory + } } - return (new); + return new; } -void *realloc(void *ptr, size_t size){ +// Function to reallocate memory +void* realloc(void* ptr, size_t size) +{ size_t s; t_block b, new; - void *newp; + void* newp; if (!ptr) - return (malloc(size)); + return malloc(size); // If the pointer is NULL, act like malloc - if (valid_addr(ptr)){ + if (valid_addr(ptr)) + { // Ensure the pointer is valid s = align(size); b = get_block(ptr); - if (b->size >= s){ + if (b->size >= s) + { // If the block is already large enough if (b->size - s >= (BLOCK_SIZE + 4)) - split_block(b, s); - } else { - if (b->next && b->next->free && (b->size + BLOCK_SIZE + b->next->size) >= s){ - fusion(b); + { + split_block(b, s); // Resize the block + } + } + else + { + if (b->next && b->next->free && (b->size + BLOCK_SIZE + b->next->size) >= s) + { + fusion(b); // Merge with the next block if possible if (b->size - s >= (BLOCK_SIZE + 4)) + { split_block(b, s); - } else { - newp = malloc(s); + } + } + else + { + newp = malloc(s); // Allocate a new block if (!newp) - return (NULL); + return NULL; new = get_block(newp); - copy_block(b, new); - free(ptr); - return (newp); + copy_block(b, new); // Copy data to the new block + free(ptr); // Free the old block + return newp; } } - return (ptr); + return ptr; } - return (NULL); + return NULL; } -void check_heap(void *data){ - if (data == NULL){ +// Function to check and display details of a block +void check_heap(void* data) +{ + if (data == NULL) + { printf("Data is NULL\n"); return; } t_block block = get_block(data); - if (block == NULL){ + if (block == NULL) + { printf("Block is NULL\n"); return; } @@ -245,26 +318,35 @@ void check_heap(void *data){ printf("\033[1;33mHeap check\033[0m\n"); printf("Size: %zu\n", block->size); - if (block->next != NULL) { - printf("Next block: %p\n", (void *)(block->next)); - } else { + if (block->next != NULL) + { + printf("Next block: %p\n", (void*)(block->next)); + } + else + { printf("Next block: NULL\n"); } - if (block->prev != NULL){ - printf("Prev block: %p\n", (void *)(block->prev)); - } else { + if (block->prev != NULL) + { + printf("Prev block: %p\n", (void*)(block->prev)); + } + else + { printf("Prev block: NULL\n"); } printf("Free: %d\n", block->free); - if (block->ptr != NULL){ + if (block->ptr != NULL) + { printf("Beginning data address: %p\n", block->ptr); - printf("Last data address: %p\n", (void *)((char *)(block->ptr) + block->size)); - } else { + printf("Last data address: %p\n", (void*)((char*)(block->ptr) + block->size)); + } + else + { printf("Data address: NULL\n"); } printf("Heap address: %p\n", sbrk(0)); -} \ No newline at end of file +} From a32654ef4aa0e9fa4136885b6ebf491c58e9b419 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Mon, 25 Nov 2024 13:35:14 -0300 Subject: [PATCH 03/21] Moving files --- .gitignore | 1 + lib/memory/CMakeLists.txt => CMakeLists.txt | 0 {lib/memory/include => include}/memory.h | 0 {lib/memory/src => src}/memory.c | 0 4 files changed, 1 insertion(+) rename lib/memory/CMakeLists.txt => CMakeLists.txt (100%) rename {lib/memory/include => include}/memory.h (100%) rename {lib/memory/src => src}/memory.c (100%) diff --git a/.gitignore b/.gitignore index 9049d53..9801a16 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,4 @@ dkms.conf # VSCode files .vscode/ +build/ diff --git a/lib/memory/CMakeLists.txt b/CMakeLists.txt similarity index 100% rename from lib/memory/CMakeLists.txt rename to CMakeLists.txt diff --git a/lib/memory/include/memory.h b/include/memory.h similarity index 100% rename from lib/memory/include/memory.h rename to include/memory.h diff --git a/lib/memory/src/memory.c b/src/memory.c similarity index 100% rename from lib/memory/src/memory.c rename to src/memory.c From e0a5806024cbfcdaf8038a3cea9bd34e9ebd481c Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Mon, 25 Nov 2024 16:23:46 -0300 Subject: [PATCH 04/21] Rearranging files --- CMakeLists.txt | 19 ++++++++++--------- include/memory.h | 1 + src/memory.c | 3 +-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f7bf7cc..2dd2263 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,16 +1,17 @@ cmake_minimum_required(VERSION 3.10) # Set the project name -project(memory) +project( + memory + LANGUAGES C +) include_directories(include) -# Add the library -add_library(memory STATIC - src/memory.c -) +# Flags for compiling +set(CMAKE_C_STANDARD 17) +set(CMAKE_C_FLAGS_RELEASE "-O0 -Wall -Wextra -Wpedantic -Werror -Wunused-parameter -Wmissing-prototypes -Wstrict-prototypes") +set(CMAKE_C_FLAGS_DEBUG "-g -O0 -fprofile-arcs -ftest-coverage -Wall -Wextra -Wpedantic -Werror -Wunused-parameter -Wmissing-prototypes -Wstrict-prototypes") -# Set C++ standard -set_target_properties(memory PROPERTIES - C_STANDARD 17 -) \ No newline at end of file +# Add executable for the main project +add_executable(${PROJECT_NAME} src/main.c src/memory.c) \ No newline at end of file diff --git a/include/memory.h b/include/memory.h index 26b7a43..30fc71d 100644 --- a/include/memory.h +++ b/include/memory.h @@ -12,6 +12,7 @@ #include #include #include +#include // Memory management functions (e.g., mmap) /** * @brief Macro para alinear una cantidad de bytes al siguiente múltiplo de 8. diff --git a/src/memory.c b/src/memory.c index 669caaa..f81b288 100644 --- a/src/memory.c +++ b/src/memory.c @@ -1,5 +1,4 @@ -#include "lib/memory/include/memory.h" // Custom memory management header -#include // Memory management functions (e.g., mmap) +#include "../include/memory.h" // Custom memory management header // Typedef for memory block structure typedef struct s_block* t_block; From 5a74233e7fde2dda3a03bcdb69807c50c4a3dbfd Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Mon, 25 Nov 2024 17:12:24 -0300 Subject: [PATCH 05/21] Separated in multiple modules --- .gitignore | 3 + include/calloc.h | 10 ++ include/free.h | 32 +++++ include/malloc.h | 35 ++++++ include/memory.h | 131 +++------------------ include/realloc.h | 18 +++ src/calloc.c | 25 ++++ src/free.c | 75 ++++++++++++ src/main.c | 49 ++++++++ src/malloc.c | 124 +++++++++++++++++++ src/memory.c | 294 ---------------------------------------------- src/realloc.c | 64 ++++++++++ 12 files changed, 452 insertions(+), 408 deletions(-) create mode 100644 include/calloc.h create mode 100644 include/free.h create mode 100644 include/malloc.h create mode 100644 include/realloc.h create mode 100644 src/calloc.c create mode 100644 src/free.c create mode 100644 src/main.c create mode 100644 src/malloc.c create mode 100644 src/realloc.c diff --git a/.gitignore b/.gitignore index 9801a16..15f7ef6 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,6 @@ dkms.conf # VSCode files .vscode/ build/ + +# Personal files +used-cmds.md diff --git a/include/calloc.h b/include/calloc.h new file mode 100644 index 0000000..9dfea72 --- /dev/null +++ b/include/calloc.h @@ -0,0 +1,10 @@ +#include "include/memory.h" + +/** + * @brief Asigna un bloque de memoria para un número de elementos, inicializándolo a cero. + * + * @param number Número de elementos. + * @param size Tamaño de cada elemento. + * @return void* Puntero al área de datos asignada e inicializada. + */ +void* calloc(size_t number, size_t size); \ No newline at end of file diff --git a/include/free.h b/include/free.h new file mode 100644 index 0000000..7a29fc3 --- /dev/null +++ b/include/free.h @@ -0,0 +1,32 @@ +#include "include/memory.h" + +/** + * @brief Fusiona un bloque libre con su siguiente bloque si también está libre. + * + * @param b Bloque a fusionar. + * @return t_block Puntero al bloque fusionado. + */ +t_block fusion(t_block b); + +/** + * @brief Obtiene el bloque que contiene una dirección de memoria dada. + * + * @param p Puntero a la dirección de datos. + * @return t_block Puntero al bloque de memoria correspondiente. + */ +t_block get_block(void* p); + +/** + * @brief Verifica si una dirección de memoria es válida. + * + * @param p Dirección de memoria a verificar. + * @return int Retorna 1 si la dirección es válida, 0 en caso contrario. + */ +int valid_addr(void* p); + +/** + * @brief Libera un bloque de memoria previamente asignado. + * + * @param p Puntero al área de datos a liberar. + */ +void free(void* p); \ No newline at end of file diff --git a/include/malloc.h b/include/malloc.h new file mode 100644 index 0000000..57e8c1f --- /dev/null +++ b/include/malloc.h @@ -0,0 +1,35 @@ +#include "include/memory.h" + +/** + * @brief Encuentra un bloque libre que tenga al menos el tamaño solicitado. + * + * @param last Puntero al último bloque. + * @param size Tamaño solicitado. + * @return t_block Puntero al bloque encontrado, o NULL si no se encuentra ninguno. + */ +t_block find_block(t_block* last, size_t size); + +/** + * @brief Divide un bloque de memoria en dos, si el tamaño solicitado es menor que el bloque disponible. + * + * @param b Bloque a dividir. + * @param s Tamaño del nuevo bloque. + */ +void split_block(t_block b, size_t s); + +/** + * @brief Expande el heap para crear un nuevo bloque de memoria. + * + * @param last Último bloque del heap. + * @param s Tamaño del nuevo bloque. + * @return t_block Puntero al nuevo bloque creado. + */ +t_block extend_heap(t_block last, size_t s); + +/** + * @brief Asigna un bloque de memoria del tamaño solicitado. + * + * @param size Tamaño en bytes del bloque a asignar. + * @return void* Puntero al área de datos asignada. + */ +void* malloc(size_t size); diff --git a/include/memory.h b/include/memory.h index 30fc71d..074f142 100644 --- a/include/memory.h +++ b/include/memory.h @@ -10,16 +10,16 @@ #include #include -#include +#include // Memory management functions (e.g., mmap) #include -#include // Memory management functions (e.g., mmap) +#include /** * @brief Macro para alinear una cantidad de bytes al siguiente múltiplo de 8. - * + * * @param x Cantidad de bytes a alinear. */ -#define align(x) (((((x)-1) >> 3) << 3) + 8) +#define align(x) (((((x) - 1) >> 3) << 3) + 8) /** Tamaño mínimo de un bloque de memoria. */ #define BLOCK_SIZE 40 @@ -32,126 +32,29 @@ /** Tamaño del bloque */ #define DATA_START 1 +/** Tipo de puntero para un bloque de memoria. */ +typedef struct s_block* t_block; + /** * @struct s_block * @brief Estructura para representar un bloque de memoria. * - * Contiene la información necesaria para gestionar la asignación y + * Contiene la información necesaria para gestionar la asignación y * liberación de un bloque de memoria. */ -struct s_block { - size_t size; /**< Tamaño del bloque de datos. */ - struct s_block *next; /**< Puntero al siguiente bloque en la lista enlazada. */ - struct s_block *prev; /**< Puntero al bloque anterior en la lista enlazada. */ - int free; /**< Indicador de si el bloque está libre (1) o ocupado (0). */ - void *ptr; /**< Puntero a la dirección de los datos almacenados. */ - char data[DATA_START]; /**< Área donde comienzan los datos del bloque. */ +struct s_block +{ + int free; /**< Indicador de si el bloque está libre (1) o ocupado (0). */ + size_t size; /**< Tamaño del bloque de datos. */ + t_block next; /**< Puntero al siguiente bloque en la lista enlazada. */ + t_block prev; /**< Puntero al bloque anterior en la lista enlazada. */ + void* ptr; /**< Puntero a la dirección de los datos almacenados. */ + char data[DATA_START]; /**< Área donde comienzan los datos del bloque. */ }; -/** Tipo de puntero para un bloque de memoria. */ -typedef struct s_block *t_block; - -/** - * @brief Obtiene el bloque que contiene una dirección de memoria dada. - * - * @param p Puntero a la dirección de datos. - * @return t_block Puntero al bloque de memoria correspondiente. - */ -t_block get_block(void *p); - -/** - * @brief Verifica si una dirección de memoria es válida. - * - * @param p Dirección de memoria a verificar. - * @return int Retorna 1 si la dirección es válida, 0 en caso contrario. - */ -int valid_addr(void *p); - -/** - * @brief Encuentra un bloque libre que tenga al menos el tamaño solicitado. - * - * @param last Puntero al último bloque. - * @param size Tamaño solicitado. - * @return t_block Puntero al bloque encontrado, o NULL si no se encuentra ninguno. - */ -t_block find_block(t_block *last, size_t size); - -/** - * @brief Expande el heap para crear un nuevo bloque de memoria. - * - * @param last Último bloque del heap. - * @param s Tamaño del nuevo bloque. - * @return t_block Puntero al nuevo bloque creado. - */ -t_block extend_heap(t_block last, size_t s); - -/** - * @brief Divide un bloque de memoria en dos, si el tamaño solicitado es menor que el bloque disponible. - * - * @param b Bloque a dividir. - * @param s Tamaño del nuevo bloque. - */ -void split_block(t_block b, size_t s); - -/** - * @brief Fusiona un bloque libre con su siguiente bloque si también está libre. - * - * @param b Bloque a fusionar. - * @return t_block Puntero al bloque fusionado. - */ -t_block fusion(t_block b); - -/** - * @brief Copia el contenido de un bloque de origen a un bloque de destino. - * - * @param src Bloque de origen. - * @param dst Bloque de destino. - */ -void copy_block(t_block src, t_block dst); - -/** - * @brief Asigna un bloque de memoria del tamaño solicitado. - * - * @param size Tamaño en bytes del bloque a asignar. - * @return void* Puntero al área de datos asignada. - */ -void *malloc(size_t size); - -/** - * @brief Libera un bloque de memoria previamente asignado. - * - * @param p Puntero al área de datos a liberar. - */ -void free(void *p); - -/** - * @brief Asigna un bloque de memoria para un número de elementos, inicializándolo a cero. - * - * @param number Número de elementos. - * @param size Tamaño de cada elemento. - * @return void* Puntero al área de datos asignada e inicializada. - */ -void *calloc(size_t number, size_t size); - -/** - * @brief Cambia el tamaño de un bloque de memoria previamente asignado. - * - * @param p Puntero al área de datos a redimensionar. - * @param size Nuevo tamaño en bytes. - * @return void* Puntero al área de datos redimensionada. - */ -void *realloc(void *p, size_t size); - /** * @brief Verifica el estado del heap y detecta bloques libres consecutivos. * * @param data Información adicional para la verificación. */ -void check_heap(void *data); - -/** - * @brief Configura el modo de asignación de memoria (First Fit o Best Fit). - * - * @param mode Modo de asignación (0 para First Fit, 1 para Best Fit). - */ -void malloc_control(int mode); \ No newline at end of file +void check_heap(void* data); diff --git a/include/realloc.h b/include/realloc.h new file mode 100644 index 0000000..ae2be0f --- /dev/null +++ b/include/realloc.h @@ -0,0 +1,18 @@ +#include "include/memory.h" + +/** + * @brief Copia el contenido de un bloque de origen a un bloque de destino. + * + * @param src Bloque de origen. + * @param dst Bloque de destino. + */ +void copy_block(t_block src, t_block dst); + +/** + * @brief Cambia el tamaño de un bloque de memoria previamente asignado. + * + * @param p Puntero al área de datos a redimensionar. + * @param size Nuevo tamaño en bytes. + * @return void* Puntero al área de datos redimensionada. + */ +void* realloc(void* p, size_t size); diff --git a/src/calloc.c b/src/calloc.c new file mode 100644 index 0000000..e153e84 --- /dev/null +++ b/src/calloc.c @@ -0,0 +1,25 @@ +#include "include/calloc.h" + +// Function to allocate zero-initialized memory +void* calloc(size_t number, size_t size) +{ + size_t* new; + size_t s, i; + + if (!number || !size) + { + return NULL; + } + + new = malloc(number * size); // Allocate memory + + if (new) + { + s = align(number * size) << 2; + for (i = 0; i < s; i++) + { + new[i] = 0; // Zero-initialize the memory + } + } + return new; +} \ No newline at end of file diff --git a/src/free.c b/src/free.c new file mode 100644 index 0000000..ce23372 --- /dev/null +++ b/src/free.c @@ -0,0 +1,75 @@ +#include "include/free.h" + +extern base; + +// Function to merge adjacent free memory blocks +t_block fusion(t_block b) +{ + if (b->next && b->next->free) + { // Check if the next block is free + b->size += BLOCK_SIZE + b->next->size; // Merge the sizes + b->next = b->next->next; // Skip the merged block + } + if (b->next) + { + b->next->prev = b; // Update the previous pointer of the next block + } + return b; +} + +// Function to get the block associated with a pointer +t_block get_block(void* p) +{ + char* tmp = p; // Convert to a character pointer + + if (tmp >= (char*)base + BLOCK_SIZE) + { // Ensure the pointer is within the heap range + tmp -= BLOCK_SIZE; // Move to the block metadata + } + return (t_block)(tmp); // Return the block +} + +// Function to check if a pointer is valid and part of the heap +int valid_addr(void* p) +{ + if (base) + { // Ensure the heap exists + if (p > base && p < sbrk(0)) + { // Check if the pointer is within the heap range + return (p == get_block(p)->ptr); // Validate the pointer + } + } + return (0); // Invalid pointer +} + +// Function to free allocated memory +void free(void* ptr) +{ + if (valid_addr(ptr)) + { // Ensure the pointer is valid + t_block b = get_block(ptr); // Get the block associated with the pointer + b->free = 1; // Mark the block as free + + if (b->prev && b->prev->free) + { + b = fusion(b->prev); // Merge with the previous block if it's free + } + + if (b->next && b->next->free) + { + b = fusion(b); // Merge with the next block if it's free + } + else + { + if (b->prev) + { + b->prev->next = NULL; + } + else + { + base = NULL; + } + brk(b); + } + } +} \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..ede8866 --- /dev/null +++ b/src/main.c @@ -0,0 +1,49 @@ +#include "../include/memory.h" + +/* + * Testing code to test all the functions implemented. + * First two new variables are created and allocated space using malloc() + * Then the first varaible is freed and malloc() is called again to show that space can be reused. + * Then calloc() is used to allocate an int array of size 5. Initially the values will be set to 0 by calloc(); + * Then the array is resized to size 10 using realloc() + */ + +int main(void){ + + printf("\n\n"); + + printf("Initializing first variable : "); + int *a = (int*)malloc(sizeof(int)); + *a = 5; + printf("%p -> %d \n\n",(void*)a,*a); + + printf("Initializing second variable : "); + int *b = (int*)malloc(sizeof(int)); + *b = 10; + printf("%p -> %d \n\n",(void*)b,*b); + + + free(a); + printf("Freeing first variable and using that memory block again using malloc() for third variable: "); + int *c = (int*)malloc(sizeof(int)); + printf("%p -> %d \n\n",(void*)c,*c); + + printf("Initializing int array of size 5 using calloc() : "); + int *arr = (int*)calloc(sizeof(int),5); + printf("%p -> ",(void*)arr); + for(int i=0; i<5; i++){ + printf(" %d ", *(arr+i)); + } + printf("\n\n"); + + printf("Resizing it to size 10 using realloc(): "); + arr = (int*)realloc(arr, 10); + printf("%p -> ",(void*)arr); + for(int i=0; i<10; i++){ + printf(" %d ", *(arr+i)); + } + + printf("\n\n"); + + return 0; +} \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c new file mode 100644 index 0000000..a14b760 --- /dev/null +++ b/src/malloc.c @@ -0,0 +1,124 @@ +#include "include/malloc.h" + +extern base; +extern method; + +// Function to find a suitable memory block based on the allocation method +t_block find_block(t_block* last, size_t size) +{ + t_block b = base; + + if (method == FIRST_FIT) + { // First Fit strategy + while (b && !(b->free && b->size >= size)) + { // Look for the first block large enough and free + *last = b; // Update the last block traversed + b = b->next; // Move to the next block + } + return (b); // Return the found block or NULL + } + else + { // Best Fit strategy + size_t dif = PAGESIZE; // Difference between the requested size and the block size + t_block best = NULL; // Pointer to the best-fit block + + while (b) + { + if (b->free) + { // If the block is free + if (b->size == size) + { // Perfect match + return b; + } + if (b->size > size && (b->size - size) < dif) + { // Smaller difference is better + dif = b->size - size; + best = b; + } + } + *last = b; // Update the last traversed block + b = b->next; // Move to the next block + } + return best; // Return the best-fit block or NULL + } +} + +// Function to split a memory block into two +void split_block(t_block b, size_t s) +{ + if (b->size <= s + BLOCK_SIZE) + { // Check if the block can be split + return; + } + + t_block new; // Create a new block for the leftover memory + new = (t_block)(b->data + s); // Assign the new block after the allocated space + new->size = b->size - s - BLOCK_SIZE; // Adjust size for the new block + new->next = b->next; // Link the new block to the next block + new->free = 1; // Mark the new block as free + new->ptr = new->data; + new->prev = b; + b->next = new; // Update the next link of the original block + b->size = s; // Resize the original block + if (new->next) + { + new->next->prev = new; + } +} + +// Function to extend the heap by creating a new block +t_block extend_heap(t_block last, size_t s) +{ + t_block old_break, new_break; + old_break = sbrk(0); + new_break = sbrk(BLOCK_SIZE + s); + if (new_break == (void *)-1) + { + return NULL; + } + old_break->size = s; + old_break->free = 0; + old_break->next = NULL; + old_break->prev = NULL; + old_break->ptr = old_break->data; + if (last) + { + last->next = old_break; + } + return (old_break); +} + +// Function to allocate memory +void* malloc(size_t size) +{ + t_block b, last; + size_t s = align(size); // Align the requested size + + if (base) + { // If the heap exists + last = base; + b = find_block(&last, s); // Find a suitable block + if (b) + { + if ((b->size - s) >= (BLOCK_SIZE + 4)) + { + split_block(b, s); // Split the block if there's excess space + } + b->free = 0; // Mark the block as allocated + } + else + { + b = extend_heap(last, s); // Extend the heap if no block is found + if (!b) + return NULL; + } + } + else + { // Initialize the heap + b = extend_heap(NULL, s); + if (!b) + return NULL; + base = b; // Set the base pointer + } + return b->data; // Return a pointer to the allocated space +} \ No newline at end of file diff --git a/src/memory.c b/src/memory.c index f81b288..0f8f957 100644 --- a/src/memory.c +++ b/src/memory.c @@ -1,302 +1,8 @@ #include "../include/memory.h" // Custom memory management header -// Typedef for memory block structure -typedef struct s_block* t_block; void* base = NULL; // Pointer to the beginning of the heap int method = 0; // Memory allocation method (0 = First Fit, 1 = Best Fit) -// Function to find a suitable memory block based on the allocation method -t_block find_block(t_block* last, size_t size) -{ - t_block b = base; - - if (method == FIRST_FIT) - { // First Fit strategy - while (b && !(b->free && b->size >= size)) - { // Look for the first block large enough and free - *last = b; // Update the last block traversed - b = b->next; // Move to the next block - } - return (b); // Return the found block or NULL - } - else - { // Best Fit strategy - size_t dif = PAGESIZE; // Difference between the requested size and the block size - t_block best = NULL; // Pointer to the best-fit block - - while (b) - { - if (b->free) - { // If the block is free - if (b->size == size) - { // Perfect match - return b; - } - if (b->size > size && (b->size - size) < dif) - { // Smaller difference is better - dif = b->size - size; - best = b; - } - } - *last = b; // Update the last traversed block - b = b->next; // Move to the next block - } - return best; // Return the best-fit block or NULL - } -} - -// Function to split a memory block into two -void split_block(t_block b, size_t s) -{ - if (b->size <= s + BLOCK_SIZE) - { // Check if the block can be split - return; - } - - t_block new; // Create a new block for the leftover memory - new = (t_block)(b->data + s); // Assign the new block after the allocated space - new->size = b->size - s - BLOCK_SIZE; // Adjust size for the new block - new->next = b->next; // Link the new block to the next block - new->free = 1; // Mark the new block as free - b->size = s; // Resize the original block - b->next = new; // Update the next link of the original block -} - -// Function to copy data from one block to another -void copy_block(t_block src, t_block dst) -{ - int *sdata, *ddata; - size_t i; - - sdata = src->ptr; // Source data pointer - ddata = dst->ptr; // Destination data pointer - - // Copy data from the source block to the destination block - for (i = 0; (i * 4) < src->size && (i * 4) < dst->size; i++) - { - ddata[i] = sdata[i]; - } -} - -// Function to get the block associated with a pointer -t_block get_block(void* p) -{ - char* tmp = p; // Convert to a character pointer - - if (tmp >= (char*)base + BLOCK_SIZE) - { // Ensure the pointer is within the heap range - tmp -= BLOCK_SIZE; // Move to the block metadata - } - return (t_block)(tmp); // Return the block -} - -// Function to check if a pointer is valid and part of the heap -int valid_addr(void* p) -{ - if (base) - { // Ensure the heap exists - if (p > base && p < sbrk(0)) - { // Check if the pointer is within the heap range - t_block b = get_block(p); // Get the block associated with the pointer - return b && (p == b->ptr); // Validate the pointer - } - } - return (0); // Invalid pointer -} - -// Function to merge adjacent free memory blocks -t_block fusion(t_block b) -{ - if (b->next && b->next->free) - { // Check if the next block is free - b->size += BLOCK_SIZE + b->next->size; // Merge the sizes - b->next = b->next->next; // Skip the merged block - if (b->next) - { - b->next->prev = b; // Update the previous pointer of the next block - } - } - return b; -} - -// Function to extend the heap by creating a new block -t_block extend_heap(t_block last, size_t s) -{ - t_block b; - b = mmap(0, s, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); // Allocate memory with mmap - - if (b == MAP_FAILED) - { // Check if mmap failed - return NULL; - } - b->size = s; // Set the size of the block - b->next = NULL; // No next block - b->prev = last; // Link to the last block - b->ptr = b->data; // Pointer to the block's data section - - if (last) - { - last->next = b; // Update the next link of the last block - } - b->free = 0; // Mark the block as allocated - return b; -} - -// Function to set the allocation method -void get_method(int m) -{ - method = m; -} - -// Function to set the allocation method -void set_method(int m) -{ - method = m; -} - -// Function to control allocation strategies -void malloc_control(int m) -{ - if (m == 0) - { - set_method(0); // First Fit - } - else if (m == 1) - { - set_method(1); // Best Fit - } - else - { - printf("Error: invalid method\n"); // Handle invalid methods - } -} - -// Function to allocate memory -void* malloc(size_t size) -{ - t_block b, last; - size_t s = align(size); // Align the requested size - - if (base) - { // If the heap exists - last = base; - b = find_block(&last, s); // Find a suitable block - if (b) - { - if ((b->size - s) >= (BLOCK_SIZE + 4)) - { - split_block(b, s); // Split the block if there's excess space - } - b->free = 0; // Mark the block as allocated - } - else - { - b = extend_heap(last, s); // Extend the heap if no block is found - if (!b) - return NULL; - } - } - else - { // Initialize the heap - b = extend_heap(NULL, s); - if (!b) - return NULL; - base = b; // Set the base pointer - } - return b->data; // Return a pointer to the allocated space -} - -// Function to free allocated memory -void free(void* ptr) -{ - t_block b; - - if (valid_addr(ptr)) - { // Ensure the pointer is valid - b = get_block(ptr); // Get the block associated with the pointer - b->free = 1; // Mark the block as free - - if (b->next && b->next->free) - { - fusion(b); // Merge with the next block if it's free - } - if (b->prev && b->prev->free) - { - fusion(b->prev); // Merge with the previous block if it's free - } - } -} - -// Function to allocate zero-initialized memory -void* calloc(size_t number, size_t size) -{ - size_t* new; - size_t s4, i; - - if (!number || !size) - { - return NULL; - } - new = malloc(number * size); // Allocate memory - if (new) - { - s4 = align(number * size) << 2; - for (i = 0; i < s4; i++) - { - new[i] = 0; // Zero-initialize the memory - } - } - return new; -} - -// Function to reallocate memory -void* realloc(void* ptr, size_t size) -{ - size_t s; - t_block b, new; - void* newp; - - if (!ptr) - return malloc(size); // If the pointer is NULL, act like malloc - - if (valid_addr(ptr)) - { // Ensure the pointer is valid - s = align(size); - b = get_block(ptr); - - if (b->size >= s) - { // If the block is already large enough - if (b->size - s >= (BLOCK_SIZE + 4)) - { - split_block(b, s); // Resize the block - } - } - else - { - if (b->next && b->next->free && (b->size + BLOCK_SIZE + b->next->size) >= s) - { - fusion(b); // Merge with the next block if possible - if (b->size - s >= (BLOCK_SIZE + 4)) - { - split_block(b, s); - } - } - else - { - newp = malloc(s); // Allocate a new block - if (!newp) - return NULL; - new = get_block(newp); - copy_block(b, new); // Copy data to the new block - free(ptr); // Free the old block - return newp; - } - } - return ptr; - } - return NULL; -} - // Function to check and display details of a block void check_heap(void* data) { diff --git a/src/realloc.c b/src/realloc.c new file mode 100644 index 0000000..95a0f08 --- /dev/null +++ b/src/realloc.c @@ -0,0 +1,64 @@ +#include "include/realloc.h" + +// Function to copy data from one block to another +void copy_block(t_block src, t_block dst) +{ + size_t i; + + int *sdata = src->ptr; // Source data pointer + int *ddata = dst->ptr; // Destination data pointer + + // Copy data from the source block to the destination block + for (i = 0; (i * 4) < src->size && (i * 4) < dst->size; i++) + { + ddata[i] = sdata[i]; + } +} + +// Function to reallocate memory +void* realloc(void* ptr, size_t size) +{ + size_t s; + t_block b, new; + void* newp; + + if (!ptr) + return malloc(size); // If the pointer is NULL, act like malloc + + if (valid_addr(ptr)) + { // Ensure the pointer is valid + s = align(size); + b = get_block(ptr); + + if (b->size >= s) + { // If the block is already large enough + if (b->size >= (BLOCK_SIZE + 4)) + { + split_block(b, s); // Resize the block + } + } + else + { + if (b->next && b->next->free && (b->size + BLOCK_SIZE + b->next->size) >= s) + { + fusion(b); // Merge with the next block if possible + if (b->size - s >= (BLOCK_SIZE + 4)) + { + split_block(b, s); + } + } + else + { + newp = malloc(s); // Allocate a new block + if (!newp) + return NULL; + new = get_block(newp); + copy_block(b, new); // Copy data to the new block + free(ptr); // Free the old block + return newp; + } + } + return ptr; + } + return NULL; +} \ No newline at end of file From 9438c4550b2b46069bff77dc65df71964f7eaf46 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Mon, 25 Nov 2024 17:29:50 -0300 Subject: [PATCH 06/21] Testing changes --- include/calloc.h | 2 +- include/free.h | 10 +--------- include/malloc.h | 2 +- include/memory.h | 10 +++++++++- include/realloc.h | 2 +- src/free.c | 14 +------------- src/main.c | 8 +++++++- src/memory.c | 12 ++++++++++++ src/realloc.c | 2 +- 9 files changed, 34 insertions(+), 28 deletions(-) diff --git a/include/calloc.h b/include/calloc.h index 9dfea72..66b51f4 100644 --- a/include/calloc.h +++ b/include/calloc.h @@ -1,4 +1,4 @@ -#include "include/memory.h" +#include "../include/memory.h" /** * @brief Asigna un bloque de memoria para un número de elementos, inicializándolo a cero. diff --git a/include/free.h b/include/free.h index 7a29fc3..baeb6cc 100644 --- a/include/free.h +++ b/include/free.h @@ -1,4 +1,4 @@ -#include "include/memory.h" +#include "../include/memory.h" /** * @brief Fusiona un bloque libre con su siguiente bloque si también está libre. @@ -8,14 +8,6 @@ */ t_block fusion(t_block b); -/** - * @brief Obtiene el bloque que contiene una dirección de memoria dada. - * - * @param p Puntero a la dirección de datos. - * @return t_block Puntero al bloque de memoria correspondiente. - */ -t_block get_block(void* p); - /** * @brief Verifica si una dirección de memoria es válida. * diff --git a/include/malloc.h b/include/malloc.h index 57e8c1f..21114ca 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -1,4 +1,4 @@ -#include "include/memory.h" +#include "../include/memory.h" /** * @brief Encuentra un bloque libre que tenga al menos el tamaño solicitado. diff --git a/include/memory.h b/include/memory.h index 074f142..681f2f9 100644 --- a/include/memory.h +++ b/include/memory.h @@ -19,7 +19,7 @@ * * @param x Cantidad de bytes a alinear. */ -#define align(x) (((((x) - 1) >> 3) << 3) + 8) +#define align(x) (((((x)-1) >> 2) << 2) + 4) /** Tamaño mínimo de un bloque de memoria. */ #define BLOCK_SIZE 40 @@ -52,6 +52,14 @@ struct s_block char data[DATA_START]; /**< Área donde comienzan los datos del bloque. */ }; +/** + * @brief Obtiene el bloque que contiene una dirección de memoria dada. + * + * @param p Puntero a la dirección de datos. + * @return t_block Puntero al bloque de memoria correspondiente. + */ +t_block get_block(void* p); + /** * @brief Verifica el estado del heap y detecta bloques libres consecutivos. * diff --git a/include/realloc.h b/include/realloc.h index ae2be0f..0d939ef 100644 --- a/include/realloc.h +++ b/include/realloc.h @@ -1,4 +1,4 @@ -#include "include/memory.h" +#include "../include/memory.h" /** * @brief Copia el contenido de un bloque de origen a un bloque de destino. diff --git a/src/free.c b/src/free.c index ce23372..c637456 100644 --- a/src/free.c +++ b/src/free.c @@ -1,4 +1,4 @@ -#include "include/free.h" +#include "../include/free.h" extern base; @@ -17,18 +17,6 @@ t_block fusion(t_block b) return b; } -// Function to get the block associated with a pointer -t_block get_block(void* p) -{ - char* tmp = p; // Convert to a character pointer - - if (tmp >= (char*)base + BLOCK_SIZE) - { // Ensure the pointer is within the heap range - tmp -= BLOCK_SIZE; // Move to the block metadata - } - return (t_block)(tmp); // Return the block -} - // Function to check if a pointer is valid and part of the heap int valid_addr(void* p) { diff --git a/src/main.c b/src/main.c index ede8866..2dbdbcf 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,8 @@ #include "../include/memory.h" +#include "../include/calloc.h" +#include "../include/malloc.h" +#include "../include/realloc.h" +#include "../include/free.h" /* * Testing code to test all the functions implemented. @@ -22,7 +26,6 @@ int main(void){ *b = 10; printf("%p -> %d \n\n",(void*)b,*b); - free(a); printf("Freeing first variable and using that memory block again using malloc() for third variable: "); int *c = (int*)malloc(sizeof(int)); @@ -42,6 +45,9 @@ int main(void){ for(int i=0; i<10; i++){ printf(" %d ", *(arr+i)); } + free(c); + free(b); + free(arr); printf("\n\n"); diff --git a/src/memory.c b/src/memory.c index 0f8f957..fa121c6 100644 --- a/src/memory.c +++ b/src/memory.c @@ -3,6 +3,18 @@ void* base = NULL; // Pointer to the beginning of the heap int method = 0; // Memory allocation method (0 = First Fit, 1 = Best Fit) +// Function to get the block associated with a pointer +t_block get_block(void* p) +{ + char* tmp = p; // Convert to a character pointer + + if (tmp >= (char*)base + BLOCK_SIZE) + { // Ensure the pointer is within the heap range + tmp -= BLOCK_SIZE; // Move to the block metadata + } + return (t_block)(tmp); // Return the block +} + // Function to check and display details of a block void check_heap(void* data) { diff --git a/src/realloc.c b/src/realloc.c index 95a0f08..508d398 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -1,4 +1,4 @@ -#include "include/realloc.h" +#include "../include/realloc.h" // Function to copy data from one block to another void copy_block(t_block src, t_block dst) From e4dcbd69adcbb0827f058aa3bf0a476ad1110b67 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Mon, 25 Nov 2024 17:39:10 -0300 Subject: [PATCH 07/21] Test is working for given files --- include/memory.h | 8 ++-- src/calloc.c | 18 ++++---- src/free.c | 52 +++++++++++------------- src/main.c | 66 ++++++++++++++++++++++-------- src/malloc.c | 104 ++++++++++++++++++++++------------------------- src/memory.c | 9 ++-- src/realloc.c | 39 ++++++++---------- 7 files changed, 154 insertions(+), 142 deletions(-) diff --git a/include/memory.h b/include/memory.h index 681f2f9..34f8f45 100644 --- a/include/memory.h +++ b/include/memory.h @@ -19,7 +19,7 @@ * * @param x Cantidad de bytes a alinear. */ -#define align(x) (((((x)-1) >> 2) << 2) + 4) +#define align(x) (((((x) - 1) >> 3) << 3) + 8) /** Tamaño mínimo de un bloque de memoria. */ #define BLOCK_SIZE 40 @@ -44,10 +44,10 @@ typedef struct s_block* t_block; */ struct s_block { - int free; /**< Indicador de si el bloque está libre (1) o ocupado (0). */ size_t size; /**< Tamaño del bloque de datos. */ - t_block next; /**< Puntero al siguiente bloque en la lista enlazada. */ - t_block prev; /**< Puntero al bloque anterior en la lista enlazada. */ + struct s_block* next; /**< Puntero al siguiente bloque en la lista enlazada. */ + struct s_block* prev; /**< Puntero al bloque anterior en la lista enlazada. */ + int free; /**< Indicador de si el bloque está libre (1) o ocupado (0). */ void* ptr; /**< Puntero a la dirección de los datos almacenados. */ char data[DATA_START]; /**< Área donde comienzan los datos del bloque. */ }; diff --git a/src/calloc.c b/src/calloc.c index e153e84..b242e34 100644 --- a/src/calloc.c +++ b/src/calloc.c @@ -4,22 +4,18 @@ void* calloc(size_t number, size_t size) { size_t* new; - size_t s, i; + size_t s4, i; if (!number || !size) { - return NULL; + return (NULL); } - - new = malloc(number * size); // Allocate memory - + new = malloc(number * size); if (new) { - s = align(number * size) << 2; - for (i = 0; i < s; i++) - { - new[i] = 0; // Zero-initialize the memory - } + s4 = align(number * size) << 2; + for (i = 0; i < s4; i++) + new[i] = 0; } - return new; + return (new); } \ No newline at end of file diff --git a/src/free.c b/src/free.c index c637456..b6247f1 100644 --- a/src/free.c +++ b/src/free.c @@ -6,13 +6,12 @@ extern base; t_block fusion(t_block b) { if (b->next && b->next->free) - { // Check if the next block is free - b->size += BLOCK_SIZE + b->next->size; // Merge the sizes - b->next = b->next->next; // Skip the merged block - } - if (b->next) { - b->next->prev = b; // Update the previous pointer of the next block + b->size += BLOCK_SIZE + b->next->size; + b->next = b->next->next; + + if (b->next) + b->next->prev = b; } return b; } @@ -21,43 +20,40 @@ t_block fusion(t_block b) int valid_addr(void* p) { if (base) - { // Ensure the heap exists + { if (p > base && p < sbrk(0)) - { // Check if the pointer is within the heap range - return (p == get_block(p)->ptr); // Validate the pointer + { + t_block b = get_block(p); + return b && (p == b->ptr); } } - return (0); // Invalid pointer + return (0); } // Function to free allocated memory void free(void* ptr) { - if (valid_addr(ptr)) - { // Ensure the pointer is valid - t_block b = get_block(ptr); // Get the block associated with the pointer - b->free = 1; // Mark the block as free + t_block b; - if (b->prev && b->prev->free) - { - b = fusion(b->prev); // Merge with the previous block if it's free - } + if (valid_addr(ptr)) + { + b = get_block(ptr); + b->free = 1; if (b->next && b->next->free) - { - b = fusion(b); // Merge with the next block if it's free - } + fusion(b); + if (b->prev && b->prev->free) + fusion(b->prev); else { + if (b->next) + b->next->prev = b; if (b->prev) - { - b->prev->next = NULL; - } + b->prev->next = b; else - { - base = NULL; - } - brk(b); + base = b; + b->free = 1; + b->prev = NULL; } } } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 2dbdbcf..3b7db31 100644 --- a/src/main.c +++ b/src/main.c @@ -12,44 +12,76 @@ * Then the array is resized to size 10 using realloc() */ -int main(void){ - +int main(void) { printf("\n\n"); printf("Initializing first variable : "); int *a = (int*)malloc(sizeof(int)); + if (!a) { + perror("malloc"); + return 1; + } *a = 5; - printf("%p -> %d \n\n",(void*)a,*a); + printf("%p -> %d \n\n", (void*)a, *a); printf("Initializing second variable : "); int *b = (int*)malloc(sizeof(int)); + if (!b) { + perror("malloc"); + free(a); + return 1; + } *b = 10; - printf("%p -> %d \n\n",(void*)b,*b); - + printf("%p -> %d \n\n", (void*)b, *b); + free(a); printf("Freeing first variable and using that memory block again using malloc() for third variable: "); int *c = (int*)malloc(sizeof(int)); - printf("%p -> %d \n\n",(void*)c,*c); - + if (!c) { + perror("malloc"); + free(b); + return 1; + } + *c = 0; // Initialize the value to avoid uninitialized read + printf("%p -> %d \n\n", (void*)c, *c); + printf("Initializing int array of size 5 using calloc() : "); - int *arr = (int*)calloc(sizeof(int),5); - printf("%p -> ",(void*)arr); - for(int i=0; i<5; i++){ - printf(" %d ", *(arr+i)); + int *arr = (int*)calloc(5, sizeof(int)); + if (!arr) { + perror("calloc"); + free(b); + free(c); + return 1; + } + printf("%p -> ", (void*)arr); + for (int i = 0; i < 5; i++) { + printf(" %d ", arr[i]); } printf("\n\n"); printf("Resizing it to size 10 using realloc(): "); - arr = (int*)realloc(arr, 10); - printf("%p -> ",(void*)arr); - for(int i=0; i<10; i++){ - printf(" %d ", *(arr+i)); + int *new_arr = (int*)realloc(arr, 10 * sizeof(int)); + if (!new_arr) { + perror("realloc"); + free(b); + free(c); + free(arr); + return 1; + } + arr = new_arr; + // Initialize the new elements to avoid uninitialized read + for (int i = 5; i < 10; i++) { + arr[i] = 0; + } + printf("%p -> ", (void*)arr); + for (int i = 0; i < 10; i++) { + printf(" %d ", arr[i]); } + printf("\n"); + free(c); free(b); free(arr); - printf("\n\n"); - return 0; } \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index a14b760..cbc980b 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -9,37 +9,38 @@ t_block find_block(t_block* last, size_t size) t_block b = base; if (method == FIRST_FIT) - { // First Fit strategy + { while (b && !(b->free && b->size >= size)) - { // Look for the first block large enough and free - *last = b; // Update the last block traversed - b = b->next; // Move to the next block + { + *last = b; + b = b->next; } - return (b); // Return the found block or NULL + + return (b); } else - { // Best Fit strategy - size_t dif = PAGESIZE; // Difference between the requested size and the block size - t_block best = NULL; // Pointer to the best-fit block + { + size_t dif = PAGESIZE; + t_block best = NULL; while (b) { if (b->free) - { // If the block is free + { if (b->size == size) - { // Perfect match + { return b; } if (b->size > size && (b->size - size) < dif) - { // Smaller difference is better + { dif = b->size - size; best = b; } } - *last = b; // Update the last traversed block - b = b->next; // Move to the next block + *last = b; + b = b->next; } - return best; // Return the best-fit block or NULL + return best; } } @@ -47,78 +48,71 @@ t_block find_block(t_block* last, size_t size) void split_block(t_block b, size_t s) { if (b->size <= s + BLOCK_SIZE) - { // Check if the block can be split + { return; } - t_block new; // Create a new block for the leftover memory - new = (t_block)(b->data + s); // Assign the new block after the allocated space - new->size = b->size - s - BLOCK_SIZE; // Adjust size for the new block - new->next = b->next; // Link the new block to the next block - new->free = 1; // Mark the new block as free - new->ptr = new->data; - new->prev = b; - b->next = new; // Update the next link of the original block - b->size = s; // Resize the original block - if (new->next) - { - new->next->prev = new; - } + t_block new; + new = (t_block)(b->data + s); + new->size = b->size - s - BLOCK_SIZE; + new->next = b->next; + new->free = 1; + b->size = s; + b->next = new; } // Function to extend the heap by creating a new block t_block extend_heap(t_block last, size_t s) { - t_block old_break, new_break; - old_break = sbrk(0); - new_break = sbrk(BLOCK_SIZE + s); - if (new_break == (void *)-1) + t_block b; + b = mmap(0, s, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + if (b == MAP_FAILED) { return NULL; } - old_break->size = s; - old_break->free = 0; - old_break->next = NULL; - old_break->prev = NULL; - old_break->ptr = old_break->data; + b->size = s; + b->next = NULL; + b->prev = last; + b->ptr = b->data; + if (last) - { - last->next = old_break; - } - return (old_break); + last->next = b; + + b->free = 0; + return b; } // Function to allocate memory void* malloc(size_t size) { t_block b, last; - size_t s = align(size); // Align the requested size + size_t s; + s = align(size); if (base) - { // If the heap exists + { last = base; - b = find_block(&last, s); // Find a suitable block + b = find_block(&last, s); if (b) { if ((b->size - s) >= (BLOCK_SIZE + 4)) - { - split_block(b, s); // Split the block if there's excess space - } - b->free = 0; // Mark the block as allocated + split_block(b, s); + b->free = 0; } else { - b = extend_heap(last, s); // Extend the heap if no block is found + b = extend_heap(last, s); if (!b) - return NULL; + return (NULL); } } else - { // Initialize the heap + { b = extend_heap(NULL, s); if (!b) - return NULL; - base = b; // Set the base pointer + return (NULL); + base = b; } - return b->data; // Return a pointer to the allocated space -} \ No newline at end of file + return (b->data); +} diff --git a/src/memory.c b/src/memory.c index fa121c6..0248179 100644 --- a/src/memory.c +++ b/src/memory.c @@ -6,13 +6,14 @@ int method = 0; // Memory allocation method (0 = First Fit, 1 = Best Fit) // Function to get the block associated with a pointer t_block get_block(void* p) { - char* tmp = p; // Convert to a character pointer + char* tmp; + tmp = p; if (tmp >= (char*)base + BLOCK_SIZE) - { // Ensure the pointer is within the heap range - tmp -= BLOCK_SIZE; // Move to the block metadata + { + tmp -= BLOCK_SIZE; } - return (t_block)(tmp); // Return the block + return (t_block)(tmp); } // Function to check and display details of a block diff --git a/src/realloc.c b/src/realloc.c index 508d398..eaab714 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -3,16 +3,13 @@ // Function to copy data from one block to another void copy_block(t_block src, t_block dst) { + int *sdata, *ddata; size_t i; + sdata = src->ptr; + ddata = dst->ptr; - int *sdata = src->ptr; // Source data pointer - int *ddata = dst->ptr; // Destination data pointer - - // Copy data from the source block to the destination block for (i = 0; (i * 4) < src->size && (i * 4) < dst->size; i++) - { ddata[i] = sdata[i]; - } } // Function to reallocate memory @@ -23,42 +20,38 @@ void* realloc(void* ptr, size_t size) void* newp; if (!ptr) - return malloc(size); // If the pointer is NULL, act like malloc + return (malloc(size)); if (valid_addr(ptr)) - { // Ensure the pointer is valid + { s = align(size); b = get_block(ptr); if (b->size >= s) - { // If the block is already large enough - if (b->size >= (BLOCK_SIZE + 4)) - { - split_block(b, s); // Resize the block - } + { + if (b->size - s >= (BLOCK_SIZE + 4)) + split_block(b, s); } else { if (b->next && b->next->free && (b->size + BLOCK_SIZE + b->next->size) >= s) { - fusion(b); // Merge with the next block if possible + fusion(b); if (b->size - s >= (BLOCK_SIZE + 4)) - { split_block(b, s); - } } else { - newp = malloc(s); // Allocate a new block + newp = malloc(s); if (!newp) - return NULL; + return (NULL); new = get_block(newp); - copy_block(b, new); // Copy data to the new block - free(ptr); // Free the old block - return newp; + copy_block(b, new); + free(ptr); + return (newp); } } - return ptr; + return (ptr); } - return NULL; + return (NULL); } \ No newline at end of file From 29fb5a7182466d16a354c50fe269318ab795bdeb Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Mon, 25 Nov 2024 18:00:23 -0300 Subject: [PATCH 08/21] Optimized and commented code --- include/memory.h | 2 + src/calloc.c | 21 +++++----- src/free.c | 40 +++++++++--------- src/malloc.c | 104 ++++++++++++++++++++++++++--------------------- src/realloc.c | 65 +++++++++++++++++------------ 5 files changed, 128 insertions(+), 104 deletions(-) diff --git a/include/memory.h b/include/memory.h index 34f8f45..e28c0ef 100644 --- a/include/memory.h +++ b/include/memory.h @@ -8,8 +8,10 @@ #pragma once +#include // Include limits for overflow checks #include #include +#include // Include for memset function #include // Memory management functions (e.g., mmap) #include #include diff --git a/src/calloc.c b/src/calloc.c index b242e34..438b63e 100644 --- a/src/calloc.c +++ b/src/calloc.c @@ -3,19 +3,20 @@ // Function to allocate zero-initialized memory void* calloc(size_t number, size_t size) { - size_t* new; - size_t s4, i; - - if (!number || !size) + // Prevent integer overflow when multiplying number and size + if (number == 0 || size == 0 || number > SIZE_MAX / size) { - return (NULL); + return NULL; // If overflow, return NULL to indicate allocation failure } - new = malloc(number * size); + + size_t total_size = number * size; + + // Allocate memory using malloc + void* new = malloc(total_size); if (new) { - s4 = align(number * size) << 2; - for (i = 0; i < s4; i++) - new[i] = 0; + // Set allocated memory to zero using memset for better efficiency + memset(new, 0, total_size); } - return (new); + return new; // Return the allocated and zero-initialized memory } \ No newline at end of file diff --git a/src/free.c b/src/free.c index b6247f1..af2575d 100644 --- a/src/free.c +++ b/src/free.c @@ -1,19 +1,23 @@ #include "../include/free.h" -extern base; +extern void* base; // Base of the heap // Function to merge adjacent free memory blocks t_block fusion(t_block b) { + // If next block exists and is free, merge it with the current block if (b->next && b->next->free) { - b->size += BLOCK_SIZE + b->next->size; - b->next = b->next->next; + b->size += BLOCK_SIZE + b->next->size; // Combine sizes of current and next block + b->next = b->next->next; // Update next pointer to skip merged block + // Update the previous link of the next block if (b->next) + { b->next->prev = b; + } } - return b; + return b; // Return the merged block } // Function to check if a pointer is valid and part of the heap @@ -21,39 +25,35 @@ int valid_addr(void* p) { if (base) { + // Ensure the pointer is within the heap bounds if (p > base && p < sbrk(0)) { - t_block b = get_block(p); + t_block b = get_block(p); // Retrieve block from pointer + // Check if the pointer matches the start of the data segment return b && (p == b->ptr); } } - return (0); + return 0; // Invalid address } // Function to free allocated memory void free(void* ptr) { - t_block b; - + // Check if the pointer is valid before proceeding if (valid_addr(ptr)) { - b = get_block(ptr); - b->free = 1; + t_block b = get_block(ptr); // Retrieve the block from the pointer + b->free = 1; // Mark the block as free + // Merge with the next block if it is also free if (b->next && b->next->free) + { fusion(b); + } + // Merge with the previous block if it is also free if (b->prev && b->prev->free) - fusion(b->prev); - else { - if (b->next) - b->next->prev = b; - if (b->prev) - b->prev->next = b; - else - base = b; - b->free = 1; - b->prev = NULL; + fusion(b->prev); } } } \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index cbc980b..0b9383c 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -1,7 +1,7 @@ #include "include/malloc.h" -extern base; -extern method; +extern void* base; // Base of the heap +extern int method; // Allocation method: FIRST_FIT or BEST_FIT // Function to find a suitable memory block based on the allocation method t_block find_block(t_block* last, size_t size) @@ -10,109 +10,119 @@ t_block find_block(t_block* last, size_t size) if (method == FIRST_FIT) { + // Iterate through blocks until a suitable free block is found while (b && !(b->free && b->size >= size)) { *last = b; b = b->next; } - - return (b); + return b; // Return the found block or NULL if not found } else - { - size_t dif = PAGESIZE; + { // Best fit strategy + size_t dif = SIZE_MAX; // Start with the maximum difference t_block best = NULL; + // Iterate through blocks to find the best fit while (b) { - if (b->free) + if (b->free && b->size >= size && (b->size - size) < dif) { - if (b->size == size) - { - return b; - } - if (b->size > size && (b->size - size) < dif) - { - dif = b->size - size; - best = b; - } + dif = b->size - size; + best = b; // Update best block if a closer fit is found } *last = b; b = b->next; } - return best; + return best; // Return the best fit block or NULL if not found } } // Function to split a memory block into two -void split_block(t_block b, size_t s) +t_block split_block(t_block b, size_t s) { - if (b->size <= s + BLOCK_SIZE) + // Ensure there is enough space for the new block + if (b->size > s + BLOCK_SIZE) { - return; - } + t_block new_block = (t_block)(b->data + s); // Calculate address of the new block + new_block->size = b->size - s - BLOCK_SIZE; // Update size of the new block + new_block->next = b->next; // Link the new block to the next block + new_block->free = 1; // Mark new block as free - t_block new; - new = (t_block)(b->data + s); - new->size = b->size - s - BLOCK_SIZE; - new->next = b->next; - new->free = 1; - b->size = s; - b->next = new; + b->size = s; // Update the size of the current block + b->next = new_block; // Link current block to the new block + new_block->prev = b; // Update the previous link of the new block + } + return b; } // Function to extend the heap by creating a new block t_block extend_heap(t_block last, size_t s) { - t_block b; - b = mmap(0, s, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - + // Allocate new memory using mmap for heap extension + t_block b = mmap(0, s + BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (b == MAP_FAILED) { - return NULL; + return NULL; // If mmap fails, return NULL } + + // Set up new block details b->size = s; b->next = NULL; b->prev = last; - b->ptr = b->data; + b->ptr = b->data; // Set the pointer to the data segment + b->free = 0; // Mark block as allocated + // Update the link from the last block if it exists if (last) + { last->next = b; - - b->free = 0; + } return b; } // Function to allocate memory void* malloc(size_t size) { + // Prevent integer overflow in size alignment + if (size == 0 || size > SIZE_MAX - BLOCK_SIZE) + { + return NULL; // Return NULL if size is invalid + } + + size_t s = align(size); // Align the requested size t_block b, last; - size_t s; - s = align(size); if (base) - { + { // If the heap is initialized last = base; - b = find_block(&last, s); + b = find_block(&last, s); // Find a suitable block if (b) { + // Split block if there is enough extra space if ((b->size - s) >= (BLOCK_SIZE + 4)) + { split_block(b, s); - b->free = 0; + } + b->free = 0; // Mark block as allocated } else - { + { // No suitable block found, extend the heap b = extend_heap(last, s); if (!b) - return (NULL); + { + return NULL; // Return NULL if heap extension fails + } } } else - { - b = extend_heap(NULL, s); + { // If heap is not initialized + b = extend_heap(NULL, s); // Extend heap for the first time if (!b) - return (NULL); - base = b; + { + return NULL; // Return NULL if heap extension fails + } + base = b; // Set the base to the newly allocated block } - return (b->data); + return b->data; // Return the data pointer of the allocated block } diff --git a/src/realloc.c b/src/realloc.c index eaab714..d5e0856 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -3,55 +3,66 @@ // Function to copy data from one block to another void copy_block(t_block src, t_block dst) { - int *sdata, *ddata; - size_t i; - sdata = src->ptr; - ddata = dst->ptr; + char* sdata = src->ptr; // Pointer to source data + char* ddata = dst->ptr; // Pointer to destination data + size_t copy_size = src->size < dst->size ? src->size : dst->size; // Determine the smaller size to copy - for (i = 0; (i * 4) < src->size && (i * 4) < dst->size; i++) - ddata[i] = sdata[i]; + // Use memcpy to copy data for better efficiency + memcpy(ddata, sdata, copy_size); } // Function to reallocate memory void* realloc(void* ptr, size_t size) { - size_t s; - t_block b, new; - void* newp; + if (size == 0) + { // If new size is 0, free the memory and return NULL + free(ptr); + return NULL; + } if (!ptr) - return (malloc(size)); + { // If pointer is NULL, behave like malloc + return malloc(size); + } if (valid_addr(ptr)) - { - s = align(size); - b = get_block(ptr); + { // If the pointer is valid + size_t s = align(size); // Align the requested size + t_block b = get_block(ptr); // Get the block from the pointer if (b->size >= s) - { + { // If the current block is large enough if (b->size - s >= (BLOCK_SIZE + 4)) - split_block(b, s); + { + split_block(b, s); // Split the block if there's enough extra space + } + return ptr; // Return the original pointer } else - { + { // If the current block is not large enough + // Attempt to merge with the next block if possible if (b->next && b->next->free && (b->size + BLOCK_SIZE + b->next->size) >= s) { - fusion(b); + fusion(b); // Merge with the next block if (b->size - s >= (BLOCK_SIZE + 4)) - split_block(b, s); + { + split_block(b, s); // Split if there's extra space + } + return ptr; // Return the original pointer } else - { - newp = malloc(s); + { // Allocate a new block and copy data + void* newp = malloc(s); if (!newp) - return (NULL); - new = get_block(newp); - copy_block(b, new); - free(ptr); - return (newp); + { + return NULL; // Return NULL if allocation fails + } + t_block new_block = get_block(newp); // Get the block for the new pointer + copy_block(b, new_block); // Copy data to the new block + free(ptr); // Free the old block + return newp; // Return the new pointer } } - return (ptr); } - return (NULL); + return NULL; // Return NULL if the pointer is invalid } \ No newline at end of file From 6731585106748f2f0a840e2ac309c1c77fd1c6aa Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Tue, 26 Nov 2024 12:53:17 -0300 Subject: [PATCH 09/21] Implementations, based on development branch + Changed malloc, calloc, realloc, free and using mutex for each one + Worst Fit + Changed find_block + Log function --- CMakeLists.txt | 2 +- include/free.h | 2 +- include/mem_logging.h | 31 +++++++ include/memory.h | 22 ++++- src/calloc.c | 39 ++++++--- src/free.c | 111 +++++++++++++++++-------- src/main.c | 59 +------------- src/malloc.c | 183 ++++++++++++++++++++++++++++++++---------- src/mem_logging.c | 35 ++++++++ src/memory.c | 151 ++++++++++++++++++++++++---------- src/realloc.c | 90 +++++++++------------ 11 files changed, 479 insertions(+), 246 deletions(-) create mode 100644 include/mem_logging.h create mode 100644 src/mem_logging.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 2dd2263..05f2d5c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,4 +14,4 @@ set(CMAKE_C_FLAGS_RELEASE "-O0 -Wall -Wextra -Wpedantic -Werror -Wunused-paramet set(CMAKE_C_FLAGS_DEBUG "-g -O0 -fprofile-arcs -ftest-coverage -Wall -Wextra -Wpedantic -Werror -Wunused-parameter -Wmissing-prototypes -Wstrict-prototypes") # Add executable for the main project -add_executable(${PROJECT_NAME} src/main.c src/memory.c) \ No newline at end of file +add_executable(${PROJECT_NAME} src/main.c src/memory.c src/malloc.c src/free.c src/realloc.c src/calloc.c src/mem_logging.c) \ No newline at end of file diff --git a/include/free.h b/include/free.h index baeb6cc..4b3df69 100644 --- a/include/free.h +++ b/include/free.h @@ -21,4 +21,4 @@ int valid_addr(void* p); * * @param p Puntero al área de datos a liberar. */ -void free(void* p); \ No newline at end of file +void free(void *ptr, int unmap_flag); \ No newline at end of file diff --git a/include/mem_logging.h b/include/mem_logging.h new file mode 100644 index 0000000..be8beee --- /dev/null +++ b/include/mem_logging.h @@ -0,0 +1,31 @@ +#include // Include stdint for fixed-width types +#include // Include for logging +#include // Include for memset function +#include +#include // Include for timestamp + +#define LOG_FILE_PATH "/home/ignacio/iledesma/imem/memory_log.txt" + +// Time variables used for logging +#define NANOSECONDS_IN_SECOND 1000000000 + +typedef enum +{ + MALLOC, + CALLOC, + REALLOC, + FREE +} alloc_type; + +typedef struct log_entry +{ + alloc_type type; + void* ptr; + size_t size; + size_t total_allocated; + size_t total_freed; + struct log_entry* next; + unsigned long op_id; +} t_log_entry; + +void log_mem_operation(alloc_type type, void *ptr, size_t size); \ No newline at end of file diff --git a/include/memory.h b/include/memory.h index e28c0ef..dd9a4ef 100644 --- a/include/memory.h +++ b/include/memory.h @@ -8,6 +8,9 @@ #pragma once +#include "mem_logging.h" +#include // Include for mutexes +#include #include // Include limits for overflow checks #include #include @@ -15,13 +18,17 @@ #include // Memory management functions (e.g., mmap) #include #include +#include + +#define INVALID_ADDRESS -1 +#define BLOCK_THRESHOLD 8 /** * @brief Macro para alinear una cantidad de bytes al siguiente múltiplo de 8. * * @param x Cantidad de bytes a alinear. */ -#define align(x) (((((x) - 1) >> 3) << 3) + 8) +#define align(x) (((((x) - 1) >> 3) << 3) + BLOCK_THRESHOLD) /** Tamaño mínimo de un bloque de memoria. */ #define BLOCK_SIZE 40 @@ -31,8 +38,18 @@ #define FIRST_FIT 0 /** Política de asignación Best Fit. */ #define BEST_FIT 1 +/** Politica de asignacion Worst Fit */ +#define WORST_FIT 2 /** Tamaño del bloque */ #define DATA_START 1 +#define TRUE 1 +#define FALSE 0 + +#define RED "\033[1;31m" +#define GREEN "\033[1;32m" +#define YELLOW "\033[1;33m" +#define BLUE "\033[1;34m" +#define RESET "\033[0m" /** Tipo de puntero para un bloque de memoria. */ typedef struct s_block* t_block; @@ -51,6 +68,7 @@ struct s_block struct s_block* prev; /**< Puntero al bloque anterior en la lista enlazada. */ int free; /**< Indicador de si el bloque está libre (1) o ocupado (0). */ void* ptr; /**< Puntero a la dirección de los datos almacenados. */ + int alloc_method; /**< Método de asignación utilizado para el bloque. */ char data[DATA_START]; /**< Área donde comienzan los datos del bloque. */ }; @@ -67,4 +85,4 @@ t_block get_block(void* p); * * @param data Información adicional para la verificación. */ -void check_heap(void* data); +void check_heap(void); diff --git a/src/calloc.c b/src/calloc.c index 438b63e..09c7a62 100644 --- a/src/calloc.c +++ b/src/calloc.c @@ -1,22 +1,37 @@ -#include "include/calloc.h" +#include "../include/calloc.h" +#include "../include/malloc.h" + +extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations +unsigned long calloc_ctr = 0; // Function to allocate zero-initialized memory void* calloc(size_t number, size_t size) { - // Prevent integer overflow when multiplying number and size - if (number == 0 || size == 0 || number > SIZE_MAX / size) + pthread_mutex_lock(&memory_mutex); + + // Calculate the total size to allocate + size_t total_size = number * size; + if (total_size == 0) { - return NULL; // If overflow, return NULL to indicate allocation failure + pthread_mutex_unlock(&memory_mutex); + return NULL; } - size_t total_size = number * size; + // Allocate the memory using malloc + void* ptr = malloc(total_size); + if (ptr == NULL) + { + pthread_mutex_unlock(&memory_mutex); + return NULL; // Return NULL if memory allocation failed + } - // Allocate memory using malloc - void* new = malloc(total_size); - if (new) + // Zero-initialize the allocated memory + char* char_ptr = (char*)ptr; + for (size_t i = 0; i < total_size; i++) { - // Set allocated memory to zero using memset for better efficiency - memset(new, 0, total_size); + char_ptr[i] = 0; } - return new; // Return the allocated and zero-initialized memory -} \ No newline at end of file + + pthread_mutex_unlock(&memory_mutex); + return ptr; +} diff --git a/src/free.c b/src/free.c index af2575d..84cd8cd 100644 --- a/src/free.c +++ b/src/free.c @@ -1,59 +1,100 @@ #include "../include/free.h" extern void* base; // Base of the heap +extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations +extern int enable_unmapping; +extern size_t total_freed_memory; +unsigned long free_ctr = 0; -// Function to merge adjacent free memory blocks t_block fusion(t_block b) { - // If next block exists and is free, merge it with the current block - if (b->next && b->next->free) + // Fuse with next blocks + while (b->next && b->next->free) { - b->size += BLOCK_SIZE + b->next->size; // Combine sizes of current and next block - b->next = b->next->next; // Update next pointer to skip merged block - - // Update the previous link of the next block + t_block next_block = b->next; + b->size += BLOCK_SIZE + next_block->size; + b->next = next_block->next; if (b->next) - { b->next->prev = b; - } } - return b; // Return the merged block + + // Fuse with previous blocks + while (b->prev && b->prev->free) + { + t_block prev_block = b->prev; + prev_block->size += BLOCK_SIZE + b->size; + prev_block->next = b->next; + if (b->next) + b->next->prev = prev_block; + b = prev_block; + } + return b; } // Function to check if a pointer is valid and part of the heap int valid_addr(void* p) { - if (base) + if (p == NULL || base == NULL) + { + return 0; + } + t_block b = get_block(p); + t_block current = base; + while (current) { - // Ensure the pointer is within the heap bounds - if (p > base && p < sbrk(0)) + if (current == b) { - t_block b = get_block(p); // Retrieve block from pointer - // Check if the pointer matches the start of the data segment - return b && (p == b->ptr); + return (current->ptr == p); } + current = current->next; } - return 0; // Invalid address + return INVALID_ADDRESS; } -// Function to free allocated memory -void free(void* ptr) -{ - // Check if the pointer is valid before proceeding - if (valid_addr(ptr)) - { - t_block b = get_block(ptr); // Retrieve the block from the pointer - b->free = 1; // Mark the block as free +void free(void *ptr, int unmap_flag) { + pthread_mutex_lock(&memory_mutex); + if (ptr == NULL) { + pthread_mutex_unlock(&memory_mutex); + return; + } - // Merge with the next block if it is also free - if (b->next && b->next->free) - { - fusion(b); - } - // Merge with the previous block if it is also free - if (b->prev && b->prev->free) - { - fusion(b->prev); + t_block b; + + if (valid_addr(ptr)) { + b = get_block(ptr); + b->free = TRUE; + + // Fuse with adjacent free blocks + b = fusion(b); + total_freed_memory += b->size; + add_log_entry(FREE, ptr, b->size); + + if (unmap_flag && b->next == NULL) { + if (b->prev) { + b->prev->next = NULL; + } else { + base = NULL; // This was the base block, and there are no other blocks + } + + // Check if we should unmap this block + if (enable_unmapping && b->free) { + size_t total_size = b->size + BLOCK_SIZE; + printf("Unmapping block at %p, size: %zu\n", (void *)b, total_size); + + // Unmap only when you are sure it is not used elsewhere + if (munmap(b, total_size) == -1) { + perror("munmap"); + } else { + // Reset base if it was pointing to this unmapped block + if (base == b) { + base = NULL; + } } + } } -} \ No newline at end of file + + } else { + printf("Attempt to free invalid pointer: %p\n", ptr); + } + pthread_mutex_unlock(&memory_mutex); +} diff --git a/src/main.c b/src/main.c index 3b7db31..858699c 100644 --- a/src/main.c +++ b/src/main.c @@ -24,64 +24,7 @@ int main(void) { *a = 5; printf("%p -> %d \n\n", (void*)a, *a); - printf("Initializing second variable : "); - int *b = (int*)malloc(sizeof(int)); - if (!b) { - perror("malloc"); - free(a); - return 1; - } - *b = 10; - printf("%p -> %d \n\n", (void*)b, *b); - - free(a); - printf("Freeing first variable and using that memory block again using malloc() for third variable: "); - int *c = (int*)malloc(sizeof(int)); - if (!c) { - perror("malloc"); - free(b); - return 1; - } - *c = 0; // Initialize the value to avoid uninitialized read - printf("%p -> %d \n\n", (void*)c, *c); - - printf("Initializing int array of size 5 using calloc() : "); - int *arr = (int*)calloc(5, sizeof(int)); - if (!arr) { - perror("calloc"); - free(b); - free(c); - return 1; - } - printf("%p -> ", (void*)arr); - for (int i = 0; i < 5; i++) { - printf(" %d ", arr[i]); - } - printf("\n\n"); - - printf("Resizing it to size 10 using realloc(): "); - int *new_arr = (int*)realloc(arr, 10 * sizeof(int)); - if (!new_arr) { - perror("realloc"); - free(b); - free(c); - free(arr); - return 1; - } - arr = new_arr; - // Initialize the new elements to avoid uninitialized read - for (int i = 5; i < 10; i++) { - arr[i] = 0; - } - printf("%p -> ", (void*)arr); - for (int i = 0; i < 10; i++) { - printf(" %d ", arr[i]); - } - printf("\n"); - - free(c); - free(b); - free(arr); + free(a, FALSE); return 0; } \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index 0b9383c..54b3a03 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -1,7 +1,23 @@ -#include "include/malloc.h" +#include "../include/malloc.h" extern void* base; // Base of the heap -extern int method; // Allocation method: FIRST_FIT or BEST_FIT +extern int method; // Allocation method +extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations + +extern unsigned long first_fit_uses; // Counter for First Fit uses +extern unsigned long best_fit_uses; // Counter for Best Fit uses +extern unsigned long worst_fit_uses; // Counter for Worst Fit uses + +extern unsigned long first_fit_alloc_ctr; // Counter for First Fit allocations +extern unsigned long best_fit_alloc_ctr; // Counter for Best Fit allocations +extern unsigned long worst_fit_alloc_ctr; // Counter for Worst Fit allocations +extern double first_fit_alloc_timestamp; // Total time spent in First Fit allocations +extern double best_fit_alloc_timestamp; // Total time spent in Best Fit allocations +extern double worst_fit_alloc_timestamp; // Total time spent in Worst Fit allocations + +extern size_t total_allocated_memory; // Total allocated memory + +unsigned long malloc_ctr = 0; // Function to find a suitable memory block based on the allocation method t_block find_block(t_block* last, size_t size) @@ -10,36 +26,79 @@ t_block find_block(t_block* last, size_t size) if (method == FIRST_FIT) { - // Iterate through blocks until a suitable free block is found while (b && !(b->free && b->size >= size)) { *last = b; b = b->next; } - return b; // Return the found block or NULL if not found + if (b) + first_fit_uses++; + return b; } - else - { // Best fit strategy - size_t dif = SIZE_MAX; // Start with the maximum difference + else if (method == BEST_FIT) + { + size_t diff = (size_t)-1; // Initialize to maximum size_t value t_block best = NULL; - // Iterate through blocks to find the best fit while (b) { - if (b->free && b->size >= size && (b->size - size) < dif) + if (b->free && b->size >= size) + { + if (b->size - size < diff) + { + diff = b->size - size; + best = b; + } + if (diff == 0) + { // Perfect fit + break; + } + } + *last = b; + b = b->next; + } + if (best) + best_fit_uses++; + return best; + } + else if (method == WORST_FIT) + { + size_t max_size = 0; + t_block worst = NULL; + + while (b) + { + if (b->free && b->size >= size) { - dif = b->size - size; - best = b; // Update best block if a closer fit is found + if (b->size > max_size) + { + max_size = b->size; + worst = b; + } } *last = b; b = b->next; } - return best; // Return the best fit block or NULL if not found + if (worst) + worst_fit_uses++; + return worst; + } + else + { + // Default to First Fit if method is unrecognized + while (b && !(b->free && b->size >= size)) + { + *last = b; + b = b->next; + } + if (b) + first_fit_uses++; + return b; } } // Function to split a memory block into two -t_block split_block(t_block b, size_t s) +void split_block(t_block b, size_t s) { // Ensure there is enough space for the new block if (b->size > s + BLOCK_SIZE) @@ -47,82 +106,118 @@ t_block split_block(t_block b, size_t s) t_block new_block = (t_block)(b->data + s); // Calculate address of the new block new_block->size = b->size - s - BLOCK_SIZE; // Update size of the new block new_block->next = b->next; // Link the new block to the next block - new_block->free = 1; // Mark new block as free + new_block->prev = b; // Update the previous link of the new block + new_block->free = TRUE; // Mark new block as free + new_block->ptr = new_block->data; // Set pointer to the data segment of the new block b->size = s; // Update the size of the current block b->next = new_block; // Link current block to the new block - new_block->prev = b; // Update the previous link of the new block + if (new_block->next) + { + new_block->next->prev = new_block; // Update the previous link of the next block + } } - return b; } // Function to extend the heap by creating a new block t_block extend_heap(t_block last, size_t s) { - // Allocate new memory using mmap for heap extension - t_block b = mmap(0, s + BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + t_block b; + b = mmap(0, s + BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (b == MAP_FAILED) { - return NULL; // If mmap fails, return NULL + return NULL; } - - // Set up new block details b->size = s; b->next = NULL; b->prev = last; - b->ptr = b->data; // Set the pointer to the data segment - b->free = 0; // Mark block as allocated + b->ptr = b->data; + b->free = 0; + b->alloc_method = method; - // Update the link from the last block if it exists if (last) - { last->next = b; - } + return b; } // Function to allocate memory void* malloc(size_t size) { - // Prevent integer overflow in size alignment - if (size == 0 || size > SIZE_MAX - BLOCK_SIZE) - { - return NULL; // Return NULL if size is invalid - } + pthread_mutex_lock(&memory_mutex); - size_t s = align(size); // Align the requested size t_block b, last; + size_t s; + struct timespec start, end; + + // Start timing the allocation process + clock_gettime(CLOCK_MONOTONIC, &start); + + s = align(size); if (base) - { // If the heap is initialized + { last = base; - b = find_block(&last, s); // Find a suitable block + b = find_block(&last, s); if (b) { - // Split block if there is enough extra space - if ((b->size - s) >= (BLOCK_SIZE + 4)) + if ((b->size - s) >= (BLOCK_SIZE + BLOCK_THRESHOLD)) { split_block(b, s); } - b->free = 0; // Mark block as allocated + b->free = 0; } else - { // No suitable block found, extend the heap + { b = extend_heap(last, s); if (!b) { - return NULL; // Return NULL if heap extension fails + pthread_mutex_unlock(&memory_mutex); + return NULL; // Return NULL if heap extension failed } } } else - { // If heap is not initialized - b = extend_heap(NULL, s); // Extend heap for the first time + { + b = extend_heap(NULL, s); if (!b) { - return NULL; // Return NULL if heap extension fails + pthread_mutex_unlock(&memory_mutex); + return NULL; // Return NULL if heap extension failed } - base = b; // Set the base to the newly allocated block + base = b; } - return b->data; // Return the data pointer of the allocated block + + b->alloc_method = method; + total_allocated_memory += b->size; + void* ptr = b->data; + add_log_entry(MALLOC, ptr, size); + + // End timing the allocation process + clock_gettime(CLOCK_MONOTONIC, &end); + double op_time = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / NANOSECONDS_IN_SECOND; + + // Update allocation time and count for the current method + if (method == FIRST_FIT) + { + first_fit_alloc_timestamp += op_time; + first_fit_alloc_ctr++; + first_fit_uses++; + } + else if (method == BEST_FIT) + { + best_fit_alloc_timestamp += op_time; + best_fit_alloc_ctr++; + best_fit_uses++; + } + else if (method == WORST_FIT) + { + worst_fit_alloc_timestamp += op_time; + worst_fit_alloc_ctr++; + worst_fit_uses++; + } + + pthread_mutex_unlock(&memory_mutex); + return ptr; } diff --git a/src/mem_logging.c b/src/mem_logging.c new file mode 100644 index 0000000..664d012 --- /dev/null +++ b/src/mem_logging.c @@ -0,0 +1,35 @@ +#include "mem_logging.h" + +extern size_t total_allocated_memory; // Total allocated memory +extern size_t total_freed_memory; // Total freed memory + +t_log_entry *log_head = NULL; // Head of the log list + +void log_mem_operation(alloc_type type, void *ptr, size_t size, unsigned long *op_ctr) { + t_log_entry *entry = mmap(NULL, sizeof(t_log_entry), PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (entry == MAP_FAILED) { + // Use write or fprintf to stderr to avoid using printf + fprintf(stderr, "Failed to allocate memory for log entry.\n"); + return; + } + entry->type = type; + entry->ptr = ptr; + entry->size = size; + entry->total_allocated = total_allocated_memory; + entry->total_freed = total_freed_memory; + entry->next = log_head; + entry->op_id = *op_ctr; + (*op_ctr)++; + log_head = entry; +} + +void clear_logs(void) { + t_log_entry *entry = log_head; + while (entry) { + t_log_entry *next = entry->next; + munmap(entry, sizeof(t_log_entry)); + entry = next; + } + log_head = NULL; +} diff --git a/src/memory.c b/src/memory.c index 0248179..5c32b0b 100644 --- a/src/memory.c +++ b/src/memory.c @@ -1,70 +1,137 @@ #include "../include/memory.h" // Custom memory management header -void* base = NULL; // Pointer to the beginning of the heap -int method = 0; // Memory allocation method (0 = First Fit, 1 = Best Fit) +extern t_log_entry* log_head; // Head of the log list -// Function to get the block associated with a pointer -t_block get_block(void* p) -{ - char* tmp; - tmp = p; +void* base = NULL; // Pointer to the beginning of the heap +int method = FIRST_FIT; // Memory allocation method (0 = First Fit, 1 = Best Fit) +int enable_unmapping = FALSE; // Enable unmapping of freed memory blocks +typedef struct s_block* t_block; +pthread_mutex_t memory_mutex = PTHREAD_MUTEX_INITIALIZER; // Mutex for thread safety - if (tmp >= (char*)base + BLOCK_SIZE) - { - tmp -= BLOCK_SIZE; - } - return (t_block)(tmp); -} +// Counters for allocation methods +unsigned long first_fit_uses = 0; +unsigned long best_fit_uses = 0; +unsigned long worst_fit_uses = 0; + +// Counters for allocation time and count +unsigned long first_fit_alloc_ctr = 0; +unsigned long best_fit_alloc_ctr = 0; +unsigned long worst_fit_alloc_ctr = 0; +double first_fit_alloc_timestamp = 0; +double best_fit_alloc_timestamp = 0; +double worst_fit_alloc_timestamp = 0; + +// Memory amounts to be tracked +size_t total_allocated_memory = 0; +size_t total_freed_memory = 0; -// Function to check and display details of a block -void check_heap(void* data) +void memory_manager_init() { - if (data == NULL) - { - printf("Data is NULL\n"); - return; - } + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&memory_mutex, &attr); + pthread_mutexattr_destroy(&attr); +} - t_block block = get_block(data); +void memory_manager_cleanup() +{ + pthread_mutex_destroy(&memory_mutex); +} - if (block == NULL) +// Function to get the block associated with a pointer +t_block get_block(void* p) +{ + if (p == NULL) { - printf("Block is NULL\n"); - return; + return NULL; } + return (t_block)((char*)p - offsetof(struct s_block, data)); +} - printf("\033[1;33mHeap check\033[0m\n"); - printf("Size: %zu\n", block->size); - - if (block->next != NULL) +void set_method(int m) +{ + if (m == FIRST_FIT || m == BEST_FIT || m == WORST_FIT) { - printf("Next block: %p\n", (void*)(block->next)); + method = m; } else { - printf("Next block: NULL\n"); + printf("Error: invalid method\n"); } +} - if (block->prev != NULL) +void check_heap(void) +{ + if (base == NULL) { - printf("Prev block: %p\n", (void*)(block->prev)); + printf("Heap is empty.\n"); + return; } - else + + t_block current = base; + printf(YELLOW "Heap check\n" RESET); + while (current != NULL) { - printf("Prev block: NULL\n"); + if (current->free && current->next && current->next->free) + { + printf("Warning: Free blocks at %p and %p are adjacent but not fused.\n", (void*)current, + (void*)current->next); + } + if (current->size <= 0) + { + printf("Warning: Block at %p has invalid size %zu.\n", (void*)current, current->size); + } + printf("Block at %p\n", (void*)current); + printf(" Size: %zu\n", current->size); + printf(" Free: %d\n", current->free); + printf(" Next block: %p\n", (void*)(current->next)); + printf(" Previous block: %p\n", (void*)(current->prev)); + printf(" Data address: %p\n", current->ptr); + current = current->next; } +} + +void memory_usage(void) +{ + size_t current_allocated = total_allocated_memory - total_freed_memory; + printf(YELLOW "Memory Usage Report:\n" RESET); + printf(" Total allocated memory (since start): %zu bytes\n", total_allocated_memory); + printf(" Total freed memory (since start): %zu bytes\n", total_freed_memory); + printf(" Currently allocated memory: %zu bytes\n", current_allocated); - printf("Free: %d\n", block->free); + // Display the log entries + printf(BLUE "\nMemory Operation Log:\n" RESET); + t_log_entry* entry = log_head; - if (block->ptr != NULL) + // Reverse the log list to print in chronological order + t_log_entry* reversed_log = NULL; + while (entry) { - printf("Beginning data address: %p\n", block->ptr); - printf("Last data address: %p\n", (void*)((char*)(block->ptr) + block->size)); + t_log_entry* next = entry->next; + entry->next = reversed_log; + reversed_log = entry; + entry = next; } - else + + entry = reversed_log; + while (entry) { - printf("Data address: NULL\n"); + switch (entry->type) + { + case MALLOC: + printf(RED "malloc" RESET " of %zu bytes at %p\n", entry->size, entry->ptr); + break; + case CALLOC: + printf(RED "calloc" RESET " of %zu bytes at %p\n", entry->size, entry->ptr); + break; + case REALLOC: + printf(RED "realloc" RESET " to %zu bytes at %p\n", entry->size, entry->ptr); + break; + case FREE: + printf(GREEN "free" RESET " of %zu bytes from %p\n", entry->size, entry->ptr); + break; + } + entry = entry->next; } - - printf("Heap address: %p\n", sbrk(0)); } diff --git a/src/realloc.c b/src/realloc.c index d5e0856..2331c12 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -1,68 +1,56 @@ #include "../include/realloc.h" +#include "../include/free.h" +#include "../include/malloc.h" + +extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations +unsigned long realloc_ctr = 0; // Function to copy data from one block to another void copy_block(t_block src, t_block dst) { - char* sdata = src->ptr; // Pointer to source data - char* ddata = dst->ptr; // Pointer to destination data - size_t copy_size = src->size < dst->size ? src->size : dst->size; // Determine the smaller size to copy - - // Use memcpy to copy data for better efficiency - memcpy(ddata, sdata, copy_size); + size_t *sdata, *ddata; + size_t i; + sdata = src->ptr; + ddata = dst->ptr; + for (i = 0; i * sizeof(size_t) < src->size && i * sizeof(size_t) < dst->size; i++) + ddata[i] = sdata[i]; } // Function to reallocate memory void* realloc(void* ptr, size_t size) { - if (size == 0) - { // If new size is 0, free the memory and return NULL - free(ptr); - return NULL; - } + pthread_mutex_lock(&memory_mutex); - if (!ptr) - { // If pointer is NULL, behave like malloc + if (ptr == NULL) + { + pthread_mutex_unlock(&memory_mutex); return malloc(size); } - if (valid_addr(ptr)) - { // If the pointer is valid - size_t s = align(size); // Align the requested size - t_block b = get_block(ptr); // Get the block from the pointer + t_block b = get_block(ptr); + if (!valid_addr(ptr) || b == NULL) + { + pthread_mutex_unlock(&memory_mutex); + return NULL; // Invalid address, return NULL to prevent undefined behavior + } - if (b->size >= s) - { // If the current block is large enough - if (b->size - s >= (BLOCK_SIZE + 4)) - { - split_block(b, s); // Split the block if there's enough extra space - } - return ptr; // Return the original pointer - } - else - { // If the current block is not large enough - // Attempt to merge with the next block if possible - if (b->next && b->next->free && (b->size + BLOCK_SIZE + b->next->size) >= s) - { - fusion(b); // Merge with the next block - if (b->size - s >= (BLOCK_SIZE + 4)) - { - split_block(b, s); // Split if there's extra space - } - return ptr; // Return the original pointer - } - else - { // Allocate a new block and copy data - void* newp = malloc(s); - if (!newp) - { - return NULL; // Return NULL if allocation fails - } - t_block new_block = get_block(newp); // Get the block for the new pointer - copy_block(b, new_block); // Copy data to the new block - free(ptr); // Free the old block - return newp; // Return the new pointer - } + if (b->size >= size) + { + pthread_mutex_unlock(&memory_mutex); + return ptr; + } + + void* new_ptr = malloc(size); + if (new_ptr) + { + char *src = (char*)ptr, *dest = (char*)new_ptr; + for (size_t i = 0; i < b->size; i++) + { + dest[i] = src[i]; } + free(ptr, FALSE); // Do not unmap during reallocation } - return NULL; // Return NULL if the pointer is invalid -} \ No newline at end of file + + pthread_mutex_unlock(&memory_mutex); + return new_ptr; +} From 0f4eaad7ae4f3ca45137996c1d0efa7c5d5d5e64 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Tue, 26 Nov 2024 14:07:15 -0300 Subject: [PATCH 10/21] Sintax improvements --- include/calloc.h | 1 + include/free.h | 1 + include/malloc.h | 1 + include/mem_logging.h | 2 +- include/mem_metrics.h | 10 +++ include/memory.h | 3 +- include/realloc.h | 2 + src/calloc.c | 4 +- src/free.c | 91 ++++++++++++--------- src/main.c | 30 ------- src/malloc.c | 51 +----------- src/mem_logging.c | 55 +++++++------ src/mem_metrics.c | 185 ++++++++++++++++++++++++++++++++++++++++++ src/memory.c | 29 ++----- src/realloc.c | 5 +- 15 files changed, 302 insertions(+), 168 deletions(-) create mode 100644 include/mem_metrics.h delete mode 100644 src/main.c create mode 100644 src/mem_metrics.c diff --git a/include/calloc.h b/include/calloc.h index 66b51f4..6a33ab9 100644 --- a/include/calloc.h +++ b/include/calloc.h @@ -1,4 +1,5 @@ #include "../include/memory.h" +#include "../include/malloc.h" /** * @brief Asigna un bloque de memoria para un número de elementos, inicializándolo a cero. diff --git a/include/free.h b/include/free.h index 4b3df69..62625e8 100644 --- a/include/free.h +++ b/include/free.h @@ -1,4 +1,5 @@ #include "../include/memory.h" +#include "../include/mem_logging.h" /** * @brief Fusiona un bloque libre con su siguiente bloque si también está libre. diff --git a/include/malloc.h b/include/malloc.h index 21114ca..791150f 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -1,4 +1,5 @@ #include "../include/memory.h" +#include "../include/mem_logging.h" /** * @brief Encuentra un bloque libre que tenga al menos el tamaño solicitado. diff --git a/include/mem_logging.h b/include/mem_logging.h index be8beee..d3b4df0 100644 --- a/include/mem_logging.h +++ b/include/mem_logging.h @@ -28,4 +28,4 @@ typedef struct log_entry unsigned long op_id; } t_log_entry; -void log_mem_operation(alloc_type type, void *ptr, size_t size); \ No newline at end of file +void log_mem_operation(alloc_type type, void *ptr, size_t size, unsigned long *op_ctr); \ No newline at end of file diff --git a/include/mem_metrics.h b/include/mem_metrics.h new file mode 100644 index 0000000..0c0f46d --- /dev/null +++ b/include/mem_metrics.h @@ -0,0 +1,10 @@ +#include "../include/memory.h" +#include "../include/malloc.h" +#include "../include/calloc.h" +#include "../include/realloc.h" +#include "../include/free.h" + +#define ALLOCATION_SIZE_MAX 1024 // Define a suitable maximum allocation size +#define ALLOCATION_SIZE_MIN 1 // Define a suitable minimum allocation size +#define NUM_ALLOCATIONS 1000 // Define the number of allocations for the test +#define TO_PERCENTAGE_MULTIPLIER 100 // Multiplier to convert to percentage \ No newline at end of file diff --git a/include/memory.h b/include/memory.h index dd9a4ef..55cefa2 100644 --- a/include/memory.h +++ b/include/memory.h @@ -9,6 +9,7 @@ #pragma once #include "mem_logging.h" +#include #include // Include for mutexes #include #include // Include limits for overflow checks @@ -18,7 +19,6 @@ #include // Memory management functions (e.g., mmap) #include #include -#include #define INVALID_ADDRESS -1 #define BLOCK_THRESHOLD 8 @@ -40,6 +40,7 @@ #define BEST_FIT 1 /** Politica de asignacion Worst Fit */ #define WORST_FIT 2 +#define ALLOC_METHODS 3 /** Tamaño del bloque */ #define DATA_START 1 #define TRUE 1 diff --git a/include/realloc.h b/include/realloc.h index 0d939ef..ae83a77 100644 --- a/include/realloc.h +++ b/include/realloc.h @@ -1,4 +1,6 @@ #include "../include/memory.h" +#include "../include/free.h" +#include "../include/malloc.h" /** * @brief Copia el contenido de un bloque de origen a un bloque de destino. diff --git a/src/calloc.c b/src/calloc.c index 09c7a62..a9f493d 100644 --- a/src/calloc.c +++ b/src/calloc.c @@ -1,5 +1,4 @@ #include "../include/calloc.h" -#include "../include/malloc.h" extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations unsigned long calloc_ctr = 0; @@ -32,6 +31,9 @@ void* calloc(size_t number, size_t size) char_ptr[i] = 0; } + // Log the calloc operation + log_mem_operation(CALLOC, ptr, total_size, &calloc_ctr); + pthread_mutex_unlock(&memory_mutex); return ptr; } diff --git a/src/free.c b/src/free.c index 84cd8cd..6f3f43f 100644 --- a/src/free.c +++ b/src/free.c @@ -1,6 +1,6 @@ #include "../include/free.h" -extern void* base; // Base of the heap +extern void* base; // Base of the heap extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations extern int enable_unmapping; extern size_t total_freed_memory; @@ -51,50 +51,63 @@ int valid_addr(void* p) return INVALID_ADDRESS; } -void free(void *ptr, int unmap_flag) { - pthread_mutex_lock(&memory_mutex); - if (ptr == NULL) { - pthread_mutex_unlock(&memory_mutex); - return; - } +void free(void* ptr, int unmap_flag) +{ + pthread_mutex_lock(&memory_mutex); + if (ptr == NULL) + { + pthread_mutex_unlock(&memory_mutex); + return; + } - t_block b; + t_block b; - if (valid_addr(ptr)) { - b = get_block(ptr); - b->free = TRUE; + if (valid_addr(ptr)) + { + b = get_block(ptr); + b->free = TRUE; - // Fuse with adjacent free blocks - b = fusion(b); - total_freed_memory += b->size; - add_log_entry(FREE, ptr, b->size); + // Fuse with adjacent free blocks + b = fusion(b); + total_freed_memory += b->size; + log_mem_operation(FREE, ptr, b->size, &free_ctr); - if (unmap_flag && b->next == NULL) { - if (b->prev) { - b->prev->next = NULL; - } else { - base = NULL; // This was the base block, and there are no other blocks - } + if (unmap_flag && b->next == NULL) + { + if (b->prev) + { + b->prev->next = NULL; + } + else + { + base = NULL; // This was the base block, and there are no other blocks + } - // Check if we should unmap this block - if (enable_unmapping && b->free) { - size_t total_size = b->size + BLOCK_SIZE; - printf("Unmapping block at %p, size: %zu\n", (void *)b, total_size); + // Check if we should unmap this block + if (enable_unmapping && b->free) + { + size_t total_size = b->size + BLOCK_SIZE; + printf("Unmapping block at %p with size: %zu\n", (void*)b, total_size); - // Unmap only when you are sure it is not used elsewhere - if (munmap(b, total_size) == -1) { - perror("munmap"); - } else { - // Reset base if it was pointing to this unmapped block - if (base == b) { - base = NULL; - } + // Unmap only when you are sure it is not used elsewhere + if (munmap(b, total_size) == -1) + { + perror("munmap"); + } + else + { + // Reset base if it was pointing to this unmapped block + if (base == b) + { + base = NULL; + } + } + } } - } } - - } else { - printf("Attempt to free invalid pointer: %p\n", ptr); - } - pthread_mutex_unlock(&memory_mutex); + else + { + printf("Failed attempt to free - %sInvalid Adress%s: %p\n", RED, RESET, ptr); + } + pthread_mutex_unlock(&memory_mutex); } diff --git a/src/main.c b/src/main.c deleted file mode 100644 index 858699c..0000000 --- a/src/main.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "../include/memory.h" -#include "../include/calloc.h" -#include "../include/malloc.h" -#include "../include/realloc.h" -#include "../include/free.h" - -/* - * Testing code to test all the functions implemented. - * First two new variables are created and allocated space using malloc() - * Then the first varaible is freed and malloc() is called again to show that space can be reused. - * Then calloc() is used to allocate an int array of size 5. Initially the values will be set to 0 by calloc(); - * Then the array is resized to size 10 using realloc() - */ - -int main(void) { - printf("\n\n"); - - printf("Initializing first variable : "); - int *a = (int*)malloc(sizeof(int)); - if (!a) { - perror("malloc"); - return 1; - } - *a = 5; - printf("%p -> %d \n\n", (void*)a, *a); - - free(a, FALSE); - - return 0; -} \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index 54b3a03..cbbebb6 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -1,20 +1,9 @@ #include "../include/malloc.h" -extern void* base; // Base of the heap -extern int method; // Allocation method +extern void* base; // Base of the heap +extern int method; // Allocation method extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations -extern unsigned long first_fit_uses; // Counter for First Fit uses -extern unsigned long best_fit_uses; // Counter for Best Fit uses -extern unsigned long worst_fit_uses; // Counter for Worst Fit uses - -extern unsigned long first_fit_alloc_ctr; // Counter for First Fit allocations -extern unsigned long best_fit_alloc_ctr; // Counter for Best Fit allocations -extern unsigned long worst_fit_alloc_ctr; // Counter for Worst Fit allocations -extern double first_fit_alloc_timestamp; // Total time spent in First Fit allocations -extern double best_fit_alloc_timestamp; // Total time spent in Best Fit allocations -extern double worst_fit_alloc_timestamp; // Total time spent in Worst Fit allocations - extern size_t total_allocated_memory; // Total allocated memory unsigned long malloc_ctr = 0; @@ -31,8 +20,6 @@ t_block find_block(t_block* last, size_t size) *last = b; b = b->next; } - if (b) - first_fit_uses++; return b; } else if (method == BEST_FIT) @@ -57,8 +44,6 @@ t_block find_block(t_block* last, size_t size) *last = b; b = b->next; } - if (best) - best_fit_uses++; return best; } else if (method == WORST_FIT) @@ -79,8 +64,6 @@ t_block find_block(t_block* last, size_t size) *last = b; b = b->next; } - if (worst) - worst_fit_uses++; return worst; } else @@ -91,8 +74,6 @@ t_block find_block(t_block* last, size_t size) *last = b; b = b->next; } - if (b) - first_fit_uses++; return b; } } @@ -107,7 +88,7 @@ void split_block(t_block b, size_t s) new_block->size = b->size - s - BLOCK_SIZE; // Update size of the new block new_block->next = b->next; // Link the new block to the next block new_block->prev = b; // Update the previous link of the new block - new_block->free = TRUE; // Mark new block as free + new_block->free = TRUE; // Mark new block as free new_block->ptr = new_block->data; // Set pointer to the data segment of the new block b->size = s; // Update the size of the current block @@ -192,31 +173,7 @@ void* malloc(size_t size) b->alloc_method = method; total_allocated_memory += b->size; void* ptr = b->data; - add_log_entry(MALLOC, ptr, size); - - // End timing the allocation process - clock_gettime(CLOCK_MONOTONIC, &end); - double op_time = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / NANOSECONDS_IN_SECOND; - - // Update allocation time and count for the current method - if (method == FIRST_FIT) - { - first_fit_alloc_timestamp += op_time; - first_fit_alloc_ctr++; - first_fit_uses++; - } - else if (method == BEST_FIT) - { - best_fit_alloc_timestamp += op_time; - best_fit_alloc_ctr++; - best_fit_uses++; - } - else if (method == WORST_FIT) - { - worst_fit_alloc_timestamp += op_time; - worst_fit_alloc_ctr++; - worst_fit_uses++; - } + log_mem_operation(MALLOC, ptr, size, &malloc_ctr); pthread_mutex_unlock(&memory_mutex); return ptr; diff --git a/src/mem_logging.c b/src/mem_logging.c index 664d012..cc6f9cd 100644 --- a/src/mem_logging.c +++ b/src/mem_logging.c @@ -3,33 +3,36 @@ extern size_t total_allocated_memory; // Total allocated memory extern size_t total_freed_memory; // Total freed memory -t_log_entry *log_head = NULL; // Head of the log list +t_log_entry* log_head = NULL; // Head of the log list -void log_mem_operation(alloc_type type, void *ptr, size_t size, unsigned long *op_ctr) { - t_log_entry *entry = mmap(NULL, sizeof(t_log_entry), PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (entry == MAP_FAILED) { - // Use write or fprintf to stderr to avoid using printf - fprintf(stderr, "Failed to allocate memory for log entry.\n"); - return; - } - entry->type = type; - entry->ptr = ptr; - entry->size = size; - entry->total_allocated = total_allocated_memory; - entry->total_freed = total_freed_memory; - entry->next = log_head; - entry->op_id = *op_ctr; - (*op_ctr)++; - log_head = entry; +void log_mem_operation(alloc_type type, void* ptr, size_t size, unsigned long* op_ctr) +{ + t_log_entry* entry = mmap(NULL, sizeof(t_log_entry), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (entry == MAP_FAILED) + { + // Use write or fprintf to stderr to avoid using printf + fprintf(stderr, "Failed to allocate memory for log entry.\n"); + return; + } + entry->type = type; + entry->ptr = ptr; + entry->size = size; + entry->total_allocated = total_allocated_memory; + entry->total_freed = total_freed_memory; + entry->next = log_head; + entry->op_id = *op_ctr; + (*op_ctr)++; + log_head = entry; } -void clear_logs(void) { - t_log_entry *entry = log_head; - while (entry) { - t_log_entry *next = entry->next; - munmap(entry, sizeof(t_log_entry)); - entry = next; - } - log_head = NULL; +void clear_logs(void) +{ + t_log_entry* entry = log_head; + while (entry) + { + t_log_entry* next = entry->next; + munmap(entry, sizeof(t_log_entry)); + entry = next; + } + log_head = NULL; } diff --git a/src/mem_metrics.c b/src/mem_metrics.c new file mode 100644 index 0000000..c5eba1a --- /dev/null +++ b/src/mem_metrics.c @@ -0,0 +1,185 @@ +#include "../include/mem_metrics.h" + +// Access external variables from memory.c +extern void* base; +extern size_t total_allocated_memory; +extern size_t total_freed_memory; +extern int enable_unmapping; + +// Implement calculate_fragmentation_per_method() +void calculate_fragmentation_per_method(double* fragmentation_rates) +{ + if (base == NULL) + { + printf("No blocks to calculate fragmentation.\n"); + for (int m = 0; m < ALLOC_METHODS; m++) + { + fragmentation_rates[m] = 0.0; + } + return; + } + + size_t total_free[ALLOC_METHODS] = {0}; + size_t largest_free_block[ALLOC_METHODS] = {0}; + size_t total_allocated[ALLOC_METHODS] = {0}; + + t_block current_block = base; + while (current_block) + { + int m = current_block->alloc_method; // Allocation method + if (m < 0 || m >= ALLOC_METHODS) + { + printf("Invalid allocation method in block at %p\n", (void*)current_block); + current_block = current_block->next; + continue; + } + + if (current_block->free) + { + total_free[m] += current_block->size; + if (current_block->size > largest_free_block[m]) + { + largest_free_block[m] = current_block->size; + } + } + else + { + total_allocated[m] += current_block->size; + } + current_block = current_block->next; + } + + for (int m = 0; m < ALLOC_METHODS; m++) + { + size_t total_memory = total_free[m] + total_allocated[m]; + double external_fragmentation = 0.0; + + if (total_free[m] > 0) + { + external_fragmentation = + ((double)(total_free[m] - largest_free_block[m]) / (double)total_free[m]) * TO_PERCENTAGE_MULTIPLIER; + } + + fragmentation_rates[m] = external_fragmentation; + + // Print the fragmentation report for each method + const char* method_name = (m == FIRST_FIT) ? "First Fit" + : (m == BEST_FIT) ? "Best Fit" + : (m == WORST_FIT) ? "Worst Fit" + : "Unknown"; + + printf("Fragmentation Report for %s:\n", method_name); + printf(" Total memory: %zu bytes\n", total_memory); + printf(" Total allocated memory: %zu bytes\n", total_allocated[m]); + printf(" Total free memory: %zu bytes\n", total_free[m]); + printf(" Largest free block: %zu bytes\n", largest_free_block[m]); + printf(" External fragmentation: %.2f%%\n", external_fragmentation); + } +} + +// Implement get_time_in_seconds() +double get_time_in_seconds(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec + ts.tv_nsec / NANOSECONDS_IN_SECOND; +} + +void efficiency_test(void) +{ + enable_unmapping = FALSE; // Disable unmapping during the test + + void** pointers = malloc(NUM_ALLOCATIONS * sizeof(void*)); + size_t* sizes = malloc(NUM_ALLOCATIONS * sizeof(size_t)); + if (!pointers || !sizes) + { + fprintf(stderr, "Memory allocation failed for test arrays.\n"); + exit(1); + } + + // Generate random sizes + srand(time(NULL)); + for (int i = 0; i < NUM_ALLOCATIONS; i++) + { + sizes[i] = rand() % ALLOCATION_SIZE_MAX + ALLOCATION_SIZE_MIN; + } + + // Measure allocation time + double start_time = get_time_in_seconds(); + for (int i = 0; i < NUM_ALLOCATIONS; i++) + { + pointers[i] = malloc(sizes[i]); + if (!pointers[i]) + { + fprintf(stderr, "Allocation failed at iteration %d\n", i); + exit(1); + } + } + double allocation_time = get_time_in_seconds() - start_time; + + // Measure deallocation time + start_time = get_time_in_seconds(); + for (int i = 0; i < NUM_ALLOCATIONS; i++) + { + // Free all pointers + if (pointers[i]) + { + free(pointers[i], TRUE); // Allow unmapping after free in normal cases + pointers[i] = NULL; // Prevent double free + } + // Free all sizes + if (sizes[i]) + { + free(sizes[i], TRUE); // Allow unmapping after free in normal cases + sizes[i] = 0; // Prevent double free + } + } + double deallocation_time = get_time_in_seconds() - start_time; + + // Print results + printf(BLUE "Efficiency Test Results:\n" RESET); + printf("\tAllocation time: %.6f seconds\n", allocation_time); + printf("\tDeallocation time: %.6f seconds\n", deallocation_time); + + // Calculate fragmentation after test + double fragmentation_rates[ALLOC_METHODS]; + calculate_fragmentation_per_method(fragmentation_rates); + + enable_unmapping = TRUE; // Re-enable unmapping after the test +} + +void clear_allocator(void) +{ + enable_unmapping = 1; // Ensure unmapping is enabled + + if (base == NULL) + { + printf("No blocks to clear. The allocator is empty.\n"); + return; + } + + t_block current_block = base; + while (current_block) + { + t_block next = current_block->next; + size_t total_size = current_block->size + BLOCK_SIZE; + if (munmap(current_block, total_size) == -1) + { + perror("munmap failed"); + } + else + { + printf("Unmapped block at %p, size: %zu\n", (void*)current_block, total_size); + } + current_block = next; + } + + // Reset global allocator state + base = NULL; + total_allocated_memory = 0; + total_freed_memory = 0; + + // Clear logs + clear_logs(); + printf("Allocator state cleared and logs cleared.\n"); +} diff --git a/src/memory.c b/src/memory.c index 5c32b0b..986f15e 100644 --- a/src/memory.c +++ b/src/memory.c @@ -2,25 +2,12 @@ extern t_log_entry* log_head; // Head of the log list -void* base = NULL; // Pointer to the beginning of the heap -int method = FIRST_FIT; // Memory allocation method (0 = First Fit, 1 = Best Fit) +void* base = NULL; // Pointer to the beginning of the heap +int method = FIRST_FIT; // Memory allocation method (0 = First Fit, 1 = Best Fit) int enable_unmapping = FALSE; // Enable unmapping of freed memory blocks typedef struct s_block* t_block; pthread_mutex_t memory_mutex = PTHREAD_MUTEX_INITIALIZER; // Mutex for thread safety -// Counters for allocation methods -unsigned long first_fit_uses = 0; -unsigned long best_fit_uses = 0; -unsigned long worst_fit_uses = 0; - -// Counters for allocation time and count -unsigned long first_fit_alloc_ctr = 0; -unsigned long best_fit_alloc_ctr = 0; -unsigned long worst_fit_alloc_ctr = 0; -double first_fit_alloc_timestamp = 0; -double best_fit_alloc_timestamp = 0; -double worst_fit_alloc_timestamp = 0; - // Memory amounts to be tracked size_t total_allocated_memory = 0; size_t total_freed_memory = 0; @@ -75,12 +62,12 @@ void check_heap(void) { if (current->free && current->next && current->next->free) { - printf("Warning: Free blocks at %p and %p are adjacent but not fused.\n", (void*)current, + printf("%sWarning:%s Free blocks at %p and %p are adjacent but not fused.\n", RED, RESET, (void*)current, (void*)current->next); } if (current->size <= 0) { - printf("Warning: Block at %p has invalid size %zu.\n", (void*)current, current->size); + printf("%sWarning:%sBlock at %p has invalid size %zu.\n", RED, RESET, (void*)current, current->size); } printf("Block at %p\n", (void*)current); printf(" Size: %zu\n", current->size); @@ -120,16 +107,16 @@ void memory_usage(void) switch (entry->type) { case MALLOC: - printf(RED "malloc" RESET " of %zu bytes at %p\n", entry->size, entry->ptr); + printf(RED "malloc [%d]" RESET " of %zu bytes at %p\n", entry->op_id, entry->size, entry->ptr); break; case CALLOC: - printf(RED "calloc" RESET " of %zu bytes at %p\n", entry->size, entry->ptr); + printf(RED "calloc [%d]" RESET " of %zu bytes at %p\n", entry->op_id, entry->size, entry->ptr); break; case REALLOC: - printf(RED "realloc" RESET " to %zu bytes at %p\n", entry->size, entry->ptr); + printf(RED "realloc [%d]" RESET " to %zu bytes at %p\n", entry->op_id, entry->size, entry->ptr); break; case FREE: - printf(GREEN "free" RESET " of %zu bytes from %p\n", entry->size, entry->ptr); + printf(GREEN "free [%d]" RESET " of %zu bytes from %p\n", entry->op_id, entry->size, entry->ptr); break; } entry = entry->next; diff --git a/src/realloc.c b/src/realloc.c index 2331c12..8ef299d 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -1,6 +1,4 @@ #include "../include/realloc.h" -#include "../include/free.h" -#include "../include/malloc.h" extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations unsigned long realloc_ctr = 0; @@ -49,6 +47,9 @@ void* realloc(void* ptr, size_t size) dest[i] = src[i]; } free(ptr, FALSE); // Do not unmap during reallocation + + // Log the realloc operation + log_mem_operation(REALLOC, new_ptr, size, &realloc_ctr); } pthread_mutex_unlock(&memory_mutex); From cb5af0e7cae3c8396c00ea2ffabba53c4442f2d8 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Tue, 26 Nov 2024 14:48:01 -0300 Subject: [PATCH 11/21] Comments and CI/CD files --- .github/actions/building/action.yml | 56 +++++++ .github/actions/coverage_and_test/action.yml | 64 ++++++++ .github/actions/documentation/action.yml | 44 +++++ .github/actions/style/action.yml | 40 +++++ .github/workflows/QAWorkflow.yml | 35 ++++ include/free.h | 43 +++-- include/malloc.h | 56 +++++-- include/memory.h | 164 ++++++++++++++----- src/malloc.c | 157 +++++++++--------- src/memory.c | 74 +++++---- 10 files changed, 555 insertions(+), 178 deletions(-) create mode 100644 .github/actions/building/action.yml create mode 100644 .github/actions/coverage_and_test/action.yml create mode 100644 .github/actions/documentation/action.yml create mode 100644 .github/actions/style/action.yml create mode 100644 .github/workflows/QAWorkflow.yml diff --git a/.github/actions/building/action.yml b/.github/actions/building/action.yml new file mode 100644 index 0000000..c239b08 --- /dev/null +++ b/.github/actions/building/action.yml @@ -0,0 +1,56 @@ +name: "Build" +description: "Executes a compilation." + +runs: + using: "composite" + steps: + - name: Compile + shell: bash + run: | + + # Ensure the script exits on any command failure + set -e + + # Define the root directory of the project (adjust if necessary) + PROJECT_ROOT="/home/runner/work/so-i-24-chp2-iledesma08/so-i-24-chp2-iledesma08" + + # Update package list and install necessary dependencies + echo "Updating package list and installing dependencies..." + sudo apt update + sudo apt install -y libmicrohttpd-dev python3-pip + + # Build and install prom-c-client + echo "Building and installing prom-c-client..." + cd "$PROJECT_ROOT/metrics_monitor/lib/prom-c-client/prom" + mkdir -p build + cd build + cmake .. + make + sudo make install + sudo rm -rf build # Clean up build directory after installation + + # Build and install promhttp + echo "Building and installing promhttp..." + cd "$PROJECT_ROOT/metrics_monitor/lib/prom-c-client/promhttp" + mkdir -p build + cd build + cmake .. + make + sudo make install + sudo rm -rf build # Clean up build directory after installation + + # Install Conan and detect profile + echo "Installing Conan and setting up dependencies..." + pip install --upgrade conan + conan profile detect + + # Set up and build the main project + echo "Setting up and building the main project..." + cd "$PROJECT_ROOT" + mkdir -p build + conan install . --build=missing + cd build + mkdir tests + cmake .. -DCMAKE_TOOLCHAIN_FILE="$PROJECT_ROOT/build/Release/generators/conan_toolchain.cmake" -DCMAKE_BUILD_TYPE=Release + make + cd "$PROJECT_ROOT" diff --git a/.github/actions/coverage_and_test/action.yml b/.github/actions/coverage_and_test/action.yml new file mode 100644 index 0000000..2fde49a --- /dev/null +++ b/.github/actions/coverage_and_test/action.yml @@ -0,0 +1,64 @@ +name: "Test and coverage check" +description: "Test and coverage check with gcovr, pass if coverage is greater than 20%" + +runs: + using: "composite" + steps: + - name: "Run coverage" + shell: bash + run: | + echo "Showing current directory" + echo $(pwd) + echo "Showing content of $HOME" + ls $HOME + echo "Making Desktop inside HOME to reproduce test" + mkdir -p $HOME/Desktop + sudo ldconfig + + PROJECT_PATH=$(pwd) + + ERROR_FILE_FLAG=$(pwd)/tests_errors.txt + + CTEST_ERROR_FILE_FLAG=$(pwd)/ctest_errors.txt + # run tests built with cmake + # --output-on-faileure: prints everythin outputted by the tests if it fails + # -VV verbose output + CTEST_COMMAND=$(ctest --test-dir build/tests --output-on-failure -VV 2> $CTEST_ERROR_FILE_FLAG 1>$ERROR_FILE_FLAG) + + if [ -s $CTEST_ERROR_FILE_FLAG ]; then + echo "Error: Unit Tests Failed" + exit 1 + else + echo "All tests where passed!" + fi + + # run coverage of those tests and oputput to file + gcovr -r $PROJECT_PATH . >> $ERROR_FILE_FLAG + + echo "Runnig: gcovr -r $PROJECT_PATH ." + + cat $ERROR_FILE_FLAG + + # Find the value of correct coverage + # parse coverage output file and extracts coverage percentage + # grep pulls out the line of the total + # awk prints only the last field (NF = number of fields of the grepped line) + # cut finnaly creates a list using '%' as a delimiter (-d '%') and keeps first value (-f 1) + COVERAGE_RESULT=$(grep "TOTAL" $ERROR_FILE_FLAG | awk '{print $NF}' | cut -d '%' -f 1) + + # Coverage lines GT 5 + if [ "$(echo "$COVERAGE_RESULT > 5" | bc)" -eq 1 ]; then + echo "Coverage is greater than 5%. Nice!" + exit 0 + else + echo "Error: Coverage is less than or equal to 5%" + exit 1 + fi + + # Upload errors as an artifact, when failed + - uses: actions/upload-artifact@v3 + if: failure() + with: + name: Tests or coverage errors!!! + path: ./tests_errors.txt + retention-days: 1 diff --git a/.github/actions/documentation/action.yml b/.github/actions/documentation/action.yml new file mode 100644 index 0000000..0aa80a9 --- /dev/null +++ b/.github/actions/documentation/action.yml @@ -0,0 +1,44 @@ +name: "Doc check" +description: "Code documentation generation with Doxygen" + +runs: + using: "composite" + steps: + - name: "Run doxygen command" + shell: bash + run: | + # We only make check, not changes + DOX_CONF_FILE=$(pwd)/Doxyfile + + # Append to DOX_CONF_FILE input source directories, if you have libs, add $(pwd)/lib + { + cat $DOX_CONF_FILE + echo "INPUT" = $(pwd)/src $(pwd)/include + } > $DOX_CONF_FILE + + # Generate documentation + # dot -c clears Graphviz configuration, doxygen uses Graphviz for generating graphical representations + sudo dot -c + + ERROR_FILE_FLAG=$(pwd)/dox_errors.txt + + # create documentation: -s specifies comments of configurations items will be omitted. + # pipe stderr to error file + DOXYGEN_COMMAND=$(doxygen -s $DOX_CONF_FILE 2> $ERROR_FILE_FLAG) + + # if error file not empty fail + if [ -s $ERROR_FILE_FLAG ]; then + echo "Error: There are some files that are not documented correctly" + exit 1 + else + echo "All files are documented correctly. Niiiceee" + exit 0 + fi + + # Upload errors as an artifact, when failed + - uses: actions/upload-artifact@v3 + if: failure() + with: + name: Doxygen errors!!! + path: ./dox_errors.txt + retention-days: 1 diff --git a/.github/actions/style/action.yml b/.github/actions/style/action.yml new file mode 100644 index 0000000..426728a --- /dev/null +++ b/.github/actions/style/action.yml @@ -0,0 +1,40 @@ +name: "Style check" +description: "Style check using clang-format" + +runs: + using: "composite" + steps: + - name: "Run clang-format" + shell: bash + run: | + # We only make check, not changes + # Use the find command with the variable + PROJECT_PATH=$(pwd) + + SOURCE_FILES=$(find $PROJECT_PATH/src -type f \( -name "*.cpp" -or -name "*.hpp" -or -name "*.h" -or -name "*.c" \) | tr "\n" " ") + SOURCE_FILES+=$(find $PROJECT_PATH/include -type f \( -name "*.cpp" -or -name "*.hpp" -or -name "*.h" -or -name "*.c" \) | tr "\n" " ") + # If you have a lib, uncomment the following line + # SOURCE_FILES+=$(find $PROJECT_PATH/lib -type f \( -name "*.cpp" -or -name "*.hpp" -or -name "*.h" -or -name "*.c" \) | tr "\n" " ") + + ERROR_FILE_FLAG=$PROJECT_PATH/clang-format_errors.txt + + echo "Running: clang-format -n $SOURCE_FILES" + + CLANG_COMMAND=$(clang-format -n $SOURCE_FILES 2> ${ERROR_FILE_FLAG}) + + if [ -s $ERROR_FILE_FLAG ]; then + echo "Error: There are some files that are not formatted correctly" + cat $ERROR_FILE_FLAG + exit 1 + else + echo "All files are formatted correctly. Niiiceee" + exit 0 + fi + + # Upload errors as an artifact, when failed + - uses: actions/upload-artifact@v3 + if: failure() + with: + name: Clang-format errors!!! + path: ./clang-format_errors.txt + retention-days: 1 diff --git a/.github/workflows/QAWorkflow.yml b/.github/workflows/QAWorkflow.yml new file mode 100644 index 0000000..892c63a --- /dev/null +++ b/.github/workflows/QAWorkflow.yml @@ -0,0 +1,35 @@ +name: QA Workflow + +on: + workflow_dispatch: + pull_request: + # Pull request events + types: [synchronize, opened, reopened, ready_for_review] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Install dependencies + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: doxygen gcovr lcov cppcheck graphviz clang-format valgrind bc + version: 1.0 + + - name: Run style check + uses: ./.github/actions/style + + - name: Run documentation check + uses: ./.github/actions/documentation + + - name: Build project + uses: ./.github/actions/building + + - name: Run tests and coverage + uses: ./.github/actions/coverage_and_test diff --git a/include/free.h b/include/free.h index 62625e8..cf19ca3 100644 --- a/include/free.h +++ b/include/free.h @@ -1,25 +1,46 @@ -#include "../include/memory.h" -#include "../include/mem_logging.h" +/** + * @file free.h + * @brief Header file for memory deallocation and validation functions. + * + * This header provides function prototypes for freeing allocated memory, + * validating memory addresses, and merging adjacent free memory blocks. + * These functions are part of the custom memory allocator. + */ + +#include "../include/memory.h" ///< Includes definitions for memory management structures and constants. +#include "../include/mem_logging.h" ///< Provides functionality for logging memory operations. /** - * @brief Fusiona un bloque libre con su siguiente bloque si también está libre. + * @brief Merges a free memory block with adjacent free blocks. * - * @param b Bloque a fusionar. - * @return t_block Puntero al bloque fusionado. + * This function combines a given free block with its neighboring free blocks, + * if available, to form a larger contiguous free block. The resulting block + * is updated in the memory heap. + * + * @param b Pointer to the memory block to merge. + * @return t_block Pointer to the merged memory block. */ t_block fusion(t_block b); /** - * @brief Verifica si una dirección de memoria es válida. + * @brief Checks if a given memory address is valid. + * + * Validates whether the provided pointer corresponds to a valid memory block + * in the heap managed by the custom memory allocator. * - * @param p Dirección de memoria a verificar. - * @return int Retorna 1 si la dirección es válida, 0 en caso contrario. + * @param p Pointer to the memory address to validate. + * @return int Returns 1 if the address is valid, 0 otherwise. */ int valid_addr(void* p); /** - * @brief Libera un bloque de memoria previamente asignado. + * @brief Frees a previously allocated memory block. + * + * Marks the specified memory block as free, merges it with adjacent free blocks + * if possible, and optionally unmaps it from the heap if it is the last block + * and `unmap_flag` is enabled. * - * @param p Puntero al área de datos a liberar. + * @param ptr Pointer to the memory block to be freed. + * @param unmap_flag Flag indicating whether to unmap the memory block if possible. */ -void free(void *ptr, int unmap_flag); \ No newline at end of file +void free(void* ptr, int unmap_flag); diff --git a/include/malloc.h b/include/malloc.h index 791150f..11610ca 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -1,36 +1,60 @@ -#include "../include/memory.h" -#include "../include/mem_logging.h" +/** + * @file malloc.h + * @brief Header file for custom memory allocation functions. + * + * This header defines the function prototypes for memory allocation, + * including finding, splitting, and expanding memory blocks, as well + * as allocating a block of memory using the custom allocator. + */ + +#include "../include/mem_logging.h" ///< Includes functionality for logging memory operations. +#include "../include/memory.h" ///< Includes custom memory management definitions. /** - * @brief Encuentra un bloque libre que tenga al menos el tamaño solicitado. + * @brief Finds a free memory block that can fit the requested size. * - * @param last Puntero al último bloque. - * @param size Tamaño solicitado. - * @return t_block Puntero al bloque encontrado, o NULL si no se encuentra ninguno. + * Searches the heap for a free block of memory that is at least as large + * as the requested size. If a suitable block is found, it is returned. + * Otherwise, NULL is returned. + * + * @param last Pointer to the last block traversed during the search. Updated to point to the final block checked. + * @param size Requested size in bytes. + * @return t_block Pointer to the found memory block, or NULL if no suitable block is available. */ t_block find_block(t_block* last, size_t size); /** - * @brief Divide un bloque de memoria en dos, si el tamaño solicitado es menor que el bloque disponible. + * @brief Splits a memory block into two if it is larger than the requested size. + * + * Adjusts the size of the current block to match the requested size, and creates + * a new block with the remaining space. The new block is marked as free and linked + * to the current block. * - * @param b Bloque a dividir. - * @param s Tamaño del nuevo bloque. + * @param b Pointer to the block to split. + * @param s Size of the new block in bytes. */ void split_block(t_block b, size_t s); /** - * @brief Expande el heap para crear un nuevo bloque de memoria. + * @brief Expands the heap by creating a new memory block. * - * @param last Último bloque del heap. - * @param s Tamaño del nuevo bloque. - * @return t_block Puntero al nuevo bloque creado. + * Extends the heap by allocating a new block of memory and linking it to the + * existing heap structure. If the allocation fails, NULL is returned. + * + * @param last Pointer to the last block in the current heap. + * @param s Size of the new block in bytes. + * @return t_block Pointer to the newly created block, or NULL if allocation fails. */ t_block extend_heap(t_block last, size_t s); /** - * @brief Asigna un bloque de memoria del tamaño solicitado. + * @brief Allocates a block of memory of the requested size. + * + * Attempts to find a suitable free block in the heap or extends the heap if + * no suitable block is available. Returns a pointer to the allocated memory, + * or NULL if the allocation fails. * - * @param size Tamaño en bytes del bloque a asignar. - * @return void* Puntero al área de datos asignada. + * @param size Requested size in bytes for the memory block. + * @return void* Pointer to the allocated memory block, or NULL if allocation fails. */ void* malloc(size_t size); diff --git a/include/memory.h b/include/memory.h index 55cefa2..8bbef96 100644 --- a/include/memory.h +++ b/include/memory.h @@ -1,89 +1,175 @@ /** * @file memory.h - * @brief Memory management library with custom allocation functions. + * @brief Custom memory management library. * - * Esta biblioteca define funciones de asignación de memoria dinámica - * y gestión de bloques para crear un asignador de memoria personalizado. + * This header defines the structures, constants, and function prototypes + * needed for a custom memory allocator. It provides tools for dynamic + * memory allocation, freeing, and diagnostic checks of the heap. */ -#pragma once +#pragma once // Prevents the header file from being included multiple times in the same compilation unit. -#include "mem_logging.h" -#include -#include // Include for mutexes -#include -#include // Include limits for overflow checks -#include -#include -#include // Include for memset function -#include // Memory management functions (e.g., mmap) -#include -#include +/* Required headers for memory management */ +#include "mem_logging.h" ///< For logging memory operations. +#include ///< Provides time-related utilities. +#include ///< Enables thread safety with mutexes. +#include ///< Standard definitions like `size_t`. +#include ///< Fixed-width integer types. +#include ///< Input/output utilities. +#include ///< Memory manipulation functions like `memset`. +#include ///< Memory management functions, such as `mmap`. +#include ///< Basic data types. +#include ///< Access to POSIX API functions. +/** + * @def INVALID_ADDRESS + * Constant used to indicate that a memory address is invalid. + */ #define INVALID_ADDRESS -1 + +/** + * @def BLOCK_THRESHOLD + * Defines the minimum padding needed for block alignment. + */ #define BLOCK_THRESHOLD 8 /** - * @brief Macro para alinear una cantidad de bytes al siguiente múltiplo de 8. + * @def align + * Aligns a size value to the next multiple of 8 bytes. + * + * This macro ensures memory allocations conform to system alignment requirements, + * improving access performance and avoiding potential errors on certain architectures. * - * @param x Cantidad de bytes a alinear. + * @param x The size to align. + * @return The aligned size value. */ #define align(x) (((((x) - 1) >> 3) << 3) + BLOCK_THRESHOLD) -/** Tamaño mínimo de un bloque de memoria. */ +/** + * @def BLOCK_SIZE + * The minimum size of a memory block, including metadata. + */ #define BLOCK_SIZE 40 -/** Tamaño de página en memoria. */ + +/** + * @def PAGESIZE + * The size of a memory page, typically used for mmap allocations. + */ #define PAGESIZE 4096 -/** Política de asignación First Fit. */ + +/** + * @def FIRST_FIT + * Allocation strategy: assign the first free block large enough for the requested size. + */ #define FIRST_FIT 0 -/** Política de asignación Best Fit. */ + +/** + * @def BEST_FIT + * Allocation strategy: assign the smallest free block that fits the requested size. + */ #define BEST_FIT 1 -/** Politica de asignacion Worst Fit */ + +/** + * @def WORST_FIT + * Allocation strategy: assign the largest free block available. + */ #define WORST_FIT 2 + +/** + * @def ALLOC_METHODS + * The total number of supported allocation strategies. + */ #define ALLOC_METHODS 3 -/** Tamaño del bloque */ + +/** + * @def DATA_START + * Offset for the start of the data section in a memory block. + */ #define DATA_START 1 + +/** + * @def TRUE + * Boolean true value. + */ #define TRUE 1 + +/** + * @def FALSE + * Boolean false value. + */ #define FALSE 0 +/** + * @def RED + * ANSI escape code for red-colored text in terminal output. + */ #define RED "\033[1;31m" + +/** + * @def GREEN + * ANSI escape code for green-colored text in terminal output. + */ #define GREEN "\033[1;32m" + +/** + * @def YELLOW + * ANSI escape code for yellow-colored text in terminal output. + */ #define YELLOW "\033[1;33m" + +/** + * @def BLUE + * ANSI escape code for blue-colored text in terminal output. + */ #define BLUE "\033[1;34m" + +/** + * @def RESET + * ANSI escape code to reset terminal text formatting. + */ #define RESET "\033[0m" -/** Tipo de puntero para un bloque de memoria. */ +/** + * @typedef t_block + * Alias for a pointer to the `s_block` structure. + */ typedef struct s_block* t_block; /** * @struct s_block - * @brief Estructura para representar un bloque de memoria. + * @brief Represents a block of memory in the custom allocator. * - * Contiene la información necesaria para gestionar la asignación y - * liberación de un bloque de memoria. + * Each block contains metadata and a pointer to its data area. The linked + * structure enables the allocator to manage dynamic memory efficiently. */ struct s_block { - size_t size; /**< Tamaño del bloque de datos. */ - struct s_block* next; /**< Puntero al siguiente bloque en la lista enlazada. */ - struct s_block* prev; /**< Puntero al bloque anterior en la lista enlazada. */ - int free; /**< Indicador de si el bloque está libre (1) o ocupado (0). */ - void* ptr; /**< Puntero a la dirección de los datos almacenados. */ - int alloc_method; /**< Método de asignación utilizado para el bloque. */ - char data[DATA_START]; /**< Área donde comienzan los datos del bloque. */ + size_t size; /**< The size of the data area in bytes. */ + struct s_block* next; /**< Pointer to the next block in the linked list. */ + struct s_block* prev; /**< Pointer to the previous block in the linked list. */ + int free; /**< Status flag: 1 if the block is free, 0 if allocated. */ + void* ptr; /**< Pointer to the start of the data area. */ + int alloc_method; /**< The allocation strategy used for this block. */ + char data[DATA_START]; /**< Start of the data section. Actual size is dynamic. */ }; /** - * @brief Obtiene el bloque que contiene una dirección de memoria dada. + * @brief Retrieves the metadata block for a given data pointer. + * + * This function calculates the starting address of the block structure + * that precedes the given data pointer. It is critical for managing + * allocated blocks and ensuring proper alignment. * - * @param p Puntero a la dirección de datos. - * @return t_block Puntero al bloque de memoria correspondiente. + * @param p A pointer to a data segment allocated by the custom allocator. + * @return t_block A pointer to the corresponding metadata block. */ t_block get_block(void* p); /** - * @brief Verifica el estado del heap y detecta bloques libres consecutivos. + * @brief Analyzes the state of the heap and logs potential issues. * - * @param data Información adicional para la verificación. + * This function scans all memory blocks in the heap, checking for + * abnormalities like adjacent free blocks that could be merged or + * blocks with invalid sizes. It provides detailed output for debugging. */ void check_heap(void); diff --git a/src/malloc.c b/src/malloc.c index cbbebb6..2790ff5 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -1,61 +1,61 @@ -#include "../include/malloc.h" +#include "../include/malloc.h" // Include the header file for memory allocation functions. -extern void* base; // Base of the heap -extern int method; // Allocation method -extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations +extern void* base; // Global pointer to the beginning of the heap. +extern int method; // Global variable indicating the memory allocation strategy. +extern pthread_mutex_t memory_mutex; // Mutex for thread-safe memory operations. -extern size_t total_allocated_memory; // Total allocated memory +extern size_t total_allocated_memory; // Tracks the total memory allocated by the custom allocator. -unsigned long malloc_ctr = 0; +unsigned long malloc_ctr = 0; // Counter for the number of malloc operations performed. -// Function to find a suitable memory block based on the allocation method +/* Finds a suitable memory block based on the selected allocation method. */ t_block find_block(t_block* last, size_t size) { - t_block b = base; + t_block b = base; // Start searching from the base of the heap. - if (method == FIRST_FIT) + if (method == FIRST_FIT) // First Fit strategy: find the first block that fits. { - while (b && !(b->free && b->size >= size)) + while (b && !(b->free && b->size >= size)) // Traverse until a suitable block is found. { - *last = b; - b = b->next; + *last = b; // Keep track of the last block traversed. + b = b->next; // Move to the next block. } - return b; + return b; // Return the found block or NULL if none is suitable. } - else if (method == BEST_FIT) + else if (method == BEST_FIT) // Best Fit strategy: find the smallest block that fits. { - size_t diff = (size_t)-1; // Initialize to maximum size_t value - t_block best = NULL; + size_t diff = (size_t)-1; // Initialize difference to the largest possible value. + t_block best = NULL; // Pointer to the best-fit block. while (b) { - if (b->free && b->size >= size) + if (b->free && b->size >= size) // Check if the block is free and fits the requested size. { - if (b->size - size < diff) + if (b->size - size < diff) // Update best fit if the current block is a closer match. { diff = b->size - size; best = b; } - if (diff == 0) - { // Perfect fit + if (diff == 0) // If the block perfectly fits, stop searching. + { break; } } *last = b; b = b->next; } - return best; + return best; // Return the best-fit block or NULL. } - else if (method == WORST_FIT) + else if (method == WORST_FIT) // Worst Fit strategy: find the largest block that fits. { - size_t max_size = 0; - t_block worst = NULL; + size_t max_size = 0; // Initialize the maximum size to 0. + t_block worst = NULL; // Pointer to the worst-fit block. while (b) { - if (b->free && b->size >= size) + if (b->free && b->size >= size) // Check if the block is free and fits the requested size. { - if (b->size > max_size) + if (b->size > max_size) // Update worst fit if the current block is larger. { max_size = b->size; worst = b; @@ -64,117 +64,114 @@ t_block find_block(t_block* last, size_t size) *last = b; b = b->next; } - return worst; + return worst; // Return the worst-fit block or NULL. } else { - // Default to First Fit if method is unrecognized + // Default to First Fit if the method is invalid or unrecognized. while (b && !(b->free && b->size >= size)) { *last = b; b = b->next; } - return b; + return b; // Return the found block or NULL. } } -// Function to split a memory block into two +/* Splits a memory block into two if it is larger than the requested size. */ void split_block(t_block b, size_t s) { - // Ensure there is enough space for the new block - if (b->size > s + BLOCK_SIZE) + if (b->size > s + BLOCK_SIZE) // Ensure there is enough space to split. { - t_block new_block = (t_block)(b->data + s); // Calculate address of the new block - new_block->size = b->size - s - BLOCK_SIZE; // Update size of the new block - new_block->next = b->next; // Link the new block to the next block - new_block->prev = b; // Update the previous link of the new block - new_block->free = TRUE; // Mark new block as free - new_block->ptr = new_block->data; // Set pointer to the data segment of the new block - - b->size = s; // Update the size of the current block - b->next = new_block; // Link current block to the new block + t_block new_block = (t_block)(b->data + s); // Calculate the address of the new block. + new_block->size = b->size - s - BLOCK_SIZE; // Adjust the size of the new block. + new_block->next = b->next; // Link the new block to the next block. + new_block->prev = b; // Set the previous block of the new block. + new_block->free = TRUE; // Mark the new block as free. + new_block->ptr = new_block->data; // Initialize the data pointer for the new block. + + b->size = s; // Update the size of the current block. + b->next = new_block; // Link the current block to the new block. if (new_block->next) { - new_block->next->prev = new_block; // Update the previous link of the next block + new_block->next->prev = new_block; // Update the previous link of the next block. } } } -// Function to extend the heap by creating a new block +/* Extends the heap by creating a new memory block. */ t_block extend_heap(t_block last, size_t s) { - t_block b; - b = mmap(0, s + BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + t_block b = mmap(0, s + BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); // Allocate memory. - if (b == MAP_FAILED) + if (b == MAP_FAILED) // Check if memory allocation failed. { return NULL; } - b->size = s; - b->next = NULL; - b->prev = last; - b->ptr = b->data; - b->free = 0; - b->alloc_method = method; + b->size = s; // Set the size of the new block. + b->next = NULL; // New block is at the end, so no next block. + b->prev = last; // Link the new block to the previous block. + b->ptr = b->data; // Initialize the data pointer. + b->free = 0; // Mark the block as allocated. + b->alloc_method = method; // Record the allocation method. if (last) - last->next = b; + last->next = b; // Link the previous block to the new block. - return b; + return b; // Return the new block. } -// Function to allocate memory +/* Allocates a block of memory of the requested size. */ void* malloc(size_t size) { - pthread_mutex_lock(&memory_mutex); + pthread_mutex_lock(&memory_mutex); // Lock the mutex for thread safety. - t_block b, last; - size_t s; - struct timespec start, end; + t_block b, last; // Variables for the current and last blocks. + size_t s; // Aligned size of the requested memory. + struct timespec start, end; // Variables for timing the operation. - // Start timing the allocation process - clock_gettime(CLOCK_MONOTONIC, &start); + clock_gettime(CLOCK_MONOTONIC, &start); // Start timing. - s = align(size); + s = align(size); // Align the requested size. - if (base) + if (base) // Check if the heap has been initialized. { last = base; - b = find_block(&last, s); + b = find_block(&last, s); // Try to find a suitable block. if (b) { - if ((b->size - s) >= (BLOCK_SIZE + BLOCK_THRESHOLD)) + if ((b->size - s) >= (BLOCK_SIZE + BLOCK_THRESHOLD)) // Check if the block can be split. { - split_block(b, s); + split_block(b, s); // Split the block if necessary. } - b->free = 0; + b->free = 0; // Mark the block as allocated. } else { - b = extend_heap(last, s); + b = extend_heap(last, s); // Extend the heap if no suitable block was found. if (!b) { - pthread_mutex_unlock(&memory_mutex); - return NULL; // Return NULL if heap extension failed + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. + return NULL; // Return NULL if the heap extension failed. } } } else { - b = extend_heap(NULL, s); + b = extend_heap(NULL, s); // Initialize the heap if it is empty. if (!b) { - pthread_mutex_unlock(&memory_mutex); - return NULL; // Return NULL if heap extension failed + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. + return NULL; // Return NULL if the heap extension failed. } - base = b; + base = b; // Set the base of the heap. } - b->alloc_method = method; - total_allocated_memory += b->size; - void* ptr = b->data; - log_mem_operation(MALLOC, ptr, size, &malloc_ctr); + b->alloc_method = method; // Record the allocation method for the block. + total_allocated_memory += b->size; // Update the total allocated memory. + void* ptr = b->data; // Get the pointer to the allocated data. + log_mem_operation(MALLOC, ptr, size, &malloc_ctr); // Log the memory allocation operation. - pthread_mutex_unlock(&memory_mutex); - return ptr; + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex after completing the allocation. + return ptr; // Return the pointer to the allocated memory. } diff --git a/src/memory.c b/src/memory.c index 986f15e..8c17e49 100644 --- a/src/memory.c +++ b/src/memory.c @@ -1,97 +1,106 @@ -#include "../include/memory.h" // Custom memory management header +#include "../include/memory.h" // Includes the custom memory management library header. -extern t_log_entry* log_head; // Head of the log list +extern t_log_entry* log_head; // External variable pointing to the head of the memory operation log list. -void* base = NULL; // Pointer to the beginning of the heap -int method = FIRST_FIT; // Memory allocation method (0 = First Fit, 1 = Best Fit) -int enable_unmapping = FALSE; // Enable unmapping of freed memory blocks -typedef struct s_block* t_block; -pthread_mutex_t memory_mutex = PTHREAD_MUTEX_INITIALIZER; // Mutex for thread safety +void* base = NULL; // Pointer to the beginning of the memory heap. +int method = FIRST_FIT; // Memory allocation method; default is First Fit (0). +int enable_unmapping = FALSE; // Flag to enable or disable unmapping of freed memory blocks. +typedef struct s_block* t_block; // Alias for a pointer to the `s_block` structure. +pthread_mutex_t memory_mutex = PTHREAD_MUTEX_INITIALIZER; // Mutex for synchronizing memory operations across threads. -// Memory amounts to be tracked -size_t total_allocated_memory = 0; -size_t total_freed_memory = 0; +// Memory usage statistics. +size_t total_allocated_memory = 0; // Tracks the total allocated memory. +size_t total_freed_memory = 0; // Tracks the total freed memory. +// Initializes the memory manager, setting up a recursive mutex for thread safety. void memory_manager_init() { pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&memory_mutex, &attr); - pthread_mutexattr_destroy(&attr); + pthread_mutexattr_init(&attr); // Initialize mutex attributes. + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); // Set mutex to recursive type. + pthread_mutex_init(&memory_mutex, &attr); // Initialize the mutex with the configured attributes. + pthread_mutexattr_destroy(&attr); // Destroy the mutex attributes as they are no longer needed. } +// Cleans up the memory manager by destroying the mutex. void memory_manager_cleanup() { - pthread_mutex_destroy(&memory_mutex); + pthread_mutex_destroy(&memory_mutex); // Destroy the mutex to release resources. } -// Function to get the block associated with a pointer +// Retrieves the memory block metadata associated with a given pointer. t_block get_block(void* p) { - if (p == NULL) + if (p == NULL) // If the pointer is null, return NULL. { return NULL; } + // Calculate the start of the block structure using the offset of the `data` field. return (t_block)((char*)p - offsetof(struct s_block, data)); } +// Sets the memory allocation method (First Fit, Best Fit, or Worst Fit). void set_method(int m) { - if (m == FIRST_FIT || m == BEST_FIT || m == WORST_FIT) + if (m == FIRST_FIT || m == BEST_FIT || m == WORST_FIT) // Check if the method is valid. { - method = m; + method = m; // Set the allocation method. } else { - printf("Error: invalid method\n"); + printf("Error: invalid method\n"); // Print an error if the method is invalid. } } +// Performs a diagnostic check on the heap, identifying potential issues. void check_heap(void) { - if (base == NULL) + if (base == NULL) // If the heap is empty, print a message and return. { printf("Heap is empty.\n"); return; } - t_block current = base; - printf(YELLOW "Heap check\n" RESET); - while (current != NULL) + t_block current = base; // Start at the base of the heap. + printf(YELLOW "Heap check\n" RESET); // Print a formatted header for the check. + while (current != NULL) // Iterate through all blocks in the heap. { + // Check for adjacent free blocks that are not fused together. if (current->free && current->next && current->next->free) { printf("%sWarning:%s Free blocks at %p and %p are adjacent but not fused.\n", RED, RESET, (void*)current, (void*)current->next); } + // Check if the block size is invalid. if (current->size <= 0) { printf("%sWarning:%sBlock at %p has invalid size %zu.\n", RED, RESET, (void*)current, current->size); } + // Print details of the current block. printf("Block at %p\n", (void*)current); printf(" Size: %zu\n", current->size); printf(" Free: %d\n", current->free); printf(" Next block: %p\n", (void*)(current->next)); printf(" Previous block: %p\n", (void*)(current->prev)); printf(" Data address: %p\n", current->ptr); - current = current->next; + current = current->next; // Move to the next block. } } +// Displays a summary of memory usage and the log of operations. void memory_usage(void) { - size_t current_allocated = total_allocated_memory - total_freed_memory; - printf(YELLOW "Memory Usage Report:\n" RESET); + size_t current_allocated = total_allocated_memory - total_freed_memory; // Calculate currently allocated memory. + printf(YELLOW "Memory Usage Report:\n" RESET); // Print a formatted header. printf(" Total allocated memory (since start): %zu bytes\n", total_allocated_memory); printf(" Total freed memory (since start): %zu bytes\n", total_freed_memory); printf(" Currently allocated memory: %zu bytes\n", current_allocated); - // Display the log entries + // Print the memory operation log. printf(BLUE "\nMemory Operation Log:\n" RESET); - t_log_entry* entry = log_head; + t_log_entry* entry = log_head; // Start at the head of the log list. - // Reverse the log list to print in chronological order + // Reverse the log list to print in chronological order. t_log_entry* reversed_log = NULL; while (entry) { @@ -101,9 +110,10 @@ void memory_usage(void) entry = next; } - entry = reversed_log; + entry = reversed_log; // Traverse the reversed list. while (entry) { + // Print each log entry with appropriate formatting based on operation type. switch (entry->type) { case MALLOC: @@ -119,6 +129,6 @@ void memory_usage(void) printf(GREEN "free [%d]" RESET " of %zu bytes from %p\n", entry->op_id, entry->size, entry->ptr); break; } - entry = entry->next; + entry = entry->next; // Move to the next log entry. } } From e3f7ee64c36b5a86baab79a95e43cd68935d66a8 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Tue, 26 Nov 2024 14:48:17 -0300 Subject: [PATCH 12/21] Comments --- include/calloc.h | 27 +++++++++--- include/free.h | 2 +- include/mem_logging.h | 76 +++++++++++++++++++++++--------- include/mem_metrics.h | 54 ++++++++++++++++++----- include/realloc.h | 38 +++++++++++----- src/calloc.c | 36 +++++++-------- src/free.c | 98 +++++++++++++++++++++++------------------ src/mem_logging.c | 51 ++++++++++++--------- src/mem_metrics.c | 100 +++++++++++++++++++++--------------------- src/realloc.c | 59 ++++++++++++++----------- 10 files changed, 336 insertions(+), 205 deletions(-) diff --git a/include/calloc.h b/include/calloc.h index 6a33ab9..fff7359 100644 --- a/include/calloc.h +++ b/include/calloc.h @@ -1,11 +1,24 @@ -#include "../include/memory.h" -#include "../include/malloc.h" +/** + * @file calloc.h + * @brief Header file for zero-initialized memory allocation. + * + * This header provides the prototype for the `calloc` function, which allocates + * memory for an array of elements and initializes all bytes to zero. It leverages + * the custom memory allocation system defined in the custom memory allocator. + */ + +#include "../include/memory.h" ///< Includes definitions for memory management structures and constants. +#include "../include/malloc.h" ///< Includes memory allocation functionality for custom allocator. /** - * @brief Asigna un bloque de memoria para un número de elementos, inicializándolo a cero. + * @brief Allocates memory for an array of elements and initializes all bytes to zero. + * + * This function calculates the total memory required for an array with the given + * number of elements and element size, allocates the memory, and sets all bytes + * in the allocated memory to zero. * - * @param number Número de elementos. - * @param size Tamaño de cada elemento. - * @return void* Puntero al área de datos asignada e inicializada. + * @param number Number of elements to allocate memory for. + * @param size Size of each element in bytes. + * @return void* Pointer to the allocated and zero-initialized memory, or NULL if the allocation fails. */ -void* calloc(size_t number, size_t size); \ No newline at end of file +void* calloc(size_t number, size_t size); diff --git a/include/free.h b/include/free.h index cf19ca3..6ffe9f8 100644 --- a/include/free.h +++ b/include/free.h @@ -7,8 +7,8 @@ * These functions are part of the custom memory allocator. */ -#include "../include/memory.h" ///< Includes definitions for memory management structures and constants. #include "../include/mem_logging.h" ///< Provides functionality for logging memory operations. +#include "../include/memory.h" ///< Includes definitions for memory management structures and constants. /** * @brief Merges a free memory block with adjacent free blocks. diff --git a/include/mem_logging.h b/include/mem_logging.h index d3b4df0..caaa114 100644 --- a/include/mem_logging.h +++ b/include/mem_logging.h @@ -1,31 +1,67 @@ -#include // Include stdint for fixed-width types -#include // Include for logging -#include // Include for memset function -#include -#include // Include for timestamp +/** + * @file mem_logging.h + * @brief Header file for memory operation logging. + * + * This file defines structures, constants, and function prototypes for logging + * memory allocation and deallocation operations in a custom memory management system. + * It tracks memory usage and logs operations such as malloc, calloc, realloc, and free. + */ -#define LOG_FILE_PATH "/home/ignacio/iledesma/imem/memory_log.txt" +#include ///< Provides fixed-width integer types for consistency. +#include ///< Includes standard I/O functions for logging operations. +#include ///< Provides memory manipulation functions like memset. +#include ///< Includes memory mapping functions for dynamic memory management. +#include ///< Provides utilities for time-stamping operations. -// Time variables used for logging -#define NANOSECONDS_IN_SECOND 1000000000 +/** + * @def LOG_FILE_PATH + * Path to the log file where memory operations are recorded. + */ +#define LOG_FILE_PATH "/home/ignacio/iledesma/imem/memory_log.txt" +/** + * @enum alloc_type + * @brief Enumeration of memory operation types. + * + * Represents the type of memory operation being logged. Includes allocation, + * reallocation, and deallocation operations. + */ typedef enum { - MALLOC, - CALLOC, - REALLOC, - FREE + MALLOC, ///< Memory allocated using malloc. + CALLOC, ///< Memory allocated using calloc. + REALLOC, ///< Memory reallocated using realloc. + FREE ///< Memory deallocated using free. } alloc_type; +/** + * @struct log_entry + * @brief Represents a log entry for a memory operation. + * + * A linked list structure that stores details of a memory operation, including + * the type of operation, memory block pointer, size, and operation-specific data. + */ typedef struct log_entry { - alloc_type type; - void* ptr; - size_t size; - size_t total_allocated; - size_t total_freed; - struct log_entry* next; - unsigned long op_id; + alloc_type type; ///< Type of the memory operation (e.g., MALLOC, FREE). + void* ptr; ///< Pointer to the memory block involved in the operation. + size_t size; ///< Size of the memory block. + size_t total_allocated; ///< Total memory allocated at the time of the operation. + size_t total_freed; ///< Total memory freed at the time of the operation. + struct log_entry* next; ///< Pointer to the next log entry in the list. + unsigned long op_id; ///< Unique identifier for the memory operation. } t_log_entry; -void log_mem_operation(alloc_type type, void *ptr, size_t size, unsigned long *op_ctr); \ No newline at end of file +/** + * @brief Logs a memory operation. + * + * Creates a new log entry for a memory operation and adds it to the log list. + * Each entry stores information about the operation type, memory block, size, + * and current memory usage statistics. + * + * @param type The type of memory operation (e.g., MALLOC, FREE). + * @param ptr Pointer to the memory block involved in the operation. + * @param size Size of the memory block in bytes. + * @param op_ctr Pointer to the operation counter, used to assign a unique ID. + */ +void log_mem_operation(alloc_type type, void* ptr, size_t size, unsigned long* op_ctr); diff --git a/include/mem_metrics.h b/include/mem_metrics.h index 0c0f46d..cf19db8 100644 --- a/include/mem_metrics.h +++ b/include/mem_metrics.h @@ -1,10 +1,44 @@ -#include "../include/memory.h" -#include "../include/malloc.h" -#include "../include/calloc.h" -#include "../include/realloc.h" -#include "../include/free.h" - -#define ALLOCATION_SIZE_MAX 1024 // Define a suitable maximum allocation size -#define ALLOCATION_SIZE_MIN 1 // Define a suitable minimum allocation size -#define NUM_ALLOCATIONS 1000 // Define the number of allocations for the test -#define TO_PERCENTAGE_MULTIPLIER 100 // Multiplier to convert to percentage \ No newline at end of file +/** + * @file mem_metrics.h + * @brief Header file for memory allocator performance and fragmentation metrics. + * + * This file provides constants and function prototypes for calculating memory + * fragmentation, measuring allocator efficiency, and managing the state of a custom + * memory allocator. + */ + +#include "../include/memory.h" ///< Includes core memory management structures and definitions. +#include "../include/malloc.h" ///< Includes functionality for memory allocation. +#include "../include/calloc.h" ///< Includes functionality for zero-initialized memory allocation. +#include "../include/realloc.h" ///< Includes functionality for memory reallocation. +#include "../include/free.h" ///< Includes functionality for freeing memory blocks. + +/** + * @def ALLOCATION_SIZE_MAX + * Maximum size for a single memory allocation in performance tests. + */ +#define ALLOCATION_SIZE_MAX 1024 + +/** + * @def ALLOCATION_SIZE_MIN + * Minimum size for a single memory allocation in performance tests. + */ +#define ALLOCATION_SIZE_MIN 1 + +/** + * @def NUM_ALLOCATIONS + * Number of memory allocations to perform during the efficiency test. + */ +#define NUM_ALLOCATIONS 1000 + +/** + * @def TO_PERCENTAGE_MULTIPLIER + * Multiplier used to convert fragmentation values to percentages. + */ +#define TO_PERCENTAGE_MULTIPLIER 100 + +/** + * @def NANOSECONDS_IN_SECOND + * Defines the number of nanoseconds in one second, used for time-related calculations. + */ +#define NANOSECONDS_IN_SECOND 1000000000 diff --git a/include/realloc.h b/include/realloc.h index ae83a77..f9d921b 100644 --- a/include/realloc.h +++ b/include/realloc.h @@ -1,20 +1,38 @@ -#include "../include/memory.h" -#include "../include/free.h" -#include "../include/malloc.h" +/** + * @file realloc.h + * @brief Header file for memory reallocation functions. + * + * This header defines the prototypes for functions that handle resizing + * memory blocks and copying data between them. These functions are part + * of the custom memory allocator and ensure efficient memory management. + */ + +#include "../include/memory.h" ///< Includes definitions for memory structures and constants. +#include "../include/free.h" ///< Includes functionality for freeing memory blocks. +#include "../include/malloc.h" ///< Includes functionality for memory allocation. /** - * @brief Copia el contenido de un bloque de origen a un bloque de destino. + * @brief Copies the contents of a source memory block to a destination block. + * + * Transfers the data from the source block to the destination block, ensuring + * that no more data is copied than the size of either block. This function is + * useful during memory reallocation when the block size changes. * - * @param src Bloque de origen. - * @param dst Bloque de destino. + * @param src Pointer to the source memory block. + * @param dst Pointer to the destination memory block. */ void copy_block(t_block src, t_block dst); /** - * @brief Cambia el tamaño de un bloque de memoria previamente asignado. + * @brief Resizes a previously allocated memory block. + * + * Changes the size of an allocated memory block, preserving the existing data + * up to the smaller of the old and new sizes. If the block needs to be moved, + * a new block is allocated, and the old block's data is copied. The old block + * is then freed. * - * @param p Puntero al área de datos a redimensionar. - * @param size Nuevo tamaño en bytes. - * @return void* Puntero al área de datos redimensionada. + * @param p Pointer to the memory block to be resized. + * @param size New size in bytes for the memory block. + * @return void* Pointer to the resized memory block, or NULL if reallocation fails. */ void* realloc(void* p, size_t size); diff --git a/src/calloc.c b/src/calloc.c index a9f493d..fb67934 100644 --- a/src/calloc.c +++ b/src/calloc.c @@ -1,39 +1,39 @@ -#include "../include/calloc.h" +#include "../include/calloc.h" // Include the header file for calloc functionality. -extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations -unsigned long calloc_ctr = 0; +extern pthread_mutex_t memory_mutex; // Mutex for thread-safe memory operations. +unsigned long calloc_ctr = 0; // Counter to track the number of calloc operations performed. -// Function to allocate zero-initialized memory +/* Allocates memory for an array of elements, initializing all elements to zero. */ void* calloc(size_t number, size_t size) { - pthread_mutex_lock(&memory_mutex); + pthread_mutex_lock(&memory_mutex); // Lock the mutex to ensure thread safety. - // Calculate the total size to allocate + // Calculate the total size of memory required. size_t total_size = number * size; - if (total_size == 0) + if (total_size == 0) // If the calculated size is zero, return NULL. { - pthread_mutex_unlock(&memory_mutex); + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. return NULL; } - // Allocate the memory using malloc + // Allocate the memory using malloc, leveraging the existing allocation logic. void* ptr = malloc(total_size); - if (ptr == NULL) + if (ptr == NULL) // Check if the allocation was successful. { - pthread_mutex_unlock(&memory_mutex); - return NULL; // Return NULL if memory allocation failed + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. + return NULL; // Return NULL if allocation failed. } - // Zero-initialize the allocated memory - char* char_ptr = (char*)ptr; + // Initialize the allocated memory to zero byte by byte. + char* char_ptr = (char*)ptr; // Cast the pointer to a character pointer for byte-wise access. for (size_t i = 0; i < total_size; i++) { - char_ptr[i] = 0; + char_ptr[i] = 0; // Set each byte to zero. } - // Log the calloc operation + // Log the calloc operation for tracking and debugging purposes. log_mem_operation(CALLOC, ptr, total_size, &calloc_ctr); - pthread_mutex_unlock(&memory_mutex); - return ptr; + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex after completing the operation. + return ptr; // Return the pointer to the zero-initialized memory. } diff --git a/src/free.c b/src/free.c index 6f3f43f..4cbe9f2 100644 --- a/src/free.c +++ b/src/free.c @@ -1,102 +1,112 @@ -#include "../include/free.h" +#include "../include/free.h" // Include header for free-related functions and definitions. -extern void* base; // Base of the heap -extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations -extern int enable_unmapping; -extern size_t total_freed_memory; -unsigned long free_ctr = 0; +extern void* base; // Pointer to the start of the heap. +extern pthread_mutex_t memory_mutex; // Mutex for thread-safe memory operations. +extern int enable_unmapping; // Flag to enable or disable unmapping of memory blocks. +extern size_t total_freed_memory; // Tracks the total memory freed by the allocator. +unsigned long free_ctr = 0; // Counter for the number of free operations performed. +/* Merges a block with adjacent free blocks, both forward and backward, if possible. */ t_block fusion(t_block b) { - // Fuse with next blocks + // Merge with subsequent free blocks. while (b->next && b->next->free) { - t_block next_block = b->next; - b->size += BLOCK_SIZE + next_block->size; - b->next = next_block->next; + t_block next_block = b->next; // Get the next block. + b->size += BLOCK_SIZE + next_block->size; // Increase the current block size. + b->next = next_block->next; // Update the link to skip the merged block. if (b->next) - b->next->prev = b; + b->next->prev = b; // Update the previous pointer of the next block. } - // Fuse with previous blocks + // Merge with previous free blocks. while (b->prev && b->prev->free) { - t_block prev_block = b->prev; - prev_block->size += BLOCK_SIZE + b->size; - prev_block->next = b->next; + t_block prev_block = b->prev; // Get the previous block. + prev_block->size += BLOCK_SIZE + b->size; // Increase the previous block size. + prev_block->next = b->next; // Update the link to skip the merged block. if (b->next) - b->next->prev = prev_block; - b = prev_block; + b->next->prev = prev_block; // Update the previous pointer of the next block. + b = prev_block; // Move to the previous block as the new reference. } - return b; + return b; // Return the fused block. } -// Function to check if a pointer is valid and part of the heap +/* Verifies if a pointer is valid and belongs to a memory block in the heap. */ int valid_addr(void* p) { - if (p == NULL || base == NULL) + if (p == NULL || base == NULL) // Check if the pointer or heap base is null. { - return 0; + return 0; // Invalid address. } - t_block b = get_block(p); - t_block current = base; + t_block b = get_block(p); // Retrieve the block metadata for the pointer. + t_block current = base; // Start checking from the base of the heap. + + // Traverse the heap to find the block. while (current) { - if (current == b) + if (current == b) // If the block matches the metadata. { - return (current->ptr == p); + return (current->ptr == p); // Validate that the pointer matches the block's data pointer. } - current = current->next; + current = current->next; // Move to the next block. } - return INVALID_ADDRESS; + return INVALID_ADDRESS; // Return invalid if the block is not found. } +/* Frees a memory block and optionally unmaps it if it is at the end of the heap. */ void free(void* ptr, int unmap_flag) { - pthread_mutex_lock(&memory_mutex); - if (ptr == NULL) + pthread_mutex_lock(&memory_mutex); // Lock the mutex for thread safety. + + if (ptr == NULL) // If the pointer is null, there's nothing to free. { - pthread_mutex_unlock(&memory_mutex); + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. return; } t_block b; - if (valid_addr(ptr)) + if (valid_addr(ptr)) // Check if the pointer is valid. { - b = get_block(ptr); - b->free = TRUE; + b = get_block(ptr); // Retrieve the block metadata. + b->free = TRUE; // Mark the block as free. - // Fuse with adjacent free blocks + // Merge with adjacent free blocks. b = fusion(b); + + // Update the total freed memory. total_freed_memory += b->size; + + // Log the free operation. log_mem_operation(FREE, ptr, b->size, &free_ctr); + // If unmap_flag is set and the block is at the end of the heap. if (unmap_flag && b->next == NULL) { - if (b->prev) + if (b->prev) // If there is a previous block, update its next pointer. { b->prev->next = NULL; } else { - base = NULL; // This was the base block, and there are no other blocks + base = NULL; // If this is the only block, reset the heap base. } - // Check if we should unmap this block + // Check if the block should be unmapped. if (enable_unmapping && b->free) { - size_t total_size = b->size + BLOCK_SIZE; + size_t total_size = b->size + BLOCK_SIZE; // Calculate the total size of the block. printf("Unmapping block at %p with size: %zu\n", (void*)b, total_size); - // Unmap only when you are sure it is not used elsewhere + // Attempt to unmap the block from memory. if (munmap(b, total_size) == -1) { - perror("munmap"); + perror("munmap"); // Print an error if unmapping fails. } else { - // Reset base if it was pointing to this unmapped block + // Reset the base pointer if it was pointing to the unmapped block. if (base == b) { base = NULL; @@ -107,7 +117,9 @@ void free(void* ptr, int unmap_flag) } else { - printf("Failed attempt to free - %sInvalid Adress%s: %p\n", RED, RESET, ptr); + // Print an error message for an invalid pointer. + printf("Failed attempt to free - %sInvalid Address%s: %p\n", RED, RESET, ptr); } - pthread_mutex_unlock(&memory_mutex); + + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex after completing the operation. } diff --git a/src/mem_logging.c b/src/mem_logging.c index cc6f9cd..8f8eb0f 100644 --- a/src/mem_logging.c +++ b/src/mem_logging.c @@ -1,38 +1,47 @@ -#include "mem_logging.h" +#include "mem_logging.h" // Include the header file for memory logging functionality. -extern size_t total_allocated_memory; // Total allocated memory -extern size_t total_freed_memory; // Total freed memory +extern size_t total_allocated_memory; // Tracks the total amount of memory allocated. +extern size_t total_freed_memory; // Tracks the total amount of memory freed. -t_log_entry* log_head = NULL; // Head of the log list +t_log_entry* log_head = NULL; // Pointer to the head of the linked list for log entries. +/* Logs a memory operation by creating a new log entry and adding it to the log list. */ void log_mem_operation(alloc_type type, void* ptr, size_t size, unsigned long* op_ctr) { + // Allocate memory for a new log entry using mmap. t_log_entry* entry = mmap(NULL, sizeof(t_log_entry), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (entry == MAP_FAILED) + + if (entry == MAP_FAILED) // Check if the memory allocation failed. { - // Use write or fprintf to stderr to avoid using printf + // Print an error message to stderr if the allocation failed. fprintf(stderr, "Failed to allocate memory for log entry.\n"); - return; + return; // Exit the function without logging. } - entry->type = type; - entry->ptr = ptr; - entry->size = size; - entry->total_allocated = total_allocated_memory; - entry->total_freed = total_freed_memory; - entry->next = log_head; - entry->op_id = *op_ctr; - (*op_ctr)++; - log_head = entry; + + // Populate the log entry with details about the memory operation. + entry->type = type; // Type of memory operation (e.g., MALLOC, FREE). + entry->ptr = ptr; // Pointer to the memory block involved in the operation. + entry->size = size; // Size of the memory block. + entry->total_allocated = total_allocated_memory; // Total allocated memory at the time of the operation. + entry->total_freed = total_freed_memory; // Total freed memory at the time of the operation. + entry->next = log_head; // Link the new entry to the current head of the log list. + entry->op_id = *op_ctr; // Assign a unique operation ID to the log entry. + (*op_ctr)++; // Increment the operation counter. + log_head = entry; // Update the head of the log list to the new entry. } +/* Clears all log entries by unmapping each one and resetting the log list. */ void clear_logs(void) { - t_log_entry* entry = log_head; + t_log_entry* entry = log_head; // Start at the head of the log list. + + // Traverse the log list and unmap each entry. while (entry) { - t_log_entry* next = entry->next; - munmap(entry, sizeof(t_log_entry)); - entry = next; + t_log_entry* next = entry->next; // Save the pointer to the next log entry. + munmap(entry, sizeof(t_log_entry)); // Unmap the current log entry from memory. + entry = next; // Move to the next entry in the list. } - log_head = NULL; + + log_head = NULL; // Reset the head of the log list to indicate it is empty. } diff --git a/src/mem_metrics.c b/src/mem_metrics.c index c5eba1a..75f5db9 100644 --- a/src/mem_metrics.c +++ b/src/mem_metrics.c @@ -1,40 +1,40 @@ -#include "../include/mem_metrics.h" +#include "../include/mem_metrics.h" // Include the header for memory metrics functionality. -// Access external variables from memory.c -extern void* base; -extern size_t total_allocated_memory; -extern size_t total_freed_memory; -extern int enable_unmapping; +// External variables from memory.c for accessing heap state and memory statistics. +extern void* base; // Pointer to the start of the heap. +extern size_t total_allocated_memory; // Total memory allocated during program execution. +extern size_t total_freed_memory; // Total memory freed during program execution. +extern int enable_unmapping; // Flag to enable or disable unmapping of memory blocks. -// Implement calculate_fragmentation_per_method() +/* Calculates fragmentation for each memory allocation method. */ void calculate_fragmentation_per_method(double* fragmentation_rates) { - if (base == NULL) + if (base == NULL) // If the heap is empty, there's nothing to calculate. { printf("No blocks to calculate fragmentation.\n"); - for (int m = 0; m < ALLOC_METHODS; m++) + for (int m = 0; m < ALLOC_METHODS; m++) // Set fragmentation rates to 0 for all methods. { fragmentation_rates[m] = 0.0; } return; } - size_t total_free[ALLOC_METHODS] = {0}; - size_t largest_free_block[ALLOC_METHODS] = {0}; - size_t total_allocated[ALLOC_METHODS] = {0}; + size_t total_free[ALLOC_METHODS] = {0}; // Total free memory for each method. + size_t largest_free_block[ALLOC_METHODS] = {0}; // Largest free block for each method. + size_t total_allocated[ALLOC_METHODS] = {0}; // Total allocated memory for each method. - t_block current_block = base; + t_block current_block = base; // Start from the base of the heap. while (current_block) { - int m = current_block->alloc_method; // Allocation method - if (m < 0 || m >= ALLOC_METHODS) + int m = current_block->alloc_method; // Get the allocation method for the block. + if (m < 0 || m >= ALLOC_METHODS) // Skip invalid methods. { printf("Invalid allocation method in block at %p\n", (void*)current_block); current_block = current_block->next; continue; } - if (current_block->free) + if (current_block->free) // If the block is free, update free memory stats. { total_free[m] += current_block->size; if (current_block->size > largest_free_block[m]) @@ -42,7 +42,7 @@ void calculate_fragmentation_per_method(double* fragmentation_rates) largest_free_block[m] = current_block->size; } } - else + else // If the block is allocated, update allocated memory stats. { total_allocated[m] += current_block->size; } @@ -51,18 +51,18 @@ void calculate_fragmentation_per_method(double* fragmentation_rates) for (int m = 0; m < ALLOC_METHODS; m++) { - size_t total_memory = total_free[m] + total_allocated[m]; + size_t total_memory = total_free[m] + total_allocated[m]; // Total memory for the method. double external_fragmentation = 0.0; - if (total_free[m] > 0) + if (total_free[m] > 0) // Calculate fragmentation if there's free memory. { external_fragmentation = ((double)(total_free[m] - largest_free_block[m]) / (double)total_free[m]) * TO_PERCENTAGE_MULTIPLIER; } - fragmentation_rates[m] = external_fragmentation; + fragmentation_rates[m] = external_fragmentation; // Store the calculated fragmentation rate. - // Print the fragmentation report for each method + // Print fragmentation details for the current allocation method. const char* method_name = (m == FIRST_FIT) ? "First Fit" : (m == BEST_FIT) ? "Best Fit" : (m == WORST_FIT) ? "Worst Fit" @@ -77,39 +77,41 @@ void calculate_fragmentation_per_method(double* fragmentation_rates) } } -// Implement get_time_in_seconds() +/* Returns the current time in seconds, combining seconds and nanoseconds. */ double get_time_in_seconds(void) { struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - return ts.tv_sec + ts.tv_nsec / NANOSECONDS_IN_SECOND; + clock_gettime(CLOCK_MONOTONIC, &ts); // Get the current time. + return ts.tv_sec + ts.tv_nsec / NANOSECONDS_IN_SECOND; // Convert to seconds. } +/* Tests the efficiency of the allocator by measuring allocation and deallocation times. */ void efficiency_test(void) { - enable_unmapping = FALSE; // Disable unmapping during the test + enable_unmapping = FALSE; // Disable unmapping during the test to avoid overhead. + // Allocate arrays for pointers and sizes. void** pointers = malloc(NUM_ALLOCATIONS * sizeof(void*)); size_t* sizes = malloc(NUM_ALLOCATIONS * sizeof(size_t)); - if (!pointers || !sizes) + if (!pointers || !sizes) // Check if memory allocation for test arrays failed. { fprintf(stderr, "Memory allocation failed for test arrays.\n"); exit(1); } - // Generate random sizes + // Generate random sizes for allocations. srand(time(NULL)); for (int i = 0; i < NUM_ALLOCATIONS; i++) { sizes[i] = rand() % ALLOCATION_SIZE_MAX + ALLOCATION_SIZE_MIN; } - // Measure allocation time + // Measure the time to allocate memory. double start_time = get_time_in_seconds(); for (int i = 0; i < NUM_ALLOCATIONS; i++) { pointers[i] = malloc(sizes[i]); - if (!pointers[i]) + if (!pointers[i]) // Check if allocation failed for any pointer. { fprintf(stderr, "Allocation failed at iteration %d\n", i); exit(1); @@ -117,53 +119,52 @@ void efficiency_test(void) } double allocation_time = get_time_in_seconds() - start_time; - // Measure deallocation time + // Measure the time to deallocate memory. start_time = get_time_in_seconds(); for (int i = 0; i < NUM_ALLOCATIONS; i++) { - // Free all pointers if (pointers[i]) { - free(pointers[i], TRUE); // Allow unmapping after free in normal cases - pointers[i] = NULL; // Prevent double free + free(pointers[i], TRUE); // Free each pointer, allowing unmapping. + pointers[i] = NULL; // Nullify the pointer to prevent double free. } - // Free all sizes - if (sizes[i]) + if (sizes[i]) // Reset size values to avoid reuse. { - free(sizes[i], TRUE); // Allow unmapping after free in normal cases - sizes[i] = 0; // Prevent double free + free(sizes[i], TRUE); + sizes[i] = 0; } } double deallocation_time = get_time_in_seconds() - start_time; - // Print results + // Print the results of the efficiency test. printf(BLUE "Efficiency Test Results:\n" RESET); printf("\tAllocation time: %.6f seconds\n", allocation_time); printf("\tDeallocation time: %.6f seconds\n", deallocation_time); - // Calculate fragmentation after test + // Calculate and print fragmentation after the test. double fragmentation_rates[ALLOC_METHODS]; calculate_fragmentation_per_method(fragmentation_rates); - enable_unmapping = TRUE; // Re-enable unmapping after the test + enable_unmapping = TRUE; // Re-enable unmapping after the test. } +/* Clears all blocks and resets the allocator to its initial state. */ void clear_allocator(void) { - enable_unmapping = 1; // Ensure unmapping is enabled + enable_unmapping = 1; // Enable unmapping to release memory. - if (base == NULL) + if (base == NULL) // If the heap is empty, nothing to clear. { printf("No blocks to clear. The allocator is empty.\n"); return; } - t_block current_block = base; - while (current_block) + t_block current_block = base; // Start at the base of the heap. + while (current_block) // Traverse the heap to unmap all blocks. { - t_block next = current_block->next; + t_block next = current_block->next; // Save the next block pointer. size_t total_size = current_block->size + BLOCK_SIZE; - if (munmap(current_block, total_size) == -1) + if (munmap(current_block, total_size) == -1) // Attempt to unmap the current block. { perror("munmap failed"); } @@ -171,15 +172,14 @@ void clear_allocator(void) { printf("Unmapped block at %p, size: %zu\n", (void*)current_block, total_size); } - current_block = next; + current_block = next; // Move to the next block. } - // Reset global allocator state + // Reset global variables to their initial state. base = NULL; total_allocated_memory = 0; total_freed_memory = 0; - // Clear logs - clear_logs(); + clear_logs(); // Clear the memory operation logs. printf("Allocator state cleared and logs cleared.\n"); } diff --git a/src/realloc.c b/src/realloc.c index 8ef299d..bba91af 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -1,57 +1,66 @@ -#include "../include/realloc.h" +#include "../include/realloc.h" // Include header file for realloc-related functions and definitions. -extern pthread_mutex_t memory_mutex; // Mutex to synchronize memory operations -unsigned long realloc_ctr = 0; +extern pthread_mutex_t memory_mutex; // Mutex for thread-safe memory operations. +unsigned long realloc_ctr = 0; // Counter to track the number of realloc operations performed. -// Function to copy data from one block to another +/* Copies data from a source memory block to a destination memory block. */ void copy_block(t_block src, t_block dst) { - size_t *sdata, *ddata; - size_t i; - sdata = src->ptr; - ddata = dst->ptr; + size_t *sdata, *ddata; // Pointers for source and destination data. + size_t i; // Loop index for copying data. + + sdata = src->ptr; // Get the pointer to the source data. + ddata = dst->ptr; // Get the pointer to the destination data. + + // Copy data byte by byte while ensuring it fits within both blocks' sizes. for (i = 0; i * sizeof(size_t) < src->size && i * sizeof(size_t) < dst->size; i++) ddata[i] = sdata[i]; } -// Function to reallocate memory +/* Reallocates memory, resizing the block to the specified size. */ void* realloc(void* ptr, size_t size) { - pthread_mutex_lock(&memory_mutex); + pthread_mutex_lock(&memory_mutex); // Lock the mutex for thread-safe operation. - if (ptr == NULL) + if (ptr == NULL) // If the pointer is NULL, realloc behaves like malloc. { - pthread_mutex_unlock(&memory_mutex); - return malloc(size); + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. + return malloc(size); // Allocate a new block of the requested size. } - t_block b = get_block(ptr); + t_block b = get_block(ptr); // Retrieve the block metadata for the pointer. + + // Check if the pointer is valid and belongs to the heap. if (!valid_addr(ptr) || b == NULL) { - pthread_mutex_unlock(&memory_mutex); - return NULL; // Invalid address, return NULL to prevent undefined behavior + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. + return NULL; // Return NULL for invalid address or metadata issues. } - if (b->size >= size) + if (b->size >= size) // If the current block size is already sufficient. { - pthread_mutex_unlock(&memory_mutex); - return ptr; + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. + return ptr; // Return the original pointer. } + // Allocate a new block with the requested size. void* new_ptr = malloc(size); - if (new_ptr) + if (new_ptr) // Check if the allocation was successful. { - char *src = (char*)ptr, *dest = (char*)new_ptr; + char *src = (char*)ptr, *dest = (char*)new_ptr; // Cast pointers for byte-wise copying. + + // Copy data from the original block to the new block. for (size_t i = 0; i < b->size; i++) { dest[i] = src[i]; } - free(ptr, FALSE); // Do not unmap during reallocation - // Log the realloc operation + free(ptr, FALSE); // Free the old block without unmapping it. + + // Log the realloc operation for debugging and tracking. log_mem_operation(REALLOC, new_ptr, size, &realloc_ctr); } - pthread_mutex_unlock(&memory_mutex); - return new_ptr; + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex after completing the operation. + return new_ptr; // Return the pointer to the newly allocated memory. } From 09b50b378874ec0be3755eaac7dd091945c38f89 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Tue, 26 Nov 2024 17:48:45 -0300 Subject: [PATCH 13/21] More comments --- CMakeLists.txt | 2 +- include/calloc.h | 4 +- include/free.h | 2 +- include/malloc.h | 2 +- include/mem_logging.h | 48 +++++++++-------- include/mem_metrics.h | 57 ++++++++++++++++++-- include/memory.h | 122 ++++++++++++++++++++++++++---------------- include/realloc.h | 8 +-- src/calloc.c | 5 +- src/free.c | 5 +- src/main.c | 6 +++ src/malloc.c | 10 ++-- src/mem_logging.c | 24 ++++----- src/mem_metrics.c | 58 +++++++++++--------- src/memory.c | 8 +-- src/realloc.c | 18 +++---- 16 files changed, 229 insertions(+), 150 deletions(-) create mode 100644 src/main.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 05f2d5c..32b687b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,4 +14,4 @@ set(CMAKE_C_FLAGS_RELEASE "-O0 -Wall -Wextra -Wpedantic -Werror -Wunused-paramet set(CMAKE_C_FLAGS_DEBUG "-g -O0 -fprofile-arcs -ftest-coverage -Wall -Wextra -Wpedantic -Werror -Wunused-parameter -Wmissing-prototypes -Wstrict-prototypes") # Add executable for the main project -add_executable(${PROJECT_NAME} src/main.c src/memory.c src/malloc.c src/free.c src/realloc.c src/calloc.c src/mem_logging.c) \ No newline at end of file +add_executable(${PROJECT_NAME} src/main.c src/memory.c src/malloc.c src/free.c src/realloc.c src/calloc.c src/mem_logging.c src/mem_metrics.c) \ No newline at end of file diff --git a/include/calloc.h b/include/calloc.h index fff7359..acdf20a 100644 --- a/include/calloc.h +++ b/include/calloc.h @@ -7,8 +7,8 @@ * the custom memory allocation system defined in the custom memory allocator. */ -#include "../include/memory.h" ///< Includes definitions for memory management structures and constants. #include "../include/malloc.h" ///< Includes memory allocation functionality for custom allocator. +#include "../include/memory.h" ///< Includes definitions for memory management structures and constants. /** * @brief Allocates memory for an array of elements and initializes all bytes to zero. @@ -21,4 +21,4 @@ * @param size Size of each element in bytes. * @return void* Pointer to the allocated and zero-initialized memory, or NULL if the allocation fails. */ -void* calloc(size_t number, size_t size); +void* my_calloc(size_t number, size_t size); diff --git a/include/free.h b/include/free.h index 6ffe9f8..5363eb2 100644 --- a/include/free.h +++ b/include/free.h @@ -43,4 +43,4 @@ int valid_addr(void* p); * @param ptr Pointer to the memory block to be freed. * @param unmap_flag Flag indicating whether to unmap the memory block if possible. */ -void free(void* ptr, int unmap_flag); +void my_free(void* ptr, int unmap_flag); diff --git a/include/malloc.h b/include/malloc.h index 11610ca..17c26a8 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -57,4 +57,4 @@ t_block extend_heap(t_block last, size_t s); * @param size Requested size in bytes for the memory block. * @return void* Pointer to the allocated memory block, or NULL if allocation fails. */ -void* malloc(size_t size); +void* my_malloc(size_t size); diff --git a/include/mem_logging.h b/include/mem_logging.h index caaa114..7b63335 100644 --- a/include/mem_logging.h +++ b/include/mem_logging.h @@ -7,20 +7,14 @@ * It tracks memory usage and logs operations such as malloc, calloc, realloc, and free. */ -#include ///< Provides fixed-width integer types for consistency. -#include ///< Includes standard I/O functions for logging operations. -#include ///< Provides memory manipulation functions like memset. -#include ///< Includes memory mapping functions for dynamic memory management. -#include ///< Provides utilities for time-stamping operations. +#include ///< Provides utilities for time-stamping operations. +#include ///< Provides fixed-width integer types for consistency. +#include ///< Includes standard I/O functions for logging operations. +#include ///< Provides memory manipulation functions like memset. +#include ///< Includes memory mapping functions for dynamic memory management. /** - * @def LOG_FILE_PATH - * Path to the log file where memory operations are recorded. - */ -#define LOG_FILE_PATH "/home/ignacio/iledesma/imem/memory_log.txt" - -/** - * @enum alloc_type + * @enum alloc_op * @brief Enumeration of memory operation types. * * Represents the type of memory operation being logged. Includes allocation, @@ -28,11 +22,11 @@ */ typedef enum { - MALLOC, ///< Memory allocated using malloc. - CALLOC, ///< Memory allocated using calloc. + MALLOC, ///< Memory allocated using malloc. + CALLOC, ///< Memory allocated using calloc. REALLOC, ///< Memory reallocated using realloc. - FREE ///< Memory deallocated using free. -} alloc_type; + FREE ///< Memory deallocated using free. +} alloc_op; /** * @struct log_entry @@ -43,13 +37,13 @@ typedef enum */ typedef struct log_entry { - alloc_type type; ///< Type of the memory operation (e.g., MALLOC, FREE). - void* ptr; ///< Pointer to the memory block involved in the operation. - size_t size; ///< Size of the memory block. + alloc_op op; ///< Type of the memory operation (e.g., MALLOC, FREE). + void* ptr; ///< Pointer to the memory block involved in the operation. + size_t size; ///< Size of the memory block. size_t total_allocated; ///< Total memory allocated at the time of the operation. - size_t total_freed; ///< Total memory freed at the time of the operation. + size_t total_freed; ///< Total memory freed at the time of the operation. struct log_entry* next; ///< Pointer to the next log entry in the list. - unsigned long op_id; ///< Unique identifier for the memory operation. + unsigned long op_id; ///< Unique identifier for the memory operation. } t_log_entry; /** @@ -59,9 +53,17 @@ typedef struct log_entry * Each entry stores information about the operation type, memory block, size, * and current memory usage statistics. * - * @param type The type of memory operation (e.g., MALLOC, FREE). + * @param op The type of memory operation (e.g., MALLOC, FREE). * @param ptr Pointer to the memory block involved in the operation. * @param size Size of the memory block in bytes. * @param op_ctr Pointer to the operation counter, used to assign a unique ID. */ -void log_mem_operation(alloc_type type, void* ptr, size_t size, unsigned long* op_ctr); +void log_mem_operation(alloc_op op, void* ptr, size_t size, unsigned long* op_ctr); + +/** + * @brief Clears all memory operation logs. + * + * Frees all log entries in the log list and resets the log state. This function + * is used to clean up memory and remove all records of logged operations. + */ +void clear_logs(void); diff --git a/include/mem_metrics.h b/include/mem_metrics.h index cf19db8..b0916d8 100644 --- a/include/mem_metrics.h +++ b/include/mem_metrics.h @@ -4,14 +4,15 @@ * * This file provides constants and function prototypes for calculating memory * fragmentation, measuring allocator efficiency, and managing the state of a custom - * memory allocator. + * memory allocator. It includes functions for analyzing performance and fragmentation + * for various memory allocation methods. */ -#include "../include/memory.h" ///< Includes core memory management structures and definitions. -#include "../include/malloc.h" ///< Includes functionality for memory allocation. -#include "../include/calloc.h" ///< Includes functionality for zero-initialized memory allocation. +#include "../include/calloc.h" ///< Includes functionality for zero-initialized memory allocation. +#include "../include/free.h" ///< Includes functionality for freeing memory blocks. +#include "../include/malloc.h" ///< Includes functionality for memory allocation. +#include "../include/memory.h" ///< Includes core memory management structures and definitions. #include "../include/realloc.h" ///< Includes functionality for memory reallocation. -#include "../include/free.h" ///< Includes functionality for freeing memory blocks. /** * @def ALLOCATION_SIZE_MAX @@ -42,3 +43,49 @@ * Defines the number of nanoseconds in one second, used for time-related calculations. */ #define NANOSECONDS_IN_SECOND 1000000000 + +/** + * @brief Calculates memory fragmentation for each allocation method. + * + * Analyzes the memory heap to calculate external fragmentation for each supported + * allocation method (e.g., First Fit, Best Fit, Worst Fit). Stores the calculated + * fragmentation rates in the provided array. + * + * @param fragmentation_rates Array to store the fragmentation percentage for each method. + */ +void calculate_fragmentation_all_methods(double* fragmentation_rates); + +/** + * @brief Retrieves the current time in seconds. + * + * Combines seconds and nanoseconds into a single floating-point value to represent + * the current time in seconds. Used for measuring performance metrics. + * + * @return double Current time in seconds. + */ +double get_time_in_seconds(void); + +/** + * @brief Runs an efficiency test for the currently selected allocation method. + * + * Measures the time taken for a series of memory allocations and deallocations + * using the current memory allocation method. Also calculates fragmentation after + * the test. + */ +void efficiency_test_current_method(void); + +/** + * @brief Runs efficiency tests for all supported allocation methods. + * + * Measures the time taken for memory allocations and deallocations, as well as + * fragmentation rates, for all available allocation methods (e.g., First Fit, Best Fit, Worst Fit). + */ +void efficiency_test_all_methods(void); + +/** + * @brief Clears all memory blocks and resets the memory allocator. + * + * Frees all allocated blocks, clears fragmentation data, and resets the memory allocator + * state. Ensures that no residual data remains in the heap. + */ +void clear_memory(void); diff --git a/include/memory.h b/include/memory.h index 8bbef96..ea88ca6 100644 --- a/include/memory.h +++ b/include/memory.h @@ -2,34 +2,35 @@ * @file memory.h * @brief Custom memory management library. * - * This header defines the structures, constants, and function prototypes - * needed for a custom memory allocator. It provides tools for dynamic - * memory allocation, freeing, and diagnostic checks of the heap. + * This header file defines the structures, constants, and function prototypes + * required for implementing a custom memory allocator. It provides tools for + * dynamic memory allocation, freeing, and diagnostic checks of the heap to ensure + * efficient memory usage. */ -#pragma once // Prevents the header file from being included multiple times in the same compilation unit. +#pragma once // Prevents multiple inclusions of this header file during compilation. /* Required headers for memory management */ -#include "mem_logging.h" ///< For logging memory operations. -#include ///< Provides time-related utilities. -#include ///< Enables thread safety with mutexes. -#include ///< Standard definitions like `size_t`. -#include ///< Fixed-width integer types. -#include ///< Input/output utilities. -#include ///< Memory manipulation functions like `memset`. -#include ///< Memory management functions, such as `mmap`. -#include ///< Basic data types. -#include ///< Access to POSIX API functions. +#include "mem_logging.h" ///< Provides functionality for logging memory operations. +#include ///< Includes time-related utilities. +#include ///< Enables thread safety with mutex support. +#include ///< Defines standard types like `size_t`. +#include ///< Provides fixed-width integer types. +#include ///< Includes I/O utilities for debugging. +#include ///< Includes memory manipulation utilities like `memset`. +#include ///< Provides memory mapping functions for dynamic memory allocation. +#include ///< Defines basic data types. +#include ///< Provides POSIX API functions for memory management. /** * @def INVALID_ADDRESS - * Constant used to indicate that a memory address is invalid. + * Indicates that a memory address is invalid or inaccessible. */ #define INVALID_ADDRESS -1 /** * @def BLOCK_THRESHOLD - * Defines the minimum padding needed for block alignment. + * Minimum padding required for block alignment. */ #define BLOCK_THRESHOLD 8 @@ -37,11 +38,11 @@ * @def align * Aligns a size value to the next multiple of 8 bytes. * - * This macro ensures memory allocations conform to system alignment requirements, - * improving access performance and avoiding potential errors on certain architectures. + * Ensures memory allocations conform to alignment requirements, which + * can improve performance and prevent hardware errors. * * @param x The size to align. - * @return The aligned size value. + * @return The aligned size. */ #define align(x) (((((x) - 1) >> 3) << 3) + BLOCK_THRESHOLD) @@ -53,31 +54,31 @@ /** * @def PAGESIZE - * The size of a memory page, typically used for mmap allocations. + * Defines the size of a memory page, typically used in mmap allocations. */ #define PAGESIZE 4096 /** * @def FIRST_FIT - * Allocation strategy: assign the first free block large enough for the requested size. + * Memory allocation strategy: finds the first free block that fits the request. */ #define FIRST_FIT 0 /** * @def BEST_FIT - * Allocation strategy: assign the smallest free block that fits the requested size. + * Memory allocation strategy: finds the smallest block that fits the request. */ #define BEST_FIT 1 /** * @def WORST_FIT - * Allocation strategy: assign the largest free block available. + * Memory allocation strategy: finds the largest available block. */ #define WORST_FIT 2 /** * @def ALLOC_METHODS - * The total number of supported allocation strategies. + * Total number of memory allocation strategies supported. */ #define ALLOC_METHODS 3 @@ -89,13 +90,13 @@ /** * @def TRUE - * Boolean true value. + * Boolean true value, used for readability in memory block operations. */ #define TRUE 1 /** * @def FALSE - * Boolean false value. + * Boolean false value, used for readability in memory block operations. */ #define FALSE 0 @@ -131,45 +132,76 @@ /** * @typedef t_block - * Alias for a pointer to the `s_block` structure. + * Alias for a pointer to the `s_block` structure, representing a memory block. */ typedef struct s_block* t_block; /** * @struct s_block - * @brief Represents a block of memory in the custom allocator. + * @brief Represents a block of memory managed by the allocator. * - * Each block contains metadata and a pointer to its data area. The linked - * structure enables the allocator to manage dynamic memory efficiently. + * This structure contains metadata about a memory block, including its size, + * pointers to adjacent blocks, and allocation status. It is part of a linked + * list that enables the allocator to manage the heap efficiently. */ struct s_block { - size_t size; /**< The size of the data area in bytes. */ - struct s_block* next; /**< Pointer to the next block in the linked list. */ - struct s_block* prev; /**< Pointer to the previous block in the linked list. */ + size_t size; /**< Size of the memory block's data area. */ + struct s_block* next; /**< Pointer to the next block in the heap. */ + struct s_block* prev; /**< Pointer to the previous block in the heap. */ int free; /**< Status flag: 1 if the block is free, 0 if allocated. */ - void* ptr; /**< Pointer to the start of the data area. */ - int alloc_method; /**< The allocation strategy used for this block. */ - char data[DATA_START]; /**< Start of the data section. Actual size is dynamic. */ + void* ptr; /**< Pointer to the start of the data section. */ + int alloc_method; /**< Allocation strategy used for this block. */ + char data[DATA_START]; /**< Start of the block's data section. */ }; +/** + * @brief Initializes the memory manager. + * + * Sets up the necessary data structures and locks for managing memory allocations. + */ +void memory_manager_init(void); + +/** + * @brief Cleans up resources used by the memory manager. + * + * Releases any locks or resources held by the memory manager, preparing it for shutdown. + */ +void memory_manager_cleanup(void); + /** * @brief Retrieves the metadata block for a given data pointer. * - * This function calculates the starting address of the block structure - * that precedes the given data pointer. It is critical for managing - * allocated blocks and ensuring proper alignment. + * Computes the starting address of the metadata structure that corresponds to + * the given data pointer, enabling access to block metadata for allocation or deallocation. * - * @param p A pointer to a data segment allocated by the custom allocator. - * @return t_block A pointer to the corresponding metadata block. + * @param p Pointer to a data block allocated by the custom allocator. + * @return t_block Pointer to the metadata block associated with the data pointer. */ t_block get_block(void* p); /** - * @brief Analyzes the state of the heap and logs potential issues. + * @brief Sets the allocation method for the memory manager. + * + * Configures the allocation strategy used by the memory manager. Supported + * strategies include First Fit, Best Fit, and Worst Fit. * - * This function scans all memory blocks in the heap, checking for - * abnormalities like adjacent free blocks that could be merged or - * blocks with invalid sizes. It provides detailed output for debugging. + * @param m Allocation method to set (FIRST_FIT, BEST_FIT, or WORST_FIT). + */ +void set_method(int m); + +/** + * @brief Performs a diagnostic check of the heap. + * + * Scans the heap for issues such as adjacent free blocks that can be merged or + * invalid block sizes. Outputs diagnostic information for debugging purposes. */ void check_heap(void); + +/** + * @brief Displays memory usage statistics. + * + * Prints details about the total allocated and freed memory, as well as the + * current state of the heap. + */ +void memory_usage(void); diff --git a/include/realloc.h b/include/realloc.h index f9d921b..ea9ca84 100644 --- a/include/realloc.h +++ b/include/realloc.h @@ -7,15 +7,15 @@ * of the custom memory allocator and ensure efficient memory management. */ -#include "../include/memory.h" ///< Includes definitions for memory structures and constants. -#include "../include/free.h" ///< Includes functionality for freeing memory blocks. +#include "../include/free.h" ///< Includes functionality for freeing memory blocks. #include "../include/malloc.h" ///< Includes functionality for memory allocation. +#include "../include/memory.h" ///< Includes definitions for memory structures and constants. /** * @brief Copies the contents of a source memory block to a destination block. * * Transfers the data from the source block to the destination block, ensuring - * that no more data is copied than the size of either block. This function is + * that no more data is copied than the size of either block. This function is * useful during memory reallocation when the block size changes. * * @param src Pointer to the source memory block. @@ -35,4 +35,4 @@ void copy_block(t_block src, t_block dst); * @param size New size in bytes for the memory block. * @return void* Pointer to the resized memory block, or NULL if reallocation fails. */ -void* realloc(void* p, size_t size); +void* my_realloc(void* p, size_t size); diff --git a/src/calloc.c b/src/calloc.c index fb67934..a25bd1b 100644 --- a/src/calloc.c +++ b/src/calloc.c @@ -3,8 +3,7 @@ extern pthread_mutex_t memory_mutex; // Mutex for thread-safe memory operations. unsigned long calloc_ctr = 0; // Counter to track the number of calloc operations performed. -/* Allocates memory for an array of elements, initializing all elements to zero. */ -void* calloc(size_t number, size_t size) +void* my_calloc(size_t number, size_t size) { pthread_mutex_lock(&memory_mutex); // Lock the mutex to ensure thread safety. @@ -17,7 +16,7 @@ void* calloc(size_t number, size_t size) } // Allocate the memory using malloc, leveraging the existing allocation logic. - void* ptr = malloc(total_size); + void* ptr = my_malloc(total_size); if (ptr == NULL) // Check if the allocation was successful. { pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. diff --git a/src/free.c b/src/free.c index 4cbe9f2..f7b46da 100644 --- a/src/free.c +++ b/src/free.c @@ -6,7 +6,6 @@ extern int enable_unmapping; // Flag to enable or disable unmapping of m extern size_t total_freed_memory; // Tracks the total memory freed by the allocator. unsigned long free_ctr = 0; // Counter for the number of free operations performed. -/* Merges a block with adjacent free blocks, both forward and backward, if possible. */ t_block fusion(t_block b) { // Merge with subsequent free blocks. @@ -32,7 +31,6 @@ t_block fusion(t_block b) return b; // Return the fused block. } -/* Verifies if a pointer is valid and belongs to a memory block in the heap. */ int valid_addr(void* p) { if (p == NULL || base == NULL) // Check if the pointer or heap base is null. @@ -54,8 +52,7 @@ int valid_addr(void* p) return INVALID_ADDRESS; // Return invalid if the block is not found. } -/* Frees a memory block and optionally unmaps it if it is at the end of the heap. */ -void free(void* ptr, int unmap_flag) +void my_free(void* ptr, int unmap_flag) { pthread_mutex_lock(&memory_mutex); // Lock the mutex for thread safety. diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..06a1bd0 --- /dev/null +++ b/src/main.c @@ -0,0 +1,6 @@ +#include "../include/mem_metrics.h" // Include the header for memory metrics functionality. + +int main (void) { + efficiency_test_all_methods(); // Run the efficiency test for all allocation methods. + return 0; +} \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index 2790ff5..8142bfd 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -8,7 +8,6 @@ extern size_t total_allocated_memory; // Tracks the total memory allocated by th unsigned long malloc_ctr = 0; // Counter for the number of malloc operations performed. -/* Finds a suitable memory block based on the selected allocation method. */ t_block find_block(t_block* last, size_t size) { t_block b = base; // Start searching from the base of the heap. @@ -78,7 +77,6 @@ t_block find_block(t_block* last, size_t size) } } -/* Splits a memory block into two if it is larger than the requested size. */ void split_block(t_block b, size_t s) { if (b->size > s + BLOCK_SIZE) // Ensure there is enough space to split. @@ -99,7 +97,6 @@ void split_block(t_block b, size_t s) } } -/* Extends the heap by creating a new memory block. */ t_block extend_heap(t_block last, size_t s) { t_block b = mmap(0, s + BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); // Allocate memory. @@ -112,7 +109,7 @@ t_block extend_heap(t_block last, size_t s) b->next = NULL; // New block is at the end, so no next block. b->prev = last; // Link the new block to the previous block. b->ptr = b->data; // Initialize the data pointer. - b->free = 0; // Mark the block as allocated. + b->free = FALSE; // Mark the block as allocated. b->alloc_method = method; // Record the allocation method. if (last) @@ -121,8 +118,7 @@ t_block extend_heap(t_block last, size_t s) return b; // Return the new block. } -/* Allocates a block of memory of the requested size. */ -void* malloc(size_t size) +void* my_malloc(size_t size) { pthread_mutex_lock(&memory_mutex); // Lock the mutex for thread safety. @@ -144,7 +140,7 @@ void* malloc(size_t size) { split_block(b, s); // Split the block if necessary. } - b->free = 0; // Mark the block as allocated. + b->free = FALSE; // Mark the block as allocated. } else { diff --git a/src/mem_logging.c b/src/mem_logging.c index 8f8eb0f..6d09052 100644 --- a/src/mem_logging.c +++ b/src/mem_logging.c @@ -5,8 +5,7 @@ extern size_t total_freed_memory; // Tracks the total amount of memory freed t_log_entry* log_head = NULL; // Pointer to the head of the linked list for log entries. -/* Logs a memory operation by creating a new log entry and adding it to the log list. */ -void log_mem_operation(alloc_type type, void* ptr, size_t size, unsigned long* op_ctr) +void log_mem_operation(alloc_op op, void* ptr, size_t size, unsigned long* op_ctr) { // Allocate memory for a new log entry using mmap. t_log_entry* entry = mmap(NULL, sizeof(t_log_entry), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); @@ -19,18 +18,17 @@ void log_mem_operation(alloc_type type, void* ptr, size_t size, unsigned long* o } // Populate the log entry with details about the memory operation. - entry->type = type; // Type of memory operation (e.g., MALLOC, FREE). - entry->ptr = ptr; // Pointer to the memory block involved in the operation. - entry->size = size; // Size of the memory block. + entry->op = op; // Type of memory operation (e.g., MALLOC, FREE). + entry->ptr = ptr; // Pointer to the memory block involved in the operation. + entry->size = size; // Size of the memory block. entry->total_allocated = total_allocated_memory; // Total allocated memory at the time of the operation. - entry->total_freed = total_freed_memory; // Total freed memory at the time of the operation. - entry->next = log_head; // Link the new entry to the current head of the log list. - entry->op_id = *op_ctr; // Assign a unique operation ID to the log entry. - (*op_ctr)++; // Increment the operation counter. - log_head = entry; // Update the head of the log list to the new entry. + entry->total_freed = total_freed_memory; // Total freed memory at the time of the operation. + entry->next = log_head; // Link the new entry to the current head of the log list. + entry->op_id = *op_ctr; // Assign a unique operation ID to the log entry. + (*op_ctr)++; // Increment the operation counter. + log_head = entry; // Update the head of the log list to the new entry. } -/* Clears all log entries by unmapping each one and resetting the log list. */ void clear_logs(void) { t_log_entry* entry = log_head; // Start at the head of the log list. @@ -38,9 +36,9 @@ void clear_logs(void) // Traverse the log list and unmap each entry. while (entry) { - t_log_entry* next = entry->next; // Save the pointer to the next log entry. + t_log_entry* next = entry->next; // Save the pointer to the next log entry. munmap(entry, sizeof(t_log_entry)); // Unmap the current log entry from memory. - entry = next; // Move to the next entry in the list. + entry = next; // Move to the next entry in the list. } log_head = NULL; // Reset the head of the log list to indicate it is empty. diff --git a/src/mem_metrics.c b/src/mem_metrics.c index 75f5db9..6b455be 100644 --- a/src/mem_metrics.c +++ b/src/mem_metrics.c @@ -1,13 +1,13 @@ #include "../include/mem_metrics.h" // Include the header for memory metrics functionality. // External variables from memory.c for accessing heap state and memory statistics. -extern void* base; // Pointer to the start of the heap. +extern void* base; // Pointer to the start of the heap. +extern int method; // Memory allocation method. extern size_t total_allocated_memory; // Total memory allocated during program execution. -extern size_t total_freed_memory; // Total memory freed during program execution. -extern int enable_unmapping; // Flag to enable or disable unmapping of memory blocks. +extern size_t total_freed_memory; // Total memory freed during program execution. +extern int enable_unmapping; // Flag to enable or disable unmapping of memory blocks. -/* Calculates fragmentation for each memory allocation method. */ -void calculate_fragmentation_per_method(double* fragmentation_rates) +void calculate_fragmentation_all_methods(double* fragmentation_rates) { if (base == NULL) // If the heap is empty, there's nothing to calculate. { @@ -27,7 +27,7 @@ void calculate_fragmentation_per_method(double* fragmentation_rates) while (current_block) { int m = current_block->alloc_method; // Get the allocation method for the block. - if (m < 0 || m >= ALLOC_METHODS) // Skip invalid methods. + if (m < 0 || m >= ALLOC_METHODS) // Skip invalid methods. { printf("Invalid allocation method in block at %p\n", (void*)current_block); current_block = current_block->next; @@ -77,22 +77,20 @@ void calculate_fragmentation_per_method(double* fragmentation_rates) } } -/* Returns the current time in seconds, combining seconds and nanoseconds. */ double get_time_in_seconds(void) { struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); // Get the current time. + clock_gettime(CLOCK_MONOTONIC, &ts); // Get the current time. return ts.tv_sec + ts.tv_nsec / NANOSECONDS_IN_SECOND; // Convert to seconds. } -/* Tests the efficiency of the allocator by measuring allocation and deallocation times. */ -void efficiency_test(void) +void efficiency_test_current_method(void) { enable_unmapping = FALSE; // Disable unmapping during the test to avoid overhead. // Allocate arrays for pointers and sizes. - void** pointers = malloc(NUM_ALLOCATIONS * sizeof(void*)); - size_t* sizes = malloc(NUM_ALLOCATIONS * sizeof(size_t)); + void** pointers = my_malloc(NUM_ALLOCATIONS * sizeof(void*)); + size_t* sizes = my_malloc(NUM_ALLOCATIONS * sizeof(size_t)); if (!pointers || !sizes) // Check if memory allocation for test arrays failed. { fprintf(stderr, "Memory allocation failed for test arrays.\n"); @@ -110,7 +108,7 @@ void efficiency_test(void) double start_time = get_time_in_seconds(); for (int i = 0; i < NUM_ALLOCATIONS; i++) { - pointers[i] = malloc(sizes[i]); + pointers[i] = my_malloc(sizes[i]); if (!pointers[i]) // Check if allocation failed for any pointer. { fprintf(stderr, "Allocation failed at iteration %d\n", i); @@ -125,33 +123,45 @@ void efficiency_test(void) { if (pointers[i]) { - free(pointers[i], TRUE); // Free each pointer, allowing unmapping. + my_free(pointers[i], TRUE); // Free each pointer, allowing unmapping. pointers[i] = NULL; // Nullify the pointer to prevent double free. } if (sizes[i]) // Reset size values to avoid reuse. { - free(sizes[i], TRUE); + my_free(sizes[i], TRUE); sizes[i] = 0; } } double deallocation_time = get_time_in_seconds() - start_time; // Print the results of the efficiency test. - printf(BLUE "Efficiency Test Results:\n" RESET); + const char* method_name = (method == FIRST_FIT) ? "First Fit" + : (method == BEST_FIT) ? "Best Fit" + : (method == WORST_FIT) ? "Worst Fit" + : "Unknown"; + printf(BLUE "Efficiency Test Results for %s:\n" RESET, method_name); printf("\tAllocation time: %.6f seconds\n", allocation_time); printf("\tDeallocation time: %.6f seconds\n", deallocation_time); + enable_unmapping = TRUE; // Re-enable unmapping after the test. +} + +void efficiency_test_all_methods(void) +{ + for (int m = FIRST_FIT; m < ALLOC_METHODS; m++) + { + set_method(m); // Set the current allocation method. + efficiency_test_current_method(); + } + // Calculate and print fragmentation after the test. double fragmentation_rates[ALLOC_METHODS]; calculate_fragmentation_per_method(fragmentation_rates); - - enable_unmapping = TRUE; // Re-enable unmapping after the test. } -/* Clears all blocks and resets the allocator to its initial state. */ -void clear_allocator(void) +void clear_memory(void) { - enable_unmapping = 1; // Enable unmapping to release memory. + enable_unmapping = TRUE; // Enable unmapping to release memory. if (base == NULL) // If the heap is empty, nothing to clear. { @@ -160,11 +170,11 @@ void clear_allocator(void) } t_block current_block = base; // Start at the base of the heap. - while (current_block) // Traverse the heap to unmap all blocks. + while (current_block) // Traverse the heap to unmap all blocks. { t_block next = current_block->next; // Save the next block pointer. size_t total_size = current_block->size + BLOCK_SIZE; - if (munmap(current_block, total_size) == -1) // Attempt to unmap the current block. + if (munmap(current_block, total_size) == INVALID_ADDRESS) // Attempt to unmap the current block. { perror("munmap failed"); } @@ -181,5 +191,5 @@ void clear_allocator(void) total_freed_memory = 0; clear_logs(); // Clear the memory operation logs. - printf("Allocator state cleared and logs cleared.\n"); + printf("Cleared Heap and Logs\n"); } diff --git a/src/memory.c b/src/memory.c index 8c17e49..d31f02e 100644 --- a/src/memory.c +++ b/src/memory.c @@ -12,7 +12,6 @@ pthread_mutex_t memory_mutex = PTHREAD_MUTEX_INITIALIZER; // Mutex for synchroni size_t total_allocated_memory = 0; // Tracks the total allocated memory. size_t total_freed_memory = 0; // Tracks the total freed memory. -// Initializes the memory manager, setting up a recursive mutex for thread safety. void memory_manager_init() { pthread_mutexattr_t attr; @@ -22,13 +21,11 @@ void memory_manager_init() pthread_mutexattr_destroy(&attr); // Destroy the mutex attributes as they are no longer needed. } -// Cleans up the memory manager by destroying the mutex. void memory_manager_cleanup() { pthread_mutex_destroy(&memory_mutex); // Destroy the mutex to release resources. } -// Retrieves the memory block metadata associated with a given pointer. t_block get_block(void* p) { if (p == NULL) // If the pointer is null, return NULL. @@ -39,7 +36,6 @@ t_block get_block(void* p) return (t_block)((char*)p - offsetof(struct s_block, data)); } -// Sets the memory allocation method (First Fit, Best Fit, or Worst Fit). void set_method(int m) { if (m == FIRST_FIT || m == BEST_FIT || m == WORST_FIT) // Check if the method is valid. @@ -52,7 +48,6 @@ void set_method(int m) } } -// Performs a diagnostic check on the heap, identifying potential issues. void check_heap(void) { if (base == NULL) // If the heap is empty, print a message and return. @@ -87,7 +82,6 @@ void check_heap(void) } } -// Displays a summary of memory usage and the log of operations. void memory_usage(void) { size_t current_allocated = total_allocated_memory - total_freed_memory; // Calculate currently allocated memory. @@ -114,7 +108,7 @@ void memory_usage(void) while (entry) { // Print each log entry with appropriate formatting based on operation type. - switch (entry->type) + switch (entry->op) { case MALLOC: printf(RED "malloc [%d]" RESET " of %zu bytes at %p\n", entry->op_id, entry->size, entry->ptr); diff --git a/src/realloc.c b/src/realloc.c index bba91af..cf8b8db 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -3,7 +3,6 @@ extern pthread_mutex_t memory_mutex; // Mutex for thread-safe memory operations. unsigned long realloc_ctr = 0; // Counter to track the number of realloc operations performed. -/* Copies data from a source memory block to a destination memory block. */ void copy_block(t_block src, t_block dst) { size_t *sdata, *ddata; // Pointers for source and destination data. @@ -17,15 +16,14 @@ void copy_block(t_block src, t_block dst) ddata[i] = sdata[i]; } -/* Reallocates memory, resizing the block to the specified size. */ -void* realloc(void* ptr, size_t size) +void* my_realloc(void* ptr, size_t size) { pthread_mutex_lock(&memory_mutex); // Lock the mutex for thread-safe operation. if (ptr == NULL) // If the pointer is NULL, realloc behaves like malloc. { pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. - return malloc(size); // Allocate a new block of the requested size. + return my_malloc(size); // Allocate a new block of the requested size. } t_block b = get_block(ptr); // Retrieve the block metadata for the pointer. @@ -34,33 +32,33 @@ void* realloc(void* ptr, size_t size) if (!valid_addr(ptr) || b == NULL) { pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. - return NULL; // Return NULL for invalid address or metadata issues. + return NULL; // Return NULL for invalid address or metadata issues. } if (b->size >= size) // If the current block size is already sufficient. { pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. - return ptr; // Return the original pointer. + return ptr; // Return the original pointer. } // Allocate a new block with the requested size. - void* new_ptr = malloc(size); + void* new_ptr = my_malloc(size); if (new_ptr) // Check if the allocation was successful. { char *src = (char*)ptr, *dest = (char*)new_ptr; // Cast pointers for byte-wise copying. - + // Copy data from the original block to the new block. for (size_t i = 0; i < b->size; i++) { dest[i] = src[i]; } - free(ptr, FALSE); // Free the old block without unmapping it. + my_free(ptr, FALSE); // Free the old block without unmapping it. // Log the realloc operation for debugging and tracking. log_mem_operation(REALLOC, new_ptr, size, &realloc_ctr); } pthread_mutex_unlock(&memory_mutex); // Unlock the mutex after completing the operation. - return new_ptr; // Return the pointer to the newly allocated memory. + return new_ptr; // Return the pointer to the newly allocated memory. } From 9cd315bc6a859e869f2cc23a9a50b5bed70fddce Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Tue, 26 Nov 2024 18:18:58 -0300 Subject: [PATCH 14/21] Working test --- include/calloc.h | 2 ++ include/free.h | 2 ++ include/malloc.h | 2 ++ include/mem_logging.h | 4 +++- include/mem_metrics.h | 7 +++++-- include/memory.h | 1 - include/realloc.h | 2 ++ src/calloc.c | 2 +- src/malloc.c | 2 +- src/mem_metrics.c | 23 +++++++++-------------- src/memory.c | 8 ++++---- 11 files changed, 31 insertions(+), 24 deletions(-) diff --git a/include/calloc.h b/include/calloc.h index acdf20a..2e50e16 100644 --- a/include/calloc.h +++ b/include/calloc.h @@ -7,6 +7,8 @@ * the custom memory allocation system defined in the custom memory allocator. */ +#pragma once // Prevents multiple inclusions of this header file during compilation. + #include "../include/malloc.h" ///< Includes memory allocation functionality for custom allocator. #include "../include/memory.h" ///< Includes definitions for memory management structures and constants. diff --git a/include/free.h b/include/free.h index 5363eb2..28189be 100644 --- a/include/free.h +++ b/include/free.h @@ -7,6 +7,8 @@ * These functions are part of the custom memory allocator. */ +#pragma once // Prevents multiple inclusions of this header file during compilation. + #include "../include/mem_logging.h" ///< Provides functionality for logging memory operations. #include "../include/memory.h" ///< Includes definitions for memory management structures and constants. diff --git a/include/malloc.h b/include/malloc.h index 17c26a8..deea883 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -7,6 +7,8 @@ * as allocating a block of memory using the custom allocator. */ +#pragma once // Prevents multiple inclusions of this header file during compilation. + #include "../include/mem_logging.h" ///< Includes functionality for logging memory operations. #include "../include/memory.h" ///< Includes custom memory management definitions. diff --git a/include/mem_logging.h b/include/mem_logging.h index 7b63335..d2bc63f 100644 --- a/include/mem_logging.h +++ b/include/mem_logging.h @@ -7,7 +7,9 @@ * It tracks memory usage and logs operations such as malloc, calloc, realloc, and free. */ -#include ///< Provides utilities for time-stamping operations. +#pragma once // Prevents multiple inclusions of this header file during compilation. + +#include ///< Provides utilities for time-stamping operations. #include ///< Provides fixed-width integer types for consistency. #include ///< Includes standard I/O functions for logging operations. #include ///< Provides memory manipulation functions like memset. diff --git a/include/mem_metrics.h b/include/mem_metrics.h index b0916d8..c26e783 100644 --- a/include/mem_metrics.h +++ b/include/mem_metrics.h @@ -8,11 +8,14 @@ * for various memory allocation methods. */ +#pragma once // Prevents multiple inclusions of this header file during compilation. + #include "../include/calloc.h" ///< Includes functionality for zero-initialized memory allocation. #include "../include/free.h" ///< Includes functionality for freeing memory blocks. #include "../include/malloc.h" ///< Includes functionality for memory allocation. #include "../include/memory.h" ///< Includes core memory management structures and definitions. #include "../include/realloc.h" ///< Includes functionality for memory reallocation. +#include ///< Provides standard library functions like `exit`. /** * @def ALLOCATION_SIZE_MAX @@ -24,13 +27,13 @@ * @def ALLOCATION_SIZE_MIN * Minimum size for a single memory allocation in performance tests. */ -#define ALLOCATION_SIZE_MIN 1 +#define ALLOCATION_SIZE_MIN 8 /** * @def NUM_ALLOCATIONS * Number of memory allocations to perform during the efficiency test. */ -#define NUM_ALLOCATIONS 1000 +#define NUM_ALLOCATIONS 10000 /** * @def TO_PERCENTAGE_MULTIPLIER diff --git a/include/memory.h b/include/memory.h index ea88ca6..0eb84a8 100644 --- a/include/memory.h +++ b/include/memory.h @@ -12,7 +12,6 @@ /* Required headers for memory management */ #include "mem_logging.h" ///< Provides functionality for logging memory operations. -#include ///< Includes time-related utilities. #include ///< Enables thread safety with mutex support. #include ///< Defines standard types like `size_t`. #include ///< Provides fixed-width integer types. diff --git a/include/realloc.h b/include/realloc.h index ea9ca84..a09793d 100644 --- a/include/realloc.h +++ b/include/realloc.h @@ -7,6 +7,8 @@ * of the custom memory allocator and ensure efficient memory management. */ +#pragma once // Prevents multiple inclusions of this header file during compilation. + #include "../include/free.h" ///< Includes functionality for freeing memory blocks. #include "../include/malloc.h" ///< Includes functionality for memory allocation. #include "../include/memory.h" ///< Includes definitions for memory structures and constants. diff --git a/src/calloc.c b/src/calloc.c index a25bd1b..5982d91 100644 --- a/src/calloc.c +++ b/src/calloc.c @@ -1,4 +1,4 @@ -#include "../include/calloc.h" // Include the header file for calloc functionality. +#include "../include/calloc.h" extern pthread_mutex_t memory_mutex; // Mutex for thread-safe memory operations. unsigned long calloc_ctr = 0; // Counter to track the number of calloc operations performed. diff --git a/src/malloc.c b/src/malloc.c index 8142bfd..fcaa168 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -124,7 +124,7 @@ void* my_malloc(size_t size) t_block b, last; // Variables for the current and last blocks. size_t s; // Aligned size of the requested memory. - struct timespec start, end; // Variables for timing the operation. + struct timespec start; // Variables for timing the operation. clock_gettime(CLOCK_MONOTONIC, &start); // Start timing. diff --git a/src/mem_metrics.c b/src/mem_metrics.c index 6b455be..a80bc99 100644 --- a/src/mem_metrics.c +++ b/src/mem_metrics.c @@ -68,12 +68,12 @@ void calculate_fragmentation_all_methods(double* fragmentation_rates) : (m == WORST_FIT) ? "Worst Fit" : "Unknown"; - printf("Fragmentation Report for %s:\n", method_name); - printf(" Total memory: %zu bytes\n", total_memory); - printf(" Total allocated memory: %zu bytes\n", total_allocated[m]); - printf(" Total free memory: %zu bytes\n", total_free[m]); - printf(" Largest free block: %zu bytes\n", largest_free_block[m]); - printf(" External fragmentation: %.2f%%\n", external_fragmentation); + printf("%sFragmentation Report for %s%s:\n", YELLOW, method_name, RESET); + printf("\tTotal memory: %zu bytes\n", total_memory); + printf("\tTotal allocated memory: %zu bytes\n", total_allocated[m]); + printf("\tTotal free memory: %zu bytes\n", total_free[m]); + printf("\tLargest free block: %zu bytes\n", largest_free_block[m]); + printf("\tExternal fragmentation: %.2f%%\n", external_fragmentation); } } @@ -121,15 +121,10 @@ void efficiency_test_current_method(void) start_time = get_time_in_seconds(); for (int i = 0; i < NUM_ALLOCATIONS; i++) { - if (pointers[i]) + if (pointers[i]) // Check if the pointer is valid. { my_free(pointers[i], TRUE); // Free each pointer, allowing unmapping. - pointers[i] = NULL; // Nullify the pointer to prevent double free. - } - if (sizes[i]) // Reset size values to avoid reuse. - { - my_free(sizes[i], TRUE); - sizes[i] = 0; + pointers[i] = NULL; // Nullify the pointer to prevent double free. } } double deallocation_time = get_time_in_seconds() - start_time; @@ -156,7 +151,7 @@ void efficiency_test_all_methods(void) // Calculate and print fragmentation after the test. double fragmentation_rates[ALLOC_METHODS]; - calculate_fragmentation_per_method(fragmentation_rates); + calculate_fragmentation_all_methods(fragmentation_rates); } void clear_memory(void) diff --git a/src/memory.c b/src/memory.c index d31f02e..16ec7dc 100644 --- a/src/memory.c +++ b/src/memory.c @@ -111,16 +111,16 @@ void memory_usage(void) switch (entry->op) { case MALLOC: - printf(RED "malloc [%d]" RESET " of %zu bytes at %p\n", entry->op_id, entry->size, entry->ptr); + printf("%smalloc [%lu]%s of %zu bytes at %p\n", RED, entry->op_id, RESET, entry->size, entry->ptr); break; case CALLOC: - printf(RED "calloc [%d]" RESET " of %zu bytes at %p\n", entry->op_id, entry->size, entry->ptr); + printf("%scalloc [%lu]%s of %zu bytes at %p\n", RED, entry->op_id, RESET, entry->size, entry->ptr); break; case REALLOC: - printf(RED "realloc [%d]" RESET " to %zu bytes at %p\n", entry->op_id, entry->size, entry->ptr); + printf("%srealloc [%lu]%s to %zu bytes at %p\n", RED, entry->op_id, RESET, entry->size, entry->ptr); break; case FREE: - printf(GREEN "free [%d]" RESET " of %zu bytes from %p\n", entry->op_id, entry->size, entry->ptr); + printf("%sfree [%lu]%s of %zu bytes from %p\n", BLUE, entry->op_id, RESET, entry->size, entry->ptr); break; } entry = entry->next; // Move to the next log entry. From cb343322897eebfca1a1c78432ba706666e98b10 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Wed, 27 Nov 2024 12:40:09 -0300 Subject: [PATCH 15/21] Improved test --- CMakeLists.txt | 2 +- include/heap_test.h | 13 ++++ include/mem_logging.h | 54 ++++++++++++++-- include/mem_metrics.h | 13 +--- include/memory.h | 40 ++---------- include/memory_test.h | 13 ++++ src/free.c | 22 +++---- src/main.c | 17 +++-- src/malloc.c | 23 +++---- src/mem_logging.c | 45 +++++++++++++ src/mem_metrics.c | 143 +++++++++++++++++++++++------------------- src/memory.c | 62 ++++-------------- src/realloc.c | 2 +- tests/heap_test.c | 25 ++++++++ tests/memory_test.c | 25 ++++++++ 15 files changed, 308 insertions(+), 191 deletions(-) create mode 100644 include/heap_test.h create mode 100644 include/memory_test.h create mode 100644 tests/heap_test.c create mode 100644 tests/memory_test.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 32b687b..2fb33de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,4 +14,4 @@ set(CMAKE_C_FLAGS_RELEASE "-O0 -Wall -Wextra -Wpedantic -Werror -Wunused-paramet set(CMAKE_C_FLAGS_DEBUG "-g -O0 -fprofile-arcs -ftest-coverage -Wall -Wextra -Wpedantic -Werror -Wunused-parameter -Wmissing-prototypes -Wstrict-prototypes") # Add executable for the main project -add_executable(${PROJECT_NAME} src/main.c src/memory.c src/malloc.c src/free.c src/realloc.c src/calloc.c src/mem_logging.c src/mem_metrics.c) \ No newline at end of file +add_executable(${PROJECT_NAME} src/main.c src/memory.c src/malloc.c src/free.c src/realloc.c src/calloc.c src/mem_logging.c src/mem_metrics.c tests/memory_test.c tests/heap_test.c) \ No newline at end of file diff --git a/include/heap_test.h b/include/heap_test.h new file mode 100644 index 0000000..c1494a3 --- /dev/null +++ b/include/heap_test.h @@ -0,0 +1,13 @@ +/** + * @file heap_test.h + * @brief Header file for memory heap testing functions. + * + * This header file provides the prototypes for functions that test the memory + */ + +#include "../include/mem_metrics.h" // Include the header for memory metrics functionality. + +/** + * @brief Test the memory usage function. + */ +void test_check_heap(void); diff --git a/include/mem_logging.h b/include/mem_logging.h index d2bc63f..600f537 100644 --- a/include/mem_logging.h +++ b/include/mem_logging.h @@ -9,11 +9,47 @@ #pragma once // Prevents multiple inclusions of this header file during compilation. -#include ///< Provides utilities for time-stamping operations. -#include ///< Provides fixed-width integer types for consistency. -#include ///< Includes standard I/O functions for logging operations. -#include ///< Provides memory manipulation functions like memset. -#include ///< Includes memory mapping functions for dynamic memory management. +#include ///< Provides fixed-width integer types for consistency. +#include ///< Includes standard I/O functions for logging operations. +#include ///< Provides memory manipulation functions like memset. +#include ///< Includes memory mapping functions for dynamic memory management. +#include ///< Provides utilities for time-stamping operations. + +/** + * @def GRAY + * ANSI escape code for gray-colored text in terminal output. + */ +#define GRAY "\033[1;30m" + +/** + * @def RED + * ANSI escape code for red-colored text in terminal output. + */ +#define RED "\033[1;31m" + +/** + * @def GREEN + * ANSI escape code for green-colored text in terminal output. + */ +#define GREEN "\033[1;32m" + +/** + * @def YELLOW + * ANSI escape code for yellow-colored text in terminal output. + */ +#define YELLOW "\033[1;33m" + +/** + * @def BLUE + * ANSI escape code for blue-colored text in terminal output. + */ +#define BLUE "\033[1;34m" + +/** + * @def RESET + * ANSI escape code to reset terminal text formatting. + */ +#define RESET "\033[0m" /** * @enum alloc_op @@ -69,3 +105,11 @@ void log_mem_operation(alloc_op op, void* ptr, size_t size, unsigned long* op_ct * is used to clean up memory and remove all records of logged operations. */ void clear_logs(void); + +/** + * @brief Displays the memory operation log. + * + * Prints the memory operation log to the console, showing details of each + * memory allocation and deallocation operation in chronological order. + */ +void show_logs(void); diff --git a/include/mem_metrics.h b/include/mem_metrics.h index c26e783..0cdecd7 100644 --- a/include/mem_metrics.h +++ b/include/mem_metrics.h @@ -33,7 +33,7 @@ * @def NUM_ALLOCATIONS * Number of memory allocations to perform during the efficiency test. */ -#define NUM_ALLOCATIONS 10000 +#define NUM_ALLOCATIONS 1000 /** * @def TO_PERCENTAGE_MULTIPLIER @@ -66,16 +66,7 @@ void calculate_fragmentation_all_methods(double* fragmentation_rates); * * @return double Current time in seconds. */ -double get_time_in_seconds(void); - -/** - * @brief Runs an efficiency test for the currently selected allocation method. - * - * Measures the time taken for a series of memory allocations and deallocations - * using the current memory allocation method. Also calculates fragmentation after - * the test. - */ -void efficiency_test_current_method(void); +double get_time_in_milliseconds(void); /** * @brief Runs efficiency tests for all supported allocation methods. diff --git a/include/memory.h b/include/memory.h index 0eb84a8..5eb12f6 100644 --- a/include/memory.h +++ b/include/memory.h @@ -28,10 +28,10 @@ #define INVALID_ADDRESS -1 /** - * @def BLOCK_THRESHOLD + * @def ALIGNMENT * Minimum padding required for block alignment. */ -#define BLOCK_THRESHOLD 8 +#define ALIGNMENT 8 /** * @def align @@ -43,13 +43,13 @@ * @param x The size to align. * @return The aligned size. */ -#define align(x) (((((x) - 1) >> 3) << 3) + BLOCK_THRESHOLD) +#define align(x) (((((x) - 1) >> 3) << 3) + ALIGNMENT) /** - * @def BLOCK_SIZE + * @def BLOCK_MIN_SIZE * The minimum size of a memory block, including metadata. */ -#define BLOCK_SIZE 40 +#define BLOCK_MIN_SIZE 40 /** * @def PAGESIZE @@ -99,36 +99,6 @@ */ #define FALSE 0 -/** - * @def RED - * ANSI escape code for red-colored text in terminal output. - */ -#define RED "\033[1;31m" - -/** - * @def GREEN - * ANSI escape code for green-colored text in terminal output. - */ -#define GREEN "\033[1;32m" - -/** - * @def YELLOW - * ANSI escape code for yellow-colored text in terminal output. - */ -#define YELLOW "\033[1;33m" - -/** - * @def BLUE - * ANSI escape code for blue-colored text in terminal output. - */ -#define BLUE "\033[1;34m" - -/** - * @def RESET - * ANSI escape code to reset terminal text formatting. - */ -#define RESET "\033[0m" - /** * @typedef t_block * Alias for a pointer to the `s_block` structure, representing a memory block. diff --git a/include/memory_test.h b/include/memory_test.h new file mode 100644 index 0000000..460a952 --- /dev/null +++ b/include/memory_test.h @@ -0,0 +1,13 @@ +/** + * @file memory_test.h + * @brief Header file for memory testing functions. + * + * This header file provides the prototypes for functions that test the memory + */ + +#include "../include/mem_metrics.h" // Include the header for memory metrics functionality. + +/** + * @brief Test the memory usage function. + */ +void test_memory_usage(void); \ No newline at end of file diff --git a/src/free.c b/src/free.c index f7b46da..d5caf42 100644 --- a/src/free.c +++ b/src/free.c @@ -11,9 +11,9 @@ t_block fusion(t_block b) // Merge with subsequent free blocks. while (b->next && b->next->free) { - t_block next_block = b->next; // Get the next block. - b->size += BLOCK_SIZE + next_block->size; // Increase the current block size. - b->next = next_block->next; // Update the link to skip the merged block. + t_block next_block = b->next; // Get the next block. + b->size += BLOCK_MIN_SIZE + next_block->size; // Increase the current block size. + b->next = next_block->next; // Update the link to skip the merged block. if (b->next) b->next->prev = b; // Update the previous pointer of the next block. } @@ -21,9 +21,9 @@ t_block fusion(t_block b) // Merge with previous free blocks. while (b->prev && b->prev->free) { - t_block prev_block = b->prev; // Get the previous block. - prev_block->size += BLOCK_SIZE + b->size; // Increase the previous block size. - prev_block->next = b->next; // Update the link to skip the merged block. + t_block prev_block = b->prev; // Get the previous block. + prev_block->size += BLOCK_MIN_SIZE + b->size; // Increase the previous block size. + prev_block->next = b->next; // Update the link to skip the merged block. if (b->next) b->next->prev = prev_block; // Update the previous pointer of the next block. b = prev_block; // Move to the previous block as the new reference. @@ -69,14 +69,14 @@ void my_free(void* ptr, int unmap_flag) b = get_block(ptr); // Retrieve the block metadata. b->free = TRUE; // Mark the block as free. - // Merge with adjacent free blocks. - b = fusion(b); + // Log the free operation. + log_mem_operation(FREE, ptr, b->size, &free_ctr); // Update the total freed memory. total_freed_memory += b->size; - // Log the free operation. - log_mem_operation(FREE, ptr, b->size, &free_ctr); + // Merge with adjacent free blocks. + b = fusion(b); // If unmap_flag is set and the block is at the end of the heap. if (unmap_flag && b->next == NULL) @@ -93,7 +93,7 @@ void my_free(void* ptr, int unmap_flag) // Check if the block should be unmapped. if (enable_unmapping && b->free) { - size_t total_size = b->size + BLOCK_SIZE; // Calculate the total size of the block. + size_t total_size = b->size + BLOCK_MIN_SIZE; // Calculate the total size of the block. printf("Unmapping block at %p with size: %zu\n", (void*)b, total_size); // Attempt to unmap the block from memory. diff --git a/src/main.c b/src/main.c index 06a1bd0..8a1e4bf 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,15 @@ -#include "../include/mem_metrics.h" // Include the header for memory metrics functionality. +#include "../include/heap_test.h" // Include the header for heap test functionality. +#include "../include/memory_test.h" // Include the header for memory test functionality. -int main (void) { - efficiency_test_all_methods(); // Run the efficiency test for all allocation methods. +int main(void) +{ + printf("\n%s====== Running Empty CHECK_HEAP Test ======%s\n", BLUE, RESET); + check_heap(); // Test empty heap + test_memory_usage(); + test_check_heap(); + printf("\n%s--------------------------------%s\n", BLUE, RESET); + show_logs(); + printf("\n%s====== Running EFFICIENCY and FRAGMENTATION Tests ======%s\n\n", BLUE, RESET); + efficiency_test_all_methods(); return 0; -} \ No newline at end of file +} diff --git a/src/malloc.c b/src/malloc.c index fcaa168..96e493f 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -79,14 +79,14 @@ t_block find_block(t_block* last, size_t size) void split_block(t_block b, size_t s) { - if (b->size > s + BLOCK_SIZE) // Ensure there is enough space to split. + if (b->size > s + BLOCK_MIN_SIZE) // Ensure there is enough space to split. { - t_block new_block = (t_block)(b->data + s); // Calculate the address of the new block. - new_block->size = b->size - s - BLOCK_SIZE; // Adjust the size of the new block. - new_block->next = b->next; // Link the new block to the next block. - new_block->prev = b; // Set the previous block of the new block. - new_block->free = TRUE; // Mark the new block as free. - new_block->ptr = new_block->data; // Initialize the data pointer for the new block. + t_block new_block = (t_block)(b->data + s); // Calculate the address of the new block. + new_block->size = b->size - s - BLOCK_MIN_SIZE; // Adjust the size of the new block. + new_block->next = b->next; // Link the new block to the next block. + new_block->prev = b; // Set the previous block of the new block. + new_block->free = TRUE; // Mark the new block as free. + new_block->ptr = new_block->data; // Initialize the data pointer for the new block. b->size = s; // Update the size of the current block. b->next = new_block; // Link the current block to the new block. @@ -99,7 +99,8 @@ void split_block(t_block b, size_t s) t_block extend_heap(t_block last, size_t s) { - t_block b = mmap(0, s + BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); // Allocate memory. + t_block b = + mmap(0, s + BLOCK_MIN_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); // Allocate memory. if (b == MAP_FAILED) // Check if memory allocation failed. { @@ -122,8 +123,8 @@ void* my_malloc(size_t size) { pthread_mutex_lock(&memory_mutex); // Lock the mutex for thread safety. - t_block b, last; // Variables for the current and last blocks. - size_t s; // Aligned size of the requested memory. + t_block b, last; // Variables for the current and last blocks. + size_t s; // Aligned size of the requested memory. struct timespec start; // Variables for timing the operation. clock_gettime(CLOCK_MONOTONIC, &start); // Start timing. @@ -136,7 +137,7 @@ void* my_malloc(size_t size) b = find_block(&last, s); // Try to find a suitable block. if (b) { - if ((b->size - s) >= (BLOCK_SIZE + BLOCK_THRESHOLD)) // Check if the block can be split. + if ((b->size - s) >= (BLOCK_MIN_SIZE + ALIGNMENT)) // Check if the block can be split. { split_block(b, s); // Split the block if necessary. } diff --git a/src/mem_logging.c b/src/mem_logging.c index 6d09052..09fb88b 100644 --- a/src/mem_logging.c +++ b/src/mem_logging.c @@ -43,3 +43,48 @@ void clear_logs(void) log_head = NULL; // Reset the head of the log list to indicate it is empty. } + +void show_logs(void) +{ + // Print the memory operation log. + printf(YELLOW "\nOPERATIONS LOG:\n\n" RESET); + + t_log_entry* entry = log_head; // Start at the head of the log list. + if (entry == NULL) // If the log is empty, print a message and return. + { + printf("\tNo memory operations logged.\n"); + return; + } + + // Reverse the log list to print in chronological order. + t_log_entry* reversed_log = NULL; + while (entry) + { + t_log_entry* next = entry->next; + entry->next = reversed_log; + reversed_log = entry; + entry = next; + } + + entry = reversed_log; // Traverse the reversed list. + while (entry) + { + // Print each log entry with appropriate formatting based on operation type. + switch (entry->op) + { + case MALLOC: + printf("%smalloc [%lu]%s of %zu bytes at %p\n", RED, entry->op_id, RESET, entry->size, entry->ptr); + break; + case CALLOC: + printf("%scalloc [%lu]%s of %zu bytes at %p\n", RED, entry->op_id, RESET, entry->size, entry->ptr); + break; + case REALLOC: + printf("%srealloc [%lu]%s to %zu bytes at %p\n", RED, entry->op_id, RESET, entry->size, entry->ptr); + break; + case FREE: + printf("%sfree [%lu]%s of %zu bytes from %p\n", GREEN, entry->op_id, RESET, entry->size, entry->ptr); + break; + } + entry = entry->next; // Move to the next log entry. + } +} diff --git a/src/mem_metrics.c b/src/mem_metrics.c index a80bc99..3aee938 100644 --- a/src/mem_metrics.c +++ b/src/mem_metrics.c @@ -7,6 +7,9 @@ extern size_t total_allocated_memory; // Total memory allocated during program e extern size_t total_freed_memory; // Total memory freed during program execution. extern int enable_unmapping; // Flag to enable or disable unmapping of memory blocks. +/** + * @brief Calculates fragmentation for all allocation methods. + */ void calculate_fragmentation_all_methods(double* fragmentation_rates) { if (base == NULL) // If the heap is empty, there's nothing to calculate. @@ -14,7 +17,7 @@ void calculate_fragmentation_all_methods(double* fragmentation_rates) printf("No blocks to calculate fragmentation.\n"); for (int m = 0; m < ALLOC_METHODS; m++) // Set fragmentation rates to 0 for all methods. { - fragmentation_rates[m] = 0.0; + fragmentation_rates[m] = 0.0; // Initialize fragmentation as 0%. } return; } @@ -27,17 +30,16 @@ void calculate_fragmentation_all_methods(double* fragmentation_rates) while (current_block) { int m = current_block->alloc_method; // Get the allocation method for the block. - if (m < 0 || m >= ALLOC_METHODS) // Skip invalid methods. + if (m < 0 || m >= ALLOC_METHODS) // Skip invalid methods (Free blocks created on purpose for example). { - printf("Invalid allocation method in block at %p\n", (void*)current_block); current_block = current_block->next; - continue; + continue; // Move to the next block. } if (current_block->free) // If the block is free, update free memory stats. { - total_free[m] += current_block->size; - if (current_block->size > largest_free_block[m]) + total_free[m] += current_block->size; // Add the block size to the free memory total. + if (current_block->size > largest_free_block[m]) // Update the largest free block. { largest_free_block[m] = current_block->size; } @@ -46,7 +48,7 @@ void calculate_fragmentation_all_methods(double* fragmentation_rates) { total_allocated[m] += current_block->size; } - current_block = current_block->next; + current_block = current_block->next; // Move to the next block. } for (int m = 0; m < ALLOC_METHODS; m++) @@ -73,85 +75,100 @@ void calculate_fragmentation_all_methods(double* fragmentation_rates) printf("\tTotal allocated memory: %zu bytes\n", total_allocated[m]); printf("\tTotal free memory: %zu bytes\n", total_free[m]); printf("\tLargest free block: %zu bytes\n", largest_free_block[m]); - printf("\tExternal fragmentation: %.2f%%\n", external_fragmentation); + printf("\tExternal fragmentation: %.2f%%\n\n", external_fragmentation); } } -double get_time_in_seconds(void) +void efficiency_test_all_methods(void) { - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); // Get the current time. - return ts.tv_sec + ts.tv_nsec / NANOSECONDS_IN_SECOND; // Convert to seconds. -} + double fragmentation_rates[ALLOC_METHODS]; // Array to store fragmentation rates for each method. -void efficiency_test_current_method(void) -{ - enable_unmapping = FALSE; // Disable unmapping during the test to avoid overhead. + void* pointers[ALLOC_METHODS][NUM_ALLOCATIONS]; // Array to hold allocated blocks for all methods. + size_t sizes[ALLOC_METHODS][NUM_ALLOCATIONS]; // Array to hold sizes for all methods. - // Allocate arrays for pointers and sizes. - void** pointers = my_malloc(NUM_ALLOCATIONS * sizeof(void*)); - size_t* sizes = my_malloc(NUM_ALLOCATIONS * sizeof(size_t)); - if (!pointers || !sizes) // Check if memory allocation for test arrays failed. - { - fprintf(stderr, "Memory allocation failed for test arrays.\n"); - exit(1); - } + double allocation_times[ALLOC_METHODS] = {0}; // Array to store allocation times for each method. + double deallocation_times[ALLOC_METHODS] = {0}; // Array to store deallocation times for each method. - // Generate random sizes for allocations. - srand(time(NULL)); - for (int i = 0; i < NUM_ALLOCATIONS; i++) + enable_unmapping = FALSE; // Disable unmapping during allocation. + + srand(time(NULL)); // Seed the random number generator. + + // Generate random sizes for all methods. + for (int m = FIRST_FIT; m < ALLOC_METHODS; m++) { - sizes[i] = rand() % ALLOCATION_SIZE_MAX + ALLOCATION_SIZE_MIN; + for (int i = 0; i < NUM_ALLOCATIONS; i++) + { + sizes[m][i] = rand() % ALLOCATION_SIZE_MAX + ALLOCATION_SIZE_MIN; + } } - // Measure the time to allocate memory. - double start_time = get_time_in_seconds(); - for (int i = 0; i < NUM_ALLOCATIONS; i++) + // Interleave allocations for all methods and measure times. + for (int m = FIRST_FIT; m < ALLOC_METHODS; m++) { - pointers[i] = my_malloc(sizes[i]); - if (!pointers[i]) // Check if allocation failed for any pointer. + set_method(m); // Set the allocation method. + + double start_time = get_time_in_milliseconds(); // Start timing allocation. + + for (int i = 0; i < NUM_ALLOCATIONS; i++) { - fprintf(stderr, "Allocation failed at iteration %d\n", i); - exit(1); + pointers[m][i] = my_malloc(sizes[m][i]); // Allocate memory for this method. + if (!pointers[m][i]) + { + fprintf(stderr, "Allocation failed for method %d at iteration %d.\n", m, i); + exit(1); + } + + // Periodically free some blocks to simulate fragmentation. + if (i % 5 == 0 && pointers[m][i]) + { + my_free(pointers[m][i], FALSE); // Free every fifth block. + pointers[m][i] = NULL; + } } + + allocation_times[m] = get_time_in_milliseconds() - start_time; // End timing allocation. } - double allocation_time = get_time_in_seconds() - start_time; - // Measure the time to deallocate memory. - start_time = get_time_in_seconds(); - for (int i = 0; i < NUM_ALLOCATIONS; i++) + // Calculate fragmentation after interleaved allocations and frees. + calculate_fragmentation_all_methods(fragmentation_rates); + + // Deallocate all remaining memory blocks and measure times. + for (int m = FIRST_FIT; m < ALLOC_METHODS; m++) { - if (pointers[i]) // Check if the pointer is valid. + double start_time = get_time_in_milliseconds(); // Start timing deallocation. + + for (int i = 0; i < NUM_ALLOCATIONS; i++) { - my_free(pointers[i], TRUE); // Free each pointer, allowing unmapping. - pointers[i] = NULL; // Nullify the pointer to prevent double free. + if (pointers[m][i]) + { + my_free(pointers[m][i], TRUE); // Free the memory block. + pointers[m][i] = NULL; // Nullify the pointer to prevent double free. + } } + + deallocation_times[m] = get_time_in_milliseconds() - start_time; // End timing deallocation. } - double deallocation_time = get_time_in_seconds() - start_time; - // Print the results of the efficiency test. - const char* method_name = (method == FIRST_FIT) ? "First Fit" - : (method == BEST_FIT) ? "Best Fit" - : (method == WORST_FIT) ? "Worst Fit" - : "Unknown"; - printf(BLUE "Efficiency Test Results for %s:\n" RESET, method_name); - printf("\tAllocation time: %.6f seconds\n", allocation_time); - printf("\tDeallocation time: %.6f seconds\n", deallocation_time); + // Print allocation and deallocation times for each method. + for (int m = FIRST_FIT; m < ALLOC_METHODS; m++) + { + const char* method_name = (m == FIRST_FIT) ? "First Fit" + : (m == BEST_FIT) ? "Best Fit" + : (m == WORST_FIT) ? "Worst Fit" + : "Unknown"; + printf(BLUE "Efficiency Test Results for %s:\n" RESET, method_name); + printf("\tAllocation time: %.6f [ms]\n", allocation_times[m]); + printf("\tDeallocation time: %.6f [ms]\n\n", deallocation_times[m]); + } enable_unmapping = TRUE; // Re-enable unmapping after the test. } -void efficiency_test_all_methods(void) +double get_time_in_milliseconds(void) { - for (int m = FIRST_FIT; m < ALLOC_METHODS; m++) - { - set_method(m); // Set the current allocation method. - efficiency_test_current_method(); - } - - // Calculate and print fragmentation after the test. - double fragmentation_rates[ALLOC_METHODS]; - calculate_fragmentation_all_methods(fragmentation_rates); + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); // Obtén el tiempo actual. + return (ts.tv_sec * 1000.0) + (ts.tv_nsec / 1e6); // Convierte a milisegundos. } void clear_memory(void) @@ -168,7 +185,7 @@ void clear_memory(void) while (current_block) // Traverse the heap to unmap all blocks. { t_block next = current_block->next; // Save the next block pointer. - size_t total_size = current_block->size + BLOCK_SIZE; + size_t total_size = current_block->size + BLOCK_MIN_SIZE; if (munmap(current_block, total_size) == INVALID_ADDRESS) // Attempt to unmap the current block. { perror("munmap failed"); @@ -187,4 +204,4 @@ void clear_memory(void) clear_logs(); // Clear the memory operation logs. printf("Cleared Heap and Logs\n"); -} +} \ No newline at end of file diff --git a/src/memory.c b/src/memory.c index 16ec7dc..bec642a 100644 --- a/src/memory.c +++ b/src/memory.c @@ -56,9 +56,8 @@ void check_heap(void) return; } - t_block current = base; // Start at the base of the heap. - printf(YELLOW "Heap check\n" RESET); // Print a formatted header for the check. - while (current != NULL) // Iterate through all blocks in the heap. + t_block current = base; // Start at the base of the heap. + while (current != NULL) // Iterate through all blocks in the heap. { // Check for adjacent free blocks that are not fused together. if (current->free && current->next && current->next->free) @@ -72,57 +71,22 @@ void check_heap(void) printf("%sWarning:%sBlock at %p has invalid size %zu.\n", RED, RESET, (void*)current, current->size); } // Print details of the current block. - printf("Block at %p\n", (void*)current); - printf(" Size: %zu\n", current->size); - printf(" Free: %d\n", current->free); - printf(" Next block: %p\n", (void*)(current->next)); - printf(" Previous block: %p\n", (void*)(current->prev)); - printf(" Data address: %p\n", current->ptr); + printf("%s--------------------------------%s\n", YELLOW, RESET); + printf("%sBlock at %p%s\n", GRAY, (void*)current, RESET); + printf("\tSize: %zu\n", current->size); + printf("\tFree: %d\n", current->free); + printf("\tNext block: %p\n", (void*)(current->next)); + printf("\tPrevious block: %p\n", (void*)(current->prev)); + printf("\tData address: %p\n", current->ptr); current = current->next; // Move to the next block. } } void memory_usage(void) { + printf(YELLOW "\nMemory Usage:\n" RESET); + printf("\tTotal allocated memory (since start): %zu bytes\n", total_allocated_memory); + printf("\tTotal freed memory (since start): %zu bytes\n", total_freed_memory); size_t current_allocated = total_allocated_memory - total_freed_memory; // Calculate currently allocated memory. - printf(YELLOW "Memory Usage Report:\n" RESET); // Print a formatted header. - printf(" Total allocated memory (since start): %zu bytes\n", total_allocated_memory); - printf(" Total freed memory (since start): %zu bytes\n", total_freed_memory); - printf(" Currently allocated memory: %zu bytes\n", current_allocated); - - // Print the memory operation log. - printf(BLUE "\nMemory Operation Log:\n" RESET); - t_log_entry* entry = log_head; // Start at the head of the log list. - - // Reverse the log list to print in chronological order. - t_log_entry* reversed_log = NULL; - while (entry) - { - t_log_entry* next = entry->next; - entry->next = reversed_log; - reversed_log = entry; - entry = next; - } - - entry = reversed_log; // Traverse the reversed list. - while (entry) - { - // Print each log entry with appropriate formatting based on operation type. - switch (entry->op) - { - case MALLOC: - printf("%smalloc [%lu]%s of %zu bytes at %p\n", RED, entry->op_id, RESET, entry->size, entry->ptr); - break; - case CALLOC: - printf("%scalloc [%lu]%s of %zu bytes at %p\n", RED, entry->op_id, RESET, entry->size, entry->ptr); - break; - case REALLOC: - printf("%srealloc [%lu]%s to %zu bytes at %p\n", RED, entry->op_id, RESET, entry->size, entry->ptr); - break; - case FREE: - printf("%sfree [%lu]%s of %zu bytes from %p\n", BLUE, entry->op_id, RESET, entry->size, entry->ptr); - break; - } - entry = entry->next; // Move to the next log entry. - } + printf("\tCurrently allocated memory: %zu bytes\n", current_allocated); } diff --git a/src/realloc.c b/src/realloc.c index cf8b8db..27976e7 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -23,7 +23,7 @@ void* my_realloc(void* ptr, size_t size) if (ptr == NULL) // If the pointer is NULL, realloc behaves like malloc. { pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before returning. - return my_malloc(size); // Allocate a new block of the requested size. + return my_malloc(size); // Allocate a new block of the requested size. } t_block b = get_block(ptr); // Retrieve the block metadata for the pointer. diff --git a/tests/heap_test.c b/tests/heap_test.c new file mode 100644 index 0000000..f11b529 --- /dev/null +++ b/tests/heap_test.c @@ -0,0 +1,25 @@ +#include "heap_test.h" // Include the header for heap test functionality. + +void test_check_heap(void) +{ + printf("\n%s====== Running CHECK_HEAP Tests ======%s\n", BLUE, RESET); + + printf("%s\nTest: NON-EMPTY HEAP%s\n", YELLOW, RESET); + void* block1 = my_malloc(64); + void* block2 = my_malloc(128); + void* block3 = my_malloc(256); + my_free(block2, FALSE); + my_free(block3, FALSE); + check_heap(); + memory_usage(); + my_free(block1, TRUE); + + printf("%s\nTest: FREING WITH UNMAPING%s", YELLOW, RESET); + void* block4 = my_malloc(32); + void* block5 = my_malloc(48); + printf("%s (Freing 32 bytes block at %p and unmaping memory)%s\n", GREEN, block4, RESET); + my_free(block4, TRUE); + check_heap(); + memory_usage(); + my_free(block5, TRUE); +} \ No newline at end of file diff --git a/tests/memory_test.c b/tests/memory_test.c new file mode 100644 index 0000000..5ff2e41 --- /dev/null +++ b/tests/memory_test.c @@ -0,0 +1,25 @@ +#include "memory_test.h" // Include the header for memory metrics functionality. + +void test_memory_usage(void) +{ + printf("\n%s====== Running MEMORY_USAGE Tests ======%s\n", BLUE, RESET); + printf("%s\nTest: EMPTY USAGE%s\n", YELLOW, RESET); + memory_usage(); // Test empty usage + + printf("\n%s--------------------------------%s\n\n", YELLOW, RESET); + + printf("%sTest: ALLOCATIONS AND FREES%s\n\n", YELLOW, RESET); + + void* block6 = my_malloc(64); + void* block7 = my_malloc(128); + printf("%sAllocating blocks at %p and %p%s\n", RED, block6, block7, RESET); + memory_usage(); + + printf("%s\nFreing 64 bytes block at %p%s\n", GREEN, block6, RESET); + my_free(block6, TRUE); // Free without merging + memory_usage(); + + printf("%s\nFreing 128 bytes block at %p%s\n", GREEN, block7, RESET); + my_free(block7, TRUE); // Free without merging + memory_usage(); +} \ No newline at end of file From 2444aed7f7a3e59cd12eb09875a9deef45c9d085 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Wed, 27 Nov 2024 19:32:13 -0300 Subject: [PATCH 16/21] Working Unity Tests with 40% coverage --- .gitignore | 7 + CMakeLists.txt | 15 +- Doxyfile | 2850 ++++++++++++++++++++++++++++++++++++++++++ conanfile.txt | 9 + include/memory.h | 2 +- include/test_mem.h | 31 + src/calloc.c | 1 + src/free.c | 2 +- src/realloc.c | 1 + tests/CMakeLists.txt | 43 + tests/test_mem.c | 165 +++ 11 files changed, 3123 insertions(+), 3 deletions(-) create mode 100644 Doxyfile create mode 100644 conanfile.txt create mode 100644 include/test_mem.h create mode 100644 tests/CMakeLists.txt create mode 100644 tests/test_mem.c diff --git a/.gitignore b/.gitignore index 15f7ef6..f2037ed 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,10 @@ build/ # Personal files used-cmds.md + +# Enviroment +venv/ +.env + +# CMake +CMakeUserPresets.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 2fb33de..90670c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,4 +14,17 @@ set(CMAKE_C_FLAGS_RELEASE "-O0 -Wall -Wextra -Wpedantic -Werror -Wunused-paramet set(CMAKE_C_FLAGS_DEBUG "-g -O0 -fprofile-arcs -ftest-coverage -Wall -Wextra -Wpedantic -Werror -Wunused-parameter -Wmissing-prototypes -Wstrict-prototypes") # Add executable for the main project -add_executable(${PROJECT_NAME} src/main.c src/memory.c src/malloc.c src/free.c src/realloc.c src/calloc.c src/mem_logging.c src/mem_metrics.c tests/memory_test.c tests/heap_test.c) \ No newline at end of file +add_executable(${PROJECT_NAME} + src/main.c + src/memory.c + src/malloc.c + src/free.c + src/realloc.c + src/calloc.c + src/mem_logging.c + src/mem_metrics.c + tests/memory_test.c + tests/heap_test.c +) + +add_subdirectory(tests) diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..cf46b88 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,2850 @@ +# Doxyfile 1.10.0 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = #LabX + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = #v1.2.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = #"Source code documentation" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# With the PROJECT_ICON tag one can specify an icon that is included in the tabs +# when the HTML document is shown. Doxygen will copy the logo to the output +# directory. + +PROJECT_ICON = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST = YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + +WARN_NO_PARAMDOC = YES + +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = ./include \ + ./src \ + ./lib + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, +# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, +# *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to +# be provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.h \ + *.cpp \ + *.hpp + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = external \ + tests + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = main.c README.md + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# multi-line macros, enums or list initialized variables directly into the +# documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. +# The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_ADD_INC_PATHS = YES + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES # Change to generate HTML output + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = documentation + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# If the HTML_COPY_CLIPBOARD tag is set to YES then doxygen will show an icon in +# the top right corner of code and text fragments that allows the user to copy +# its content to the clipboard. Note this only works if supported by the browser +# and the web page is served via a secure context (see: +# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file: +# protocol. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COPY_CLIPBOARD = YES + +# Doxygen stores a couple of settings persistently in the browser (via e.g. +# cookies). By default these settings apply to all HTML pages generated by +# doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store +# the settings under a project specific key, such that the user preferences will +# be stored separately. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_PROJECT_COOKIE = + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = YES + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" + +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" + +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" + +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will +# generate a graph for each documented class showing the direct and indirect +# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and +# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case +# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the +# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. +# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance +# relations will be shown as texts / links. Explicit enabling an inheritance +# graph or choosing a different representation for an inheritance graph of a +# specific class, can be accomplished by means of the command \inheritancegraph. +# Disabling an inheritance graph can be accomplished by means of the command +# \hideinheritancegraph. +# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. +# The default value is: YES. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. Explicit enabling a collaboration graph, +# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the +# command \collaborationgraph. Disabling a collaboration graph can be +# accomplished by means of the command \hidecollaborationgraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. Explicit enabling a group +# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means +# of the command \groupgraph. Disabling a directory graph can be accomplished by +# means of the command \hidegroupgraph. See also the chapter Grouping in the +# manual. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LOOK = YES + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag UML_LOOK is set to YES. + +UML_LIMIT_NUM_FIELDS = 50 + +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will be wrapped across multiple lines. Some heuristics are +# applied to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +TEMPLATE_RELATIONS = NO + +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, +# can be accomplished by means of the command \includegraph. Disabling an +# include graph can be accomplished by means of the command \hideincludegraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDE_GRAPH = YES + +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set +# to NO, can be accomplished by means of the command \includedbygraph. Disabling +# an included by graph can be accomplished by means of the command +# \hideincludedbygraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. Explicit enabling a directory graph, when +# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command +# \directorygraph. Disabling a directory graph can be accomplished by means of +# the command \hidedirectorygraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DIRECTORY_GRAPH = YES + +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# https://www.graphviz.org/)). +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG = NO + +# The DOT_PATH tag can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. + +DOTFILE_DIRS = + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). + +DIAFILE_DIRS = + +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. + +PLANTUML_JAR_PATH = + +# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for plantuml. + +PLANTUML_CFG_FILE = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate +# files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc temporary +# files. +# The default value is: YES. + +DOT_CLEANUP = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will +# use a built-in version of mscgen tool to produce the charts. Alternatively, +# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, +# specifying prog as the value, doxygen will call the tool as prog -T +# -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/conanfile.txt b/conanfile.txt new file mode 100644 index 0000000..8a4807d --- /dev/null +++ b/conanfile.txt @@ -0,0 +1,9 @@ +[requires] +unity/2.6.0 + +[generators] +CMakeDeps +CMakeToolchain + +[layout] +cmake_layout \ No newline at end of file diff --git a/include/memory.h b/include/memory.h index 5eb12f6..2a8cc91 100644 --- a/include/memory.h +++ b/include/memory.h @@ -25,7 +25,7 @@ * @def INVALID_ADDRESS * Indicates that a memory address is invalid or inaccessible. */ -#define INVALID_ADDRESS -1 +#define INVALID_ADDRESS 0 /** * @def ALIGNMENT diff --git a/include/test_mem.h b/include/test_mem.h new file mode 100644 index 0000000..af96527 --- /dev/null +++ b/include/test_mem.h @@ -0,0 +1,31 @@ +#ifndef TEST_COMMANDS_H +#define TEST_COMMANDS_H + +#include + +#include "../include/malloc.h" +#include "../include/free.h" +#include "../include/calloc.h" +#include "../include/realloc.h" + +void setUp(void); + +void tearDown(void); + +void test_my_malloc_allocates_memory(void); + +void test_my_free_frees_memory(void); + +void test_my_calloc_zeroes_memory(void); + +void test_my_realloc_increases_memory(void); + +void test_split_block_creates_new_block(void); + +void test_fusion_merges_adjacent_blocks(void); + +void test_valid_addr_validates_pointer(void); + +void test_extend_heap_adds_memory(void); + +#endif // TEST_COMMANDS_H \ No newline at end of file diff --git a/src/calloc.c b/src/calloc.c index 5982d91..f39634b 100644 --- a/src/calloc.c +++ b/src/calloc.c @@ -15,6 +15,7 @@ void* my_calloc(size_t number, size_t size) return NULL; } + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before my_malloc starts. // Allocate the memory using malloc, leveraging the existing allocation logic. void* ptr = my_malloc(total_size); if (ptr == NULL) // Check if the allocation was successful. diff --git a/src/free.c b/src/free.c index d5caf42..e2a4340 100644 --- a/src/free.c +++ b/src/free.c @@ -35,7 +35,7 @@ int valid_addr(void* p) { if (p == NULL || base == NULL) // Check if the pointer or heap base is null. { - return 0; // Invalid address. + return INVALID_ADDRESS; // Invalid address. } t_block b = get_block(p); // Retrieve the block metadata for the pointer. t_block current = base; // Start checking from the base of the heap. diff --git a/src/realloc.c b/src/realloc.c index 27976e7..f875553 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -41,6 +41,7 @@ void* my_realloc(void* ptr, size_t size) return ptr; // Return the original pointer. } + pthread_mutex_unlock(&memory_mutex); // Unlock the mutex before my_malloc starts. // Allocate a new block with the requested size. void* new_ptr = my_malloc(size); if (new_ptr) // Check if the allocation was successful. diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..02248ff --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,43 @@ +# Verify cmake version +cmake_minimum_required(VERSION 3.1 FATAL_ERROR) + +# Create project for tests +project(tests LANGUAGES C) + +# Enable testing +include(CTest) + +# Find the unity package +find_package(unity REQUIRED) + +# Include directories for tests +include_directories(${CMAKE_SOURCE_DIR}/include) + +# Add executable for tests +add_executable(tests + ${CMAKE_SOURCE_DIR}/tests/test_mem.c + ${CMAKE_SOURCE_DIR}/src/memory.c + ${CMAKE_SOURCE_DIR}/src/malloc.c + ${CMAKE_SOURCE_DIR}/src/free.c + ${CMAKE_SOURCE_DIR}/src/realloc.c + ${CMAKE_SOURCE_DIR}/src/calloc.c + ${CMAKE_SOURCE_DIR}/src/mem_logging.c + ${CMAKE_SOURCE_DIR}/src/mem_metrics.c + ${CMAKE_SOURCE_DIR}/tests/memory_test.c + ${CMAKE_SOURCE_DIR}/tests/heap_test.c +) + +# Specify the output directory for the tests binary within build/tests +set_target_properties(tests PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests" +) + +# Link libraries for tests +target_link_libraries(tests PRIVATE unity::unity) + +# Add test command +add_test(NAME imemTests COMMAND tests) + +# Add coverage flags unconditionally for the tests binary +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fprofile-arcs -ftest-coverage --coverage") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov --coverage") \ No newline at end of file diff --git a/tests/test_mem.c b/tests/test_mem.c new file mode 100644 index 0000000..a2d6956 --- /dev/null +++ b/tests/test_mem.c @@ -0,0 +1,165 @@ +#include "test_mem.h" + +// Mock global variables +extern void* base; +extern int method; +extern pthread_mutex_t memory_mutex; +extern size_t total_allocated_memory; +extern size_t total_freed_memory; +extern unsigned long malloc_ctr; +extern unsigned long free_ctr; +extern unsigned long calloc_ctr; +extern unsigned long realloc_ctr; + +void setUp(void) +{ + // Reset global state before each test + base = NULL; + total_allocated_memory = 0; + total_freed_memory = 0; + malloc_ctr = 0; + free_ctr = 0; + calloc_ctr = 0; + realloc_ctr = 0; +} + +void tearDown(void) +{ + // Clean up global state after each test + if (base) + { + munmap(base, total_allocated_memory); + base = NULL; + } +} + +// Test for `my_malloc` +void test_my_malloc_allocates_memory(void) +{ + size_t size = 64; + void* ptr = my_malloc(size); + + TEST_ASSERT_NOT_NULL(ptr); + TEST_ASSERT_EQUAL(size, total_allocated_memory); + + my_free(ptr, FALSE); // Clean up +} + +// Test for `my_free` +void test_my_free_frees_memory(void) +{ + size_t size = 64; + void* ptr = my_malloc(size); + + my_free(ptr, FALSE); + + TEST_ASSERT_EQUAL(size, total_freed_memory); +} + +// Test for `my_calloc` +void test_my_calloc_zeroes_memory(void) +{ + size_t count = 10; + size_t size = 4; + void* ptr = my_calloc(count, size); + + printf("test_my_calloc_zeroes_memory\n"); + + TEST_ASSERT_NOT_NULL(ptr); + + char* data = (char*)ptr; + for (size_t i = 0; i < count * size; i++) + { + TEST_ASSERT_EQUAL(0, data[i]); + } + + my_free(ptr, FALSE); // Clean up +} + +// Test for `my_realloc` +void test_my_realloc_increases_memory(void) +{ + size_t initial_size = 64; + size_t new_size = 128; + void* ptr = my_malloc(initial_size); + + void* new_ptr = my_realloc(ptr, new_size); + + TEST_ASSERT_NOT_NULL(new_ptr); + TEST_ASSERT_EQUAL(initial_size + new_size, total_allocated_memory); + + my_free(new_ptr, FALSE); // Clean up +} + +// Test for `split_block` +void test_split_block_creates_new_block(void) +{ + size_t size = 128; + void* ptr = my_malloc(size); + + t_block block = get_block(ptr); + size_t split_size = 64; + split_block(block, split_size); + + TEST_ASSERT_EQUAL(split_size, block->size); + TEST_ASSERT_NOT_NULL(block->next); + TEST_ASSERT_EQUAL(size - split_size - BLOCK_MIN_SIZE, block->next->size); + + my_free(ptr, FALSE); // Clean up +} + +// Test for `fusion` +void test_fusion_merges_adjacent_blocks(void) +{ + size_t size = 64; + void* ptr1 = my_malloc(size); + void* ptr2 = my_malloc(size); + + my_free(ptr1, FALSE); + my_free(ptr2, FALSE); + + t_block block = get_block(ptr1); + block = fusion(block); + + TEST_ASSERT_EQUAL(size * 2 + BLOCK_MIN_SIZE, block->size); +} + +// Test for `valid_addr` +void test_valid_addr_validates_pointer(void) +{ + size_t size = 64; + void* ptr = my_malloc(size); + + TEST_ASSERT_TRUE(valid_addr(ptr)); + TEST_ASSERT_FALSE(valid_addr((void*)0x12345678)); // Invalid address + + my_free(ptr, FALSE); // Clean up +} + +// Test for `extend_heap` +void test_extend_heap_adds_memory(void) +{ + size_t size = 128; + t_block block = extend_heap(NULL, size); + + TEST_ASSERT_NOT_NULL(block); + TEST_ASSERT_EQUAL(size, block->size); + + munmap(block, size + BLOCK_MIN_SIZE); // Clean up +} + +int main(void) +{ + UNITY_BEGIN(); + + RUN_TEST(test_my_malloc_allocates_memory); + RUN_TEST(test_my_free_frees_memory); + RUN_TEST(test_my_calloc_zeroes_memory); + RUN_TEST(test_my_realloc_increases_memory); + RUN_TEST(test_split_block_creates_new_block); + RUN_TEST(test_fusion_merges_adjacent_blocks); + RUN_TEST(test_valid_addr_validates_pointer); + RUN_TEST(test_extend_heap_adds_memory); + + return UNITY_END(); +} From fc615ae58719cecf6c63f1ffc64970dd84d3fe41 Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Wed, 27 Nov 2024 19:47:06 -0300 Subject: [PATCH 17/21] Testing CI/CD --- .github/actions/building/action.yml | 24 ++------------------ .github/actions/coverage_and_test/action.yml | 5 ---- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/.github/actions/building/action.yml b/.github/actions/building/action.yml index c239b08..9af2669 100644 --- a/.github/actions/building/action.yml +++ b/.github/actions/building/action.yml @@ -12,32 +12,12 @@ runs: set -e # Define the root directory of the project (adjust if necessary) - PROJECT_ROOT="/home/runner/work/so-i-24-chp2-iledesma08/so-i-24-chp2-iledesma08" + PROJECT_ROOT="/home/runner/work/so-i-24-chp3-iledesma08/so-i-24-chp3-iledesma08" # Update package list and install necessary dependencies echo "Updating package list and installing dependencies..." sudo apt update - sudo apt install -y libmicrohttpd-dev python3-pip - - # Build and install prom-c-client - echo "Building and installing prom-c-client..." - cd "$PROJECT_ROOT/metrics_monitor/lib/prom-c-client/prom" - mkdir -p build - cd build - cmake .. - make - sudo make install - sudo rm -rf build # Clean up build directory after installation - - # Build and install promhttp - echo "Building and installing promhttp..." - cd "$PROJECT_ROOT/metrics_monitor/lib/prom-c-client/promhttp" - mkdir -p build - cd build - cmake .. - make - sudo make install - sudo rm -rf build # Clean up build directory after installation + sudo apt install -y python3-pip # Install Conan and detect profile echo "Installing Conan and setting up dependencies..." diff --git a/.github/actions/coverage_and_test/action.yml b/.github/actions/coverage_and_test/action.yml index 2fde49a..af552da 100644 --- a/.github/actions/coverage_and_test/action.yml +++ b/.github/actions/coverage_and_test/action.yml @@ -9,11 +9,6 @@ runs: run: | echo "Showing current directory" echo $(pwd) - echo "Showing content of $HOME" - ls $HOME - echo "Making Desktop inside HOME to reproduce test" - mkdir -p $HOME/Desktop - sudo ldconfig PROJECT_PATH=$(pwd) From af4d4222b0f254bf43a392f3ae2a871b7ab8d06f Mon Sep 17 00:00:00 2001 From: Ignacio Ledesma Date: Wed, 27 Nov 2024 19:58:42 -0300 Subject: [PATCH 18/21] clang-format errors --- .gitignore | 2 + Doxyfile | 2851 +---------------------------------------- include/mem_logging.h | 1 - include/memory.h | 5 +- include/test_mem.h | 4 +- 5 files changed, 7 insertions(+), 2856 deletions(-) diff --git a/.gitignore b/.gitignore index f2037ed..7b269a8 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,5 @@ venv/ # CMake CMakeUserPresets.json + +test.sh diff --git a/Doxyfile b/Doxyfile index cf46b88..0e9f99d 100644 --- a/Doxyfile +++ b/Doxyfile @@ -1,2850 +1 @@ -# Doxyfile 1.10.0 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). -# -# Note: -# -# Use doxygen to compare the used configuration file with the template -# configuration file: -# doxygen -x [configFile] -# Use doxygen to compare the used configuration file with the template -# configuration file without replacing the environment variables or CMake type -# replacement variables: -# doxygen -x_noenv [configFile] - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the configuration -# file that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# https://www.gnu.org/software/libiconv/ for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = #LabX - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = #v1.2.0 - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = #"Source code documentation" - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = - -# With the PROJECT_ICON tag one can specify an icon that is included in the tabs -# when the HTML document is shown. Doxygen will copy the logo to the output -# directory. - -PROJECT_ICON = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 -# sub-directories (in 2 levels) under the output directory of each output format -# and will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to -# control the number of sub-directories. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# Controls the number of sub-directories that will be created when -# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every -# level increment doubles the number of directories, resulting in 4096 -# directories at level 8 which is the default and also the maximum value. The -# sub-directories are organized in 2 levels, the first level always has a fixed -# number of 16 directories. -# Minimum value: 0, maximum value: 8, default value: 8. -# This tag requires that the tag CREATE_SUBDIRS is set to YES. - -CREATE_SUBDIRS_LEVEL = 8 - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, -# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English -# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, -# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with -# English messages), Korean, Korean-en (Korean with English messages), Latvian, -# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, -# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, -# Swedish, Turkish, Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = YES - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = NO - -# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line -# such as -# /*************** -# as being the beginning of a Javadoc-style comment "banner". If set to NO, the -# Javadoc-style will behave just like regular comments and it will not be -# interpreted by doxygen. -# The default value is: NO. - -JAVADOC_BANNER = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# By default Python docstrings are displayed as preformatted text and doxygen's -# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the -# doxygen's special commands can be used and the contents of the docstring -# documentation blocks is shown as doxygen documentation. -# The default value is: YES. - -PYTHON_DOCSTRING = YES - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:^^" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". Note that you cannot put \n's in the value part of an alias -# to insert newlines (in the resulting output). You can put ^^ in the value part -# of an alias to insert a newline as if a physical newline was in the original -# file. When you need a literal { or } or , in the value part of an alias you -# have to escape them by means of a backslash (\), this can lead to conflicts -# with the commands \{ and \} for these it is advised to use the version @{ and -# @} or use a double escape (\\{ and \\}) - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice -# sources only. Doxygen will then generate output that is more tailored for that -# language. For instance, namespaces will be presented as modules, types will be -# separated into more groups, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_SLICE = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, -# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: -# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser -# tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files). For instance to make doxygen treat .inc files -# as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. When specifying no_extension you should add -# * to the FILE_PATTERNS. -# -# Note see also the list of default file extension mappings. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See https://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up -# to that level are automatically included in the table of contents, even if -# they do not have an id attribute. -# Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 5. -# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. - -TOC_INCLUDE_HEADINGS = 0 - -# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to -# generate identifiers for the Markdown headings. Note: Every identifier is -# unique. -# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a -# sequence number starting at 0 and GITHUB use the lower case version of title -# with any whitespace replaced by '-' and punctuation characters removed. -# The default value is: DOXYGEN. -# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. - -MARKDOWN_ID_STYLE = DOXYGEN - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use -# during processing. When set to 0 doxygen will based this on the number of -# cores available in the system. You can set it explicitly to a value larger -# than 0 to get more control over the balance between CPU load and processing -# speed. At this moment only the input processing can be done using multiple -# threads. Since this is still an experimental feature the default is set to 1, -# which effectively disables parallel processing. Please report any issues you -# encounter. Generating dot graphs in parallel is controlled by the -# DOT_NUM_THREADS setting. -# Minimum value: 0, maximum value: 32, default value: 1. - -NUM_PROC_THREADS = 1 - -# If the TIMESTAMP tag is set different from NO then each generated page will -# contain the date or date and time when the page was generated. Setting this to -# NO can help when comparing the output of multiple runs. -# Possible values are: YES, NO, DATETIME and DATE. -# The default value is: NO. - -TIMESTAMP = NO - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual -# methods of a class will be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIV_VIRTUAL = NO - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If this flag is set to YES, the name of an unnamed parameter in a declaration -# will be determined by the corresponding definition. By default unnamed -# parameters remain unnamed in the output. -# The default value is: YES. - -RESOLVE_UNNAMED_PARAMS = YES - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# will also hide undocumented C++ concepts if enabled. This option has no effect -# if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# declarations. If set to NO, these declarations will be included in the -# documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# With the correct setting of option CASE_SENSE_NAMES doxygen will better be -# able to match the capabilities of the underlying filesystem. In case the -# filesystem is case sensitive (i.e. it supports files in the same directory -# whose names only differ in casing), the option must be set to YES to properly -# deal with such files in case they appear in the input. For filesystems that -# are not case sensitive the option should be set to NO to properly deal with -# output files written for symbols that only differ in casing, such as for two -# classes, one named CLASS and the other named Class, and to also support -# references to files without having to specify the exact matching casing. On -# Windows (including Cygwin) and MacOS, users should typically set this option -# to NO, whereas on Linux or other Unix flavors it should typically be set to -# YES. -# Possible values are: SYSTEM, NO and YES. -# The default value is: SYSTEM. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class -# will show which file needs to be included to use the class. -# The default value is: YES. - -SHOW_HEADERFILE = YES - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST = YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. See also section "Changing the -# layout of pages" for information. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as documenting some parameters in -# a documented function twice, or documenting parameters that don't exist or -# using markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete -# function parameter documentation. If set to NO, doxygen will accept that some -# parameters have no documentation without warning. -# The default value is: YES. - -WARN_IF_INCOMPLETE_DOC = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong parameter -# documentation, but not about the absence of documentation. If EXTRACT_ALL is -# set to YES then this flag will automatically be disabled. See also -# WARN_IF_INCOMPLETE_DOC -# The default value is: NO. - -WARN_NO_PARAMDOC = YES - -# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about -# undocumented enumeration values. If set to NO, doxygen will accept -# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: NO. - -WARN_IF_UNDOC_ENUM_VAL = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS -# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but -# at the end of the doxygen process doxygen will return with a non-zero status. -# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves -# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not -# write the warning messages in between other messages but write them at the end -# of a run, in case a WARN_LOGFILE is defined the warning messages will be -# besides being in the defined file also be shown at the end of a run, unless -# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case -# the behavior will remain as with the setting FAIL_ON_WARNINGS. -# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# See also: WARN_LINE_FORMAT -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# In the $text part of the WARN_FORMAT command it is possible that a reference -# to a more specific place is given. To make it easier to jump to this place -# (outside of doxygen) the user can define a custom "cut" / "paste" string. -# Example: -# WARN_LINE_FORMAT = "'vi $file +$line'" -# See also: WARN_FORMAT -# The default value is: at line $line of file $file. - -WARN_LINE_FORMAT = "at line $line of file $file" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). In case the file specified cannot be opened for writing the -# warning and error messages are written to standard error. When as file - is -# specified the warning and error messages are written to standard output -# (stdout). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = ./include \ - ./src \ - ./lib - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: -# https://www.gnu.org/software/libiconv/) for the list of possible encodings. -# See also: INPUT_FILE_ENCODING -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify -# character encoding on a per file pattern basis. Doxygen will compare the file -# name with each pattern and apply the encoding instead of the default -# INPUT_ENCODING) if there is a match. The character encodings are a list of the -# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding -# "INPUT_ENCODING" for further information on supported encodings. - -INPUT_FILE_ENCODING = - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# Note the list of default checked file patterns might differ from the list of -# default file extension mappings. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, -# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, -# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, -# *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to -# be provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. - -FILE_PATTERNS = *.c \ - *.h \ - *.cpp \ - *.hpp - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = external \ - tests - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = main.c README.md - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# ANamespace::AClass, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that doxygen will use the data processed and written to standard output -# for further processing, therefore nothing else, like debug statements or used -# commands (so in case of a Windows batch file always use @echo OFF), should be -# written to standard output. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -# The Fortran standard specifies that for fixed formatted Fortran code all -# characters from position 72 are to be considered as comment. A common -# extension is to allow longer lines before the automatic comment starts. The -# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can -# be processed before the automatic comment starts. -# Minimum value: 7, maximum value: 10000, default value: 72. - -FORTRAN_COMMENT_AFTER = 72 - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# multi-line macros, enums or list initialized variables directly into the -# documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# entity all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see https://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: -# http://clang.llvm.org/) for more accurate parsing at the cost of reduced -# performance. This can be particularly helpful with template rich C++ code for -# which doxygen's built-in parser lacks the necessary type information. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse_libclang=ON option for CMake. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = NO - -# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS -# tag is set to YES then doxygen will add the directory of each input to the -# include path. -# The default value is: YES. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_ADD_INC_PATHS = YES - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = - -# If clang assisted parsing is enabled you can provide the clang parser with the -# path to the directory containing a file called compile_commands.json. This -# file is the compilation database (see: -# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the -# options used when the source files were built. This is equivalent to -# specifying the -p option to a clang tool, such as clang-check. These options -# will then be passed to the parser. Any options specified with CLANG_OPTIONS -# will be added as well. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse_libclang=ON option for CMake. - -CLANG_DATABASE_PATH = - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) -# that should be ignored while generating the index headers. The IGNORE_PREFIX -# tag works for classes, function and member names. The entity will be placed in -# the alphabetical list under the first letter of the entity name that remains -# after removing the prefix. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES # Change to generate HTML output - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = documentation - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). -# Note: Since the styling of scrollbars can currently not be overruled in -# Webkit/Chromium, the styling will be left out of the default doxygen.css if -# one or more extra stylesheets have been specified. So if scrollbar -# customization is desired it has to be added explicitly. For an example see the -# documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output -# should be rendered with a dark or light theme. -# Possible values are: LIGHT always generate light mode output, DARK always -# generate dark mode output, AUTO_LIGHT automatically set the mode according to -# the user preference, use light mode if no preference is set (the default), -# AUTO_DARK automatically set the mode according to the user preference, use -# dark mode if no preference is set and TOGGLE allow to user to switch between -# light and dark mode via a button. -# The default value is: AUTO_LIGHT. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE = AUTO_LIGHT - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a color-wheel, see -# https://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use gray-scales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML -# documentation will contain a main index with vertical navigation menus that -# are dynamically created via JavaScript. If disabled, the navigation index will -# consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have JavaScript, -# like the Qt help browser. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_MENUS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be -# dynamically folded and expanded in the generated HTML source code. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_CODE_FOLDING = YES - -# If the HTML_COPY_CLIPBOARD tag is set to YES then doxygen will show an icon in -# the top right corner of code and text fragments that allows the user to copy -# its content to the clipboard. Note this only works if supported by the browser -# and the web page is served via a secure context (see: -# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file: -# protocol. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COPY_CLIPBOARD = YES - -# Doxygen stores a couple of settings persistently in the browser (via e.g. -# cookies). By default these settings apply to all HTML pages generated by -# doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store -# the settings under a project specific key, such that the user preferences will -# be stored separately. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_PROJECT_COOKIE = - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: -# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To -# create a documentation set, doxygen will generate a Makefile in the HTML -# output directory. Running make will produce the docset in that directory and -# running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy -# genXcode/_index.html for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag determines the URL of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDURL = - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# on Windows. In the beginning of 2021 Microsoft took the original page, with -# a.o. the download links, offline the HTML help workshop was already many years -# in maintenance mode). You can download the HTML help workshop from the web -# archives at Installation executable (see: -# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo -# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the main .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# The SITEMAP_URL tag is used to specify the full URL of the place where the -# generated documentation will be placed on the server by the user during the -# deployment of the documentation. The generated sitemap is called sitemap.xml -# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL -# is specified no sitemap is generated. For information about the sitemap -# protocol see https://www.sitemaps.org -# This tag requires that the tag GENERATE_HTML is set to YES. - -SITEMAP_URL = - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location (absolute path -# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to -# run qhelpgenerator on the generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = YES - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine tune the look of the index (see "Fine-tuning the output"). As an -# example, the default style sheet generated by doxygen has an example that -# shows how to put an image at the root of the tree instead of the PROJECT_NAME. -# Since the tree basically has the same information as the tab index, you could -# consider setting DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = YES - -# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the -# FULL_SIDEBAR option determines if the side bar is limited to only the treeview -# area (value NO) or if it should extend to the full height of the window (value -# YES). Setting this to YES gives a layout similar to -# https://docs.readthedocs.io with more room for contents, but less room for the -# project logo, title, and description. If either GENERATE_TREEVIEW or -# DISABLE_INDEX is set to NO, this option has no effect. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FULL_SIDEBAR = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email -# addresses. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -OBFUSCATE_EMAILS = YES - -# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg -# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see -# https://inkscape.org) to generate formulas as SVG images instead of PNGs for -# the HTML output. These images will generally look nicer at scaled resolutions. -# Possible values are: png (the default) and svg (looks nicer but requires the -# pdf2svg or inkscape tool). -# The default value is: png. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FORMULA_FORMAT = png - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands -# to create new LaTeX commands to be used in formulas as building blocks. See -# the section "Including formulas" for details. - -FORMULA_MACROFILE = - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side JavaScript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. -# Note that the different versions of MathJax have different requirements with -# regards to the different settings, so it is possible that also other MathJax -# settings have to be changed when switching between the different MathJax -# versions. -# Possible values are: MathJax_2 and MathJax_3. -# The default value is: MathJax_2. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_VERSION = MathJax_2 - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. For more details about the output format see MathJax -# version 2 (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 -# (see: -# http://docs.mathjax.org/en/latest/web/components/output.html). -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility. This is the name for Mathjax version 2, for MathJax version 3 -# this will be translated into chtml), NativeMML (i.e. MathML. Only supported -# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This -# is the name for Mathjax version 3, for MathJax version 2 this will be -# translated into HTML-CSS) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. The default value is: -# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 -# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# for MathJax version 2 (see -# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# For example for MathJax version 3 (see -# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): -# MATHJAX_EXTENSIONS = ams -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /

eO#$m&iT zx7uD#AMo39o1(z6$hd%J+XDy7>7t4U8nDf>joi)ysy;VuReqqdPo#V7vXx+dE@V5n zDf~f!J4QHe=SM9_d#{RDEiVDpeo)n2*}otKTSuSnqjB-QUp;-X?YWlAcl`C07izTP zFFyR%uP3=J4CkCMPPVUu7*$xmP&jiZQ8Mf2xXq zjP&=>$6ey2s23Z>jxDz3t8g%kiA*kQ6f84u8HO+p_a8A5$$WAmRj`uz{v(~~TsGNn zj;52gt+K@!n=y^?RMt$VPAA29E+;Z(I-MI66GzY?;Ov|4*l)226YMBly!WMQ37F`V?B>il)A9Zv0nW&!Q@dd z16~Ha40svvGT>#v%Yc^wF9ZMg8PMlH2UVMPkH}QK z|0i^<-5w^6?*SuRq!{|7Ad()-Gil;2>Pm-<&0rF@#?@$(GeqMvKOKnnfb`fo7# z%&OH$;SVxT;WreQYq!s_-$g~qe^&bM%`@3?Q(w5MzxAg>`dh2(bl)ZY=Qph&Rj^4_ z5GXE>*KY4x!~doBo`24@?D9NPBKCqCUOU)M68{uU5Z;T10fUIx4jcp30A;AOzefR_O;16~Ha4E%3r z0Q)(ye-nErc~2;pjW#K55Z$EY@2h>FA5${+i8d=4k4)QuSNlcz8I23z}h}x`)y`N{4{SJ1f@{~;kHVro^S;54L+9#@DLRWS?KVt9bT}r=LV>8eB8gZ@YP)U}@m7hk}l!^m8y%U%EmtFdM zl^)|1{`-mXiMvE7Y-^DBPN}CI;A-62Rv|t|49CT|hyIlG-y$%Mp?{v3O6~u;^rzN_ zY){?|z@=J$Uy-&t5#o-xN~QY0O+J3HN#J`1$m_)T#8%N1hQ_9EOMQcI-`}4~b8YDy z0Z_}*e`_gk(0?HHjiv7o^nU7?pH6!S*L?|)zS2JXX3~cMcF_G*{2#93f4qu+TIz4z zXFpY?o@YsapQ9Zmb}Vldtm*M_ZA`3f$2Y8uF~%G63&JoGIb$N78#U8L!ph|fhB-YW z#&VgdG;O(0Xl<1}c$0q0F!OnH)<|Zp{Hz$yo0+7Mn9gKo3F43p^0dlaY5P7kCzC7` z%n3RUV8nVON1{gbXcr$G;EFkBA!kgQ*#w^#=sJEha^!F)Y3T@t5!Dqy@9HHL9W4N~ zyXVo4NRRPoEY=t8H~J$TJyEKV!>jWHVdrsye|JQ|K4(zwUVgyAK9^AD!N(P3r61vJ zLm5zLh1rZ{juN%IVg9Rj?g$aobO%vr#QmM-D&R*H z1KO%QF^^%MLBrexQ7ghv#<4nBPG|Dww)RBMHW>(L{T8li4Q3pXt?BQGnf`Yzu>};C<7?k zi)tW)KI6h;odC-7g|i?obmxe1wjc8-DAsZCclZBm3Xl6ILdsK7?w_-SoC5Lo`e5z; z&nXAcR+qm!{sppg`w{Ers!gbq&t!i@Vm;$&u5i>KluBBwmb2wyKU*42&9ZIQSjqoCH#wfY``^z16jlW3#Z$? A&j0`b diff --git a/docs/secret_files/87014aef1d77646b/header2 b/docs/secret_files/87014aef1d77646b/header2 deleted file mode 100644 index c5121e0e3eb5d350cba697c9f971a5c9bd28680e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 tcmb<-^>JfjWMqH=W(GS35U)T0BH{p*u-F4-04WCs3kFUgsm!3n005f01Xln6 diff --git a/docs/secret_files/87014aef1d77646b/pendrive_image.bmp b/docs/secret_files/87014aef1d77646b/pendrive_image.bmp deleted file mode 100644 index 128f265b896d46174a0936d8bdb805bb1c8500f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94398 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 WS*}zp1Cz~u++%1wXfiN~?7sjF656H! diff --git a/docs/secret_files/87014aef1d77646b/program.asm b/docs/secret_files/87014aef1d77646b/program.asm deleted file mode 100644 index 2d5524c..0000000 --- a/docs/secret_files/87014aef1d77646b/program.asm +++ /dev/null @@ -1,288 +0,0 @@ - -program: file format elf64-x86-64 - - -Disassembly of section .init: - -0000000000401000 <_init>: - 401000: f3 0f 1e fa endbr64 - 401004: 48 83 ec 08 sub $0x8,%rsp - 401008: 48 8b 05 e1 2f 00 00 mov 0x2fe1(%rip),%rax # 403ff0 <__gmon_start__> - 40100f: 48 85 c0 test %rax,%rax - 401012: 74 02 je 401016 <_init+0x16> - 401014: ff d0 call *%rax - 401016: 48 83 c4 08 add $0x8,%rsp - 40101a: c3 ret - -Disassembly of section .plt: - -0000000000401020 <.plt>: - 401020: ff 35 e2 2f 00 00 push 0x2fe2(%rip) # 404008 <_GLOBAL_OFFSET_TABLE_+0x8> - 401026: ff 25 e4 2f 00 00 jmp *0x2fe4(%rip) # 404010 <_GLOBAL_OFFSET_TABLE_+0x10> - 40102c: 0f 1f 40 00 nopl 0x0(%rax) - -0000000000401030 : - 401030: ff 25 e2 2f 00 00 jmp *0x2fe2(%rip) # 404018 - 401036: 68 00 00 00 00 push $0x0 - 40103b: e9 e0 ff ff ff jmp 401020 <.plt> - -0000000000401040 : - 401040: ff 25 da 2f 00 00 jmp *0x2fda(%rip) # 404020 - 401046: 68 01 00 00 00 push $0x1 - 40104b: e9 d0 ff ff ff jmp 401020 <.plt> - -0000000000401050 : - 401050: ff 25 d2 2f 00 00 jmp *0x2fd2(%rip) # 404028 - 401056: 68 02 00 00 00 push $0x2 - 40105b: e9 c0 ff ff ff jmp 401020 <.plt> - -0000000000401060 : - 401060: ff 25 ca 2f 00 00 jmp *0x2fca(%rip) # 404030 - 401066: 68 03 00 00 00 push $0x3 - 40106b: e9 b0 ff ff ff jmp 401020 <.plt> - -0000000000401070 : - 401070: ff 25 c2 2f 00 00 jmp *0x2fc2(%rip) # 404038 - 401076: 68 04 00 00 00 push $0x4 - 40107b: e9 a0 ff ff ff jmp 401020 <.plt> - -0000000000401080 : - 401080: ff 25 ba 2f 00 00 jmp *0x2fba(%rip) # 404040 - 401086: 68 05 00 00 00 push $0x5 - 40108b: e9 90 ff ff ff jmp 401020 <.plt> - -0000000000401090 : - 401090: ff 25 b2 2f 00 00 jmp *0x2fb2(%rip) # 404048 - 401096: 68 06 00 00 00 push $0x6 - 40109b: e9 80 ff ff ff jmp 401020 <.plt> - -00000000004010a0 : - 4010a0: ff 25 aa 2f 00 00 jmp *0x2faa(%rip) # 404050 - 4010a6: 68 07 00 00 00 push $0x7 - 4010ab: e9 70 ff ff ff jmp 401020 <.plt> - -00000000004010b0 : - 4010b0: ff 25 a2 2f 00 00 jmp *0x2fa2(%rip) # 404058 - 4010b6: 68 08 00 00 00 push $0x8 - 4010bb: e9 60 ff ff ff jmp 401020 <.plt> - -Disassembly of section .text: - -00000000004010c0 <_start>: - 4010c0: f3 0f 1e fa endbr64 - 4010c4: 31 ed xor %ebp,%ebp - 4010c6: 49 89 d1 mov %rdx,%r9 - 4010c9: 5e pop %rsi - 4010ca: 48 89 e2 mov %rsp,%rdx - 4010cd: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp - 4010d1: 50 push %rax - 4010d2: 54 push %rsp - 4010d3: 45 31 c0 xor %r8d,%r8d - 4010d6: 31 c9 xor %ecx,%ecx - 4010d8: 48 c7 c7 2c 12 40 00 mov $0x40122c,%rdi - 4010df: ff 15 fb 2e 00 00 call *0x2efb(%rip) # 403fe0 <__libc_start_main@GLIBC_2.34> - 4010e5: f4 hlt - 4010e6: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) - 4010ed: 00 00 00 - -00000000004010f0 <_dl_relocate_static_pie>: - 4010f0: f3 0f 1e fa endbr64 - 4010f4: c3 ret - 4010f5: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) - 4010fc: 00 00 00 - 4010ff: 90 nop - -0000000000401100 : - 401100: 48 8d 3d 61 2f 00 00 lea 0x2f61(%rip),%rdi # 404068 - 401107: 48 8d 05 5a 2f 00 00 lea 0x2f5a(%rip),%rax # 404068 - 40110e: 48 39 f8 cmp %rdi,%rax - 401111: 74 15 je 401128 - 401113: 48 8b 05 ce 2e 00 00 mov 0x2ece(%rip),%rax # 403fe8 <_ITM_deregisterTMCloneTable> - 40111a: 48 85 c0 test %rax,%rax - 40111d: 74 09 je 401128 - 40111f: ff e0 jmp *%rax - 401121: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) - 401128: c3 ret - 401129: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) - -0000000000401130 : - 401130: 48 8d 3d 31 2f 00 00 lea 0x2f31(%rip),%rdi # 404068 - 401137: 48 8d 35 2a 2f 00 00 lea 0x2f2a(%rip),%rsi # 404068 - 40113e: 48 29 fe sub %rdi,%rsi - 401141: 48 89 f0 mov %rsi,%rax - 401144: 48 c1 ee 3f shr $0x3f,%rsi - 401148: 48 c1 f8 03 sar $0x3,%rax - 40114c: 48 01 c6 add %rax,%rsi - 40114f: 48 d1 fe sar $1,%rsi - 401152: 74 14 je 401168 - 401154: 48 8b 05 9d 2e 00 00 mov 0x2e9d(%rip),%rax # 403ff8 <_ITM_registerTMCloneTable> - 40115b: 48 85 c0 test %rax,%rax - 40115e: 74 08 je 401168 - 401160: ff e0 jmp *%rax - 401162: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) - 401168: c3 ret - 401169: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) - -0000000000401170 <__do_global_dtors_aux>: - 401170: f3 0f 1e fa endbr64 - 401174: 80 3d f5 2e 00 00 00 cmpb $0x0,0x2ef5(%rip) # 404070 - 40117b: 75 13 jne 401190 <__do_global_dtors_aux+0x20> - 40117d: 55 push %rbp - 40117e: 48 89 e5 mov %rsp,%rbp - 401181: e8 7a ff ff ff call 401100 - 401186: c6 05 e3 2e 00 00 01 movb $0x1,0x2ee3(%rip) # 404070 - 40118d: 5d pop %rbp - 40118e: c3 ret - 40118f: 90 nop - 401190: c3 ret - 401191: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1) - 401198: 00 00 00 00 - 40119c: 0f 1f 40 00 nopl 0x0(%rax) - -00000000004011a0 : - 4011a0: f3 0f 1e fa endbr64 - 4011a4: eb 8a jmp 401130 - -00000000004011a6 : - 4011a6: 55 push %rbp - 4011a7: 48 89 e5 mov %rsp,%rbp - 4011aa: 48 83 ec 20 sub $0x20,%rsp - 4011ae: bf 7a 00 00 00 mov $0x7a,%edi - 4011b3: e8 d8 fe ff ff call 401090 - 4011b8: 48 89 45 f0 mov %rax,-0x10(%rbp) - 4011bc: bf 9a 20 40 00 mov $0x40209a,%edi - 4011c1: e8 6a fe ff ff call 401030 - 4011c6: 48 89 45 e8 mov %rax,-0x18(%rbp) - 4011ca: 48 8b 45 e8 mov -0x18(%rbp),%rax - 4011ce: 48 89 c7 mov %rax,%rdi - 4011d1: e8 8a fe ff ff call 401060 - 4011d6: 48 89 45 e0 mov %rax,-0x20(%rbp) - 4011da: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp) - 4011e1: eb 3b jmp 40121e - 4011e3: 8b 45 fc mov -0x4(%rbp),%eax - 4011e6: 48 98 cltq - 4011e8: 0f b6 80 20 20 40 00 movzbl 0x402020(%rax),%eax - 4011ef: 89 c6 mov %eax,%esi - 4011f1: 8b 45 fc mov -0x4(%rbp),%eax - 4011f4: 48 98 cltq - 4011f6: ba 00 00 00 00 mov $0x0,%edx - 4011fb: 48 f7 75 e0 divq -0x20(%rbp) - 4011ff: 48 8b 45 e8 mov -0x18(%rbp),%rax - 401203: 48 01 d0 add %rdx,%rax - 401206: 0f b6 10 movzbl (%rax),%edx - 401209: 8b 45 fc mov -0x4(%rbp),%eax - 40120c: 48 63 c8 movslq %eax,%rcx - 40120f: 48 8b 45 f0 mov -0x10(%rbp),%rax - 401213: 48 01 c8 add %rcx,%rax - 401216: 31 f2 xor %esi,%edx - 401218: 88 10 mov %dl,(%rax) - 40121a: 83 45 fc 01 addl $0x1,-0x4(%rbp) - 40121e: 8b 45 fc mov -0x4(%rbp),%eax - 401221: 83 f8 79 cmp $0x79,%eax - 401224: 76 bd jbe 4011e3 - 401226: 48 8b 45 f0 mov -0x10(%rbp),%rax - 40122a: c9 leave - 40122b: c3 ret - -000000000040122c
: - 40122c: 55 push %rbp - 40122d: 48 89 e5 mov %rsp,%rbp - 401230: 48 83 ec 10 sub $0x10,%rsp - 401234: 89 7d fc mov %edi,-0x4(%rbp) - 401237: 48 89 75 f0 mov %rsi,-0x10(%rbp) - 40123b: b8 00 00 00 00 mov $0x0,%eax - 401240: e8 15 00 00 00 call 40125a

- 401245: 48 8b 45 f0 mov -0x10(%rbp),%rax - 401249: 48 83 c0 08 add $0x8,%rax - 40124d: 48 8b 00 mov (%rax),%rax - 401250: 48 89 c7 mov %rax,%rdi - 401253: e8 9f 00 00 00 call 4012f7 - 401258: c9 leave - 401259: c3 ret - -000000000040125a

: - 40125a: 55 push %rbp - 40125b: 48 89 e5 mov %rsp,%rbp - 40125e: bf aa 20 40 00 mov $0x4020aa,%edi - 401263: b8 00 00 00 00 mov $0x0,%eax - 401268: e8 03 fe ff ff call 401070 - 40126d: 48 8b 05 f4 2d 00 00 mov 0x2df4(%rip),%rax # 404068 - 401274: 48 89 c7 mov %rax,%rdi - 401277: e8 24 fe ff ff call 4010a0 - 40127c: bf 01 00 00 00 mov $0x1,%edi - 401281: e8 2a fe ff ff call 4010b0 - 401286: bf c7 20 40 00 mov $0x4020c7,%edi - 40128b: e8 c0 fd ff ff call 401050 - 401290: bf d8 20 40 00 mov $0x4020d8,%edi - 401295: b8 00 00 00 00 mov $0x0,%eax - 40129a: e8 d1 fd ff ff call 401070 - 40129f: 48 8b 05 c2 2d 00 00 mov 0x2dc2(%rip),%rax # 404068 - 4012a6: 48 89 c7 mov %rax,%rdi - 4012a9: e8 f2 fd ff ff call 4010a0 - 4012ae: bf 01 00 00 00 mov $0x1,%edi - 4012b3: e8 f8 fd ff ff call 4010b0 - 4012b8: bf c7 20 40 00 mov $0x4020c7,%edi - 4012bd: e8 8e fd ff ff call 401050 - 4012c2: bf 08 21 40 00 mov $0x402108,%edi - 4012c7: b8 00 00 00 00 mov $0x0,%eax - 4012cc: e8 9f fd ff ff call 401070 - 4012d1: 48 8b 05 90 2d 00 00 mov 0x2d90(%rip),%rax # 404068 - 4012d8: 48 89 c7 mov %rax,%rdi - 4012db: e8 c0 fd ff ff call 4010a0 - 4012e0: bf 01 00 00 00 mov $0x1,%edi - 4012e5: e8 c6 fd ff ff call 4010b0 - 4012ea: bf 44 21 40 00 mov $0x402144,%edi - 4012ef: e8 5c fd ff ff call 401050 - 4012f4: 90 nop - 4012f5: 5d pop %rbp - 4012f6: c3 ret - -00000000004012f7 : - 4012f7: 55 push %rbp - 4012f8: 48 89 e5 mov %rsp,%rbp - 4012fb: 48 83 ec 20 sub $0x20,%rsp - 4012ff: 48 89 7d e8 mov %rdi,-0x18(%rbp) - 401303: 48 8b 45 e8 mov -0x18(%rbp),%rax - 401307: be a3 20 40 00 mov $0x4020a3,%esi - 40130c: 48 89 c7 mov %rax,%rdi - 40130f: e8 6c fd ff ff call 401080 - 401314: 85 c0 test %eax,%eax - 401316: 75 75 jne 40138d - 401318: 48 8b 45 e8 mov -0x18(%rbp),%rax - 40131c: 48 89 c6 mov %rax,%rsi - 40131f: bf 58 21 40 00 mov $0x402158,%edi - 401324: b8 00 00 00 00 mov $0x0,%eax - 401329: e8 42 fd ff ff call 401070 - 40132e: 48 8b 05 33 2d 00 00 mov 0x2d33(%rip),%rax # 404068 - 401335: 48 89 c7 mov %rax,%rdi - 401338: e8 63 fd ff ff call 4010a0 - 40133d: bf 01 00 00 00 mov $0x1,%edi - 401342: e8 69 fd ff ff call 4010b0 - 401347: bf c7 20 40 00 mov $0x4020c7,%edi - 40134c: e8 ff fc ff ff call 401050 - 401351: b8 00 00 00 00 mov $0x0,%eax - 401356: e8 4b fe ff ff call 4011a6 - 40135b: 48 89 45 f8 mov %rax,-0x8(%rbp) - 40135f: 48 8b 45 f8 mov -0x8(%rbp),%rax - 401363: 48 89 c7 mov %rax,%rdi - 401366: e8 d5 fc ff ff call 401040 - 40136b: 48 8b 45 f8 mov -0x8(%rbp),%rax - 40136f: 0f b6 00 movzbl (%rax),%eax - 401372: 0f be c0 movsbl %al,%eax - 401375: 89 c6 mov %eax,%esi - 401377: bf 9c 21 40 00 mov $0x40219c,%edi - 40137c: b8 00 00 00 00 mov $0x0,%eax - 401381: e8 ea fc ff ff call 401070 - 401386: b8 00 00 00 00 mov $0x0,%eax - 40138b: eb 05 jmp 401392 - 40138d: b8 01 00 00 00 mov $0x1,%eax - 401392: c9 leave - 401393: c3 ret - -Disassembly of section .fini: - -0000000000401394 <_fini>: - 401394: f3 0f 1e fa endbr64 - 401398: 48 83 ec 08 sub $0x8,%rsp - 40139c: 48 83 c4 08 add $0x8,%rsp - 4013a0: c3 ret diff --git a/docs/secret_files/PracticalBinary_Ch5.pdf b/docs/secret_files/PracticalBinary_Ch5.pdf deleted file mode 100644 index a1dbe05b231898663d9c146797d2dc7ff764fa2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326208 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 z

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�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 diff --git a/docs/secret_files/decoded_secret b/docs/secret_files/decoded_secret deleted file mode 100644 index be24cdbbf36c1d72ac7402cac27b2f7bffb75d73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47891 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

hz$S#!Zw~mOJEw z?#v5$*yavdWk*(nlJi`hSTWco{MD~|eKU3TQeP*i|Mj~Z4 zD;&)AO5TLPr-9MoIf9ZgT9g*Wq_m*~vi;1B!ogXRoNS`7Rf5L+Rf3Xnkxx0wfP*&o zE{mLqhg=*Yi`o+CgtqWx0aw8!wR8~1vz3=lk>5^AW-bJw!}dseRg5gUiwd)KweK~L zCB`n>Idg_f5sqFpUVbYdNFrGQL*LjpbAue_Z~YVE>5Mxe9V6%JYs#ihaM7Na_Ldth z#essbX&+)1q7s}Q&vzj5uzUzX+gV0Zju#c9OF5&W?0RwSWP9>_?LSfE*3}N!=V95q z)B5Ndwk3C{FmtMOw(>%8HVN-T%cg`AK%L0d7XbqL5s;Y|pdPWqJw*7V<_(kRgbyqX z=Ly=!X9A42;apkb;oUQBeZ0VGm+!O&Mk2g^XBUOjqlj+jmy7Ehmpjz8M}iOjDoz(# zcmt~@FjqT8pH(NA2F!k9X9Ai{@9x1v@OUql3%IQru2TLW1+wTIQ(_wK@j&YhrF{nZ zdkkq)0#OtKSyP5NCx(f63V3RmXp7FUM#VSEMK~sCUy@d*#rlLE9B5Bf5aK9#3{a%CwdGwzYyJ} z(x}|0L~8orH@pyssl9WEg#3ZLHQhWE?KyZ2SS&;}QIfRP*0ku@7gJ;Rqos)cq3f7& zk~uXiRv$d8vL1>0`sE8Kq2Ed63Z#7`5~?wqqLl7|_i@xFBb3o#R{I_IhUXAb5GBmk z@8tY31#v~m1~ru7<+M(z3iSP0H41EV1yM|J<4z+GUXc!|(-^7woyuY3o*BedO1g9V zD`}dK6#w7;(PKC95_`gK5)`?j$-?WQ{pfP)e^0qX48$-N=Y$=PCG7;BouzC=ATqNUB7$yK>oql9?sq%BoLXw~)7T&IP8yZ$Jl8-ec1k zSr8$#admWfaJM5yW0{N_ftV5K*noP-1$HrGwP}upUj`Ho(3`$1$v4NTM;jBOlJux6 z;kaIqa5W&&ZO6AFPIF1PQj2Sk(d=|<`+#BKj<--K+;d2`Kt#15RB~jO1tTE*cETAm z5&IQic@U&~nl{MjNaX}pMSw=mN^~=-%I&KPa*pK^$;5!c?{>nR)XjUBh1l82VA=#z zXyGPtJQL)Lx;!0Ro?wO$B%69t&^q09vi%2R^VH#iaw}{rXM&dxD{@;0yiKFRDDiiBDsD7!ztv>@xo1I`B;yT!tD<(+8VrTs*swav#=&wi5^^er5tXDN5;B@9t6v;}m?J7{s+wJ+*s2+k;j6j_WZk*l zFmv+OKjP^G1&*zh1W~modbLfP^9bM|_xQeB2j3H7Y^*GEp6g^|C=QKe#_n6qwGNvR z49oSn`p|IciGaxwrx40%?Y;ilDyc-|A@A_AwgE?{g^ID}y_ZvxwS7Q*Q!GI1Zy3Bb z%ZQ`3KL)llJZ2gt${o{#Q%f!1*(0yGp*MV|5VC2aN5KdX_lX#El0*q}qSzLb$H>4@ zAmr+afF_UqgjR;s|4?KmbhgaxlfeF@@3qV-Wg(M$fTeve95rUm)piswp(1x%ROGa; zZ)9gjcJD=;a`8@ZCPfzi?p-pLi^{i%FcKOxfD%1)Waqc+2b3)4?*{2hDkC{&9BTY# zVG)Zxp@~crRXPlkUoCJ<#v~#T>^-#a>CsO-B4v>oRmJ(u zjxiHVpoAc={7)n#V-TGH+yNY^9_$SU;`m>f<;fpERktw(m(-bbNcO{@%1g({Y$w!d z#X_=@MoLr|CFi81EyNv3}JwbPiSVDw|nVKvcqQP=vWHk%UcRfxar!-I^yrV6w*)aQAb_p^B1v0TDu|SU3L=?zR_mvxV5WevP4lb3AU^n|Bj+49R66B@l<#|Gk7*(K zIbNMm7MZCMq$)SUfA1DDceA`CCE>vr;zQ5R5Xfs%ZP7O9?O`&8Yb_>{njnwXp@P)$ zp80+{#EUV2)-M&&CWWC-h@llGyG4mC_@x?0by&Wq#t2M`CvKV`MecZnRZqzE{#a<_ zC8WSfaH)bPK_qyi;$fQDj26FV>P+rRjsB>D{x&mGULFV(1;JgRHjxyO*h^zrbNFF$ zY%i19l6aG``Ozh-7vZ79QLe1SC&Ec4nD;#XIj}fNzSmG|7?%%M0XO7Bf31WtmOhO1Y z-J?t9L7J9d#Q8lajP;g737cC63+2T(HPcI3u0UJfxN*)t4hbLoMA69_60A$s8{{=_ z{{p5yQkj)h!K6<&Nb)5l%#*}KCSVGhh%Qh;*`)h1DL^+JHtX_Z7fXss-ZC3LkG0W& zk=6X$b7Rsb={Aw@UFQr+hd}hn8BAT(pFgVTroSDj$X3$p!;eB?5aM5*9H-}M3b+x4 z5b-wrHj@@UXd~RbI3KZwJ{VtnNYS;`4u&J)jXe=q4w9n83t{8kL4S#NF?X>pUp7Bp zkE%XPmRAzU{xc!xC;2iAQki`K}QjR`osQhkQ?uE}sMz zZ@%?K`9wA!n!myv!3DbZx@{9gAg@V)E!A|8)*cnI${_WNOb=(opgX~HrvyYU$N>XX zPu0=i4aTTPfv7SB%fB}e*i6rflQREtNhh#gjUjzKxT?lF++hp8-!0F~4{6&9PGAnv zqovA-V_q#mXEQu*H)PTb{V*@KPL-6PHvDa((_y&+cM2vR zTfMB8#6&hw*r@InA%D4^+w77-;+6mEeufK;U?`3}$JdL!QZ0KqiCX{Z0l!}`gTBBg zkbyI9A3a6yGlGZ{3GPo4Yi{dtRHG?Ik;eMlHP4^DHB>Xd?I+s4+;ilzTtczUKF6Kq zL<|cNJpAH>qqBa4JuC*1-a=xL)EpnveO$z865vT$aF0wFC`8pvLWGa0e8x%S1a|!o z7NMt(Rwx$6hi=E264j@RVi-yYK4`?Kx5`w?2*%RmiiXP)e&4pxrAmp#4=Do;c%>E$ z3BrFi3-O_pB!?7Y+rM>YF+-$VnRSXss{1~t%1rln=KEJ7H4)<%J%T?ZcdQQp4o>M^te+JDI49yTwt*e zTvv>?v*VZHe3<1ehdRNSq&nsV#9I`ZsBEduGVGZXRg;Zz78rx?31~N~gis|G*AE~9iHMVkI-DTK8Cm-x|VX@Zz63qvhckoPD0cbOWS%4&R0(@!PeIQ`+nLKz#F>%HKR5 zjxZ`ogu$-OGRVBVhpVhU-N=cwHx~}+3%9Y$3|d;|;wM|maJIK09zKZtyB=XGip{?e zS3FSytt!!b{U!{rFgBCLO8E(v7nj&;w(84|DyT-tkaC{D3(ZeZ6b3YUdIJ~^V@`xM zEt(pgNxY3^>)|0sbrb#fuPwHTTb6a!DfmGkm4nb}=Q`cAF|^kR5;q(x8PmkWLWbK6 zq-;*vWQ)t9%3o6v?^462%IYjHwnh2#A7UoU*&f5hmX=0-l4H9$bByp-Gb_wJ0q^tRH6!bL-vn9OOE`uB1j zKq{uCC1Y-E~>EMe#} zNKs`?IfAlcC3lMioES+?hU??_8De%r+z z<)FPmN3D|$_K}Q07j~>&H^CFf&95>xJIcz4ai5}Mp6$o{gG3cF`izB=)+Do&JQ-vn zJ5|4t?>D2v$=(SF>6^WKAnR(J4HtBL=pJ)93Gpb%DB&#l0b^E0-HUIbkaTSX9YC%X z7y-UILB;#Mgvv0ROd)EFF-DQ8p=uNHRDB{^-r~2(t&jb3vR@4(LF7x zh?gYUBQgl_G?{aW&?3vNf>(`mt}|re|7gcAV=7^ywoMdh+}&Loch`-(OXKeDE*p1u zcW7wb-Jx-JZ`|E&Gf%#plg!MInLm@9%*lIYRaR2EQdPMtt8|uH@=Wrm_7%YUuo{}y zX+sfJu#*#AQ?Y)?xoWN1VNCIMR?;_|m7jWc_L-u2NU}$Q$yB_(&gK#{wOg7Q(6Mh% zij@#e%TdQO(Xo<<7|sDi|KLVTYQ+!p#)DPQ8bNB2!IyX^n>n$F3rH2d(#KKsI$T<3 z#l)9c!&WimSKq?uS@gNqwhDvqF$)aq4rt&{LB_CIN+d5?OH6ocr`iXzSK6g?Og$HM zY^A94$&^R%@w-A2A-qwlTF(SCWzS-)+RbPMb2c7yeC4q9Xd<9zEY2}qnV7@qW&C@; z)I`Yl^8j#;1@0oa;pyPF{GQHJr?au2IizKtLDo%uRCZqE57jBIUQJ!k1IpPNHvUF) zhiMLas4pc**N3Q-3!1WK$Z%#k2-fK4J(KM}L)gMx+MU~MrTn(g5A*cep08LHDyVJ$ z$0K#RIuXSTzX`j6%HqN6Wa{}m2R5uY#}ES}8wkoFpbZK>Rag(9SM82sKO1bI%Jv+8 zjF8@#9*=KlAVSpn_fblEuXl6&xxM4{piI90!+`{zzS!W*ZJ)Z>*v1ju9@1g@IwxDx z9jNQ+HvwIq!#CpgfcG$9_4>f0GKPs1XnIr;jgU9Pi$DlmI)+;kT;F`@Knuk5?6(f1 z(ZI!pd_{SJEib7PhHM(Sp1!YNFsXkW%a47y<+hQOqBAd~H#gPA7&kL?ah}tFZJ!y@ zRP!zZ^KRVFQib${R0^P7C7*nP{YkLtgD;Uh$N)pZuVlfb4b7sT9MXx74gi(akY!8e0w;LjsIkvpK(S*(8>G<)l78g!n0-1O$ z2m*?DlK88cC++oEIo8VgABk)nGBu7wN>j6^r$?%h^=xmCGo<@`Gc`sWBW;-=W%Hf_ zEpn}sn{m4vlMqYzqML~U?F>}taW~Hr38vI`tbPm|x=>$VNk<)& z7WA*}JCVne(S?Ql>uoqMd(nQa$coah(nn`Lw+17g0-7|x&Qg)tnP)u?c#{T<9#|)6 z$0Qp)w3Z0}^^i$y3)}K!4k(oIn=ik|%#v$y)+zflZ%nVer zY0?cafy_mS=YJn{RNor!mV^s04N|?OUF5i72l^#?4e8jLhNVNM*tWJAS#YKq1dolJ zdEs?^UI+GFxD$-EwAj=f#=#LDpu$Yr@K;$3S=8*#+GaAQQgzSi8|5q}z%@dvyVZT_ zN_o@N**$}WQGMVtt5M5jk4r;{UBxQIA4t7vZ_}eT%a_=)QWU=pPn|xOGo|{$xsN`} zu&n-ADslWS!EPtdiaq1a8f3TD(B{M0ZkE1blI@mzdwkf2ScmcB0*U#v6^dN8=9WF~ zL)d54`1aGNItySZYO}%p#F|Igs9~*}d%#S{Bzoq-Ey?t+)r6u&0Pv*EDboB&C3XY7 z?Frk6Xg(Pd{FWcEh}nkYCKo1@DeDbkPx0~Ybaj?-bRvRYtq!x6{YRb%2k2`nC?RnYO zE|ne51Yp#qk&u-PiSkDYcG*vFN7i)mq13cAp8O`77q6KIeVbp=18zbtTwW8y^y$Hh z+6Uy{e?$VTVZ5WjM6iw7td-BuF0}*im^1f{L;(o|?CgYve%*(ILSO0$1)LaWWGt~m zp^B|g9Tx?Q=D3E9Iqt--rz(PtYz@kSI_MM#*12a~Z@H_bv_0acvvR6(#egg;2SSM1 za!XXGOQRl4urWFqYUQF1v}A4lH{NyAKz53Vj6*FnuHE#4O}Jq3)qGh`QW)G7wfx_G6h)eq7P*kKv3{vWM9vcr;TROdq=GRBd{45-U$cGWQt5)7%<+P zeRX4{n8KZQp6zjeOxT&j!xgsSkhH)G5P^=~DLmFHwr2a$u6j57W-&gK@G5W)|Ca*8 zL8ffjgHi|kaGrzi9n*D#+aH~$ScMGYHoV)p2!jF3!jN!p3V$S!Cdj3X^6S4>`mfBj z?Kvd1w$q)&X*T&$MVXz#)}B(9WoiX#L6gQAtUVoCKVfSp_9G6QeGAKW$sm06a=v2x z0Ppu*(>;-y4n6e&HL;3iT6aO2mUFeJSBj>G^9n^>sJ zh?z*r2kqyFJkJMjmCDi@d4nZG2aBGp_}RyQ9I2-;s9=R$CQH35D|R)>Ah8Vu*DLIH zJ2~+e?9=Q%GC{JMRUE{L{0r1RiQop(FN8pIY$l9zub5slGrA_>Nk4ZqiK2K!NpP28 zX+mk3C(8lUB4Ne|c41|RKa-`-F{Jz2rVqN{yq{QmIvmiZBJJ2Myzd8h!QG|9P!fp8 zl7OkW{Z5Uxo!dd&2|s1SRHD7v#y;TFT$DOLT!|7k`LkVHnu-boQrjMnQWBwLKXQ8w zO)_i%y+}Rc$Q*|c=}_rVg!cNSoLCXV%iSzrW}6dJ6BU?x409rSXqg)5#AVS@5d9xE z?fGC}GM!VrGP?5;B10xIc|kn?SI1>fPR3glmnvfc)`Xn`6+FD4!l7tM{C;#;m7Y3V+{3SB@LK-t(sDrq*F`PX4V#*bXQ<2-hfn^{GW6Py^98XPH4 zREX$w7J(3ol0oKN7Dy{7i^q-_X00jQtVkZ3UN}N}MIBkY14`Rf@bxOG1Fx5@Txws~ zp3^ZZ(OHzos8r>Y^~%xiI@*)khicuzZJsj;vLyyk?^J53=DDhh@y~qD>scC#OpZP! zs?$yL#P2w^13eCVEGq#~8jQZxBbN496uPoMkH+61I~ujr#;xfk(dF^G{4D&q`-@7I z(qY2Gz-W!l|IT$sNa1)GXR7g;S3kLpChZzJ3n2+T2AX<$7P`K)Bz4-_I;UNo&(gwg zSyeCc4-iF_`+0OuIYcQU-_l-rq*~EiK7R&=#UtTQ=osd49s%Od=Fo%T)d6<^1b_ zL<+q*%E#roFcAhtK{yDx13FeNfcj1r$QytI4B8R4UtcPI!~?Vki&%*h9~cQ zs%**qFO04a{H%Pl%Q(|p*(eXweC>KhQ+VDErb}+YIqQ#YZ@LuX+c)-ESh1}|Q$;n? zt;L_`j<)XLEf&-GDS}~B0@_eySve4pXEFnlzXy}7!rR?Cz0293(-&dP*7tPRPg3m_ zXZc?`Fvg}l?Y95bDN@R~ocKJ!*236AWl zMjAGIu{bGy&bomP%_1ySP0|FlXz8=FO&Xzg=Jz@3N1ANlR+cT8`$jl~bS7>oqFlgSp>tY$Fu5rJfP_W1y zYDFOyHy`AkMIvNx8%Isn+(MUrT0^GY@L@y(w1UZ zD+Byw*FIR7Mwj}c3cg5|N2Fc2mP1FXlkZ{QR_A_5-vB94!_{=PVIEe)496#Gr15q?k{tn?8~K(!OmL-tICyaGoOCo$s&hb zw^#NVj2YO;aCrXK10!?FL#~1iVi-V@_8i~BoKq|lnu%x%!z(7VXye9Kyg=_-C!4Zs zhZL4kK%!K5iM0@Yi02pqa8EQ3&t2xeT~ABo8;=AVE18wU*gIs#8Et?q?{GMQW>KKCBQ)ZqNrmdt>PR_D9Rw}QmsQQon68apjL*j%8 zC-!pF0j*wRgSnYsN3Q(dC+H|@I}V+`&d!Dl=uO8{=Fq#PgAUgY(kIxmiM%td3zdt- zOWp&VEK)>C9hZ$u#w)Qa+;8w_+QK*<2FGR#SlDdbVA;IJGEqFQES2M3QutlAk$g4( zrpy#zngTZvygz1-B}}r2tEdLq8p?bc)4>E)3|Tmra>d70A`@U7<2@=jKYY+_;zykR zu+B%f)zjc_r~YWs;5?~_fJr%z-#NbCOBX)}o2lB&&RMQJ(@Px}m-9VHRQ(6wjAv%Z z5mGMcz{k$V+iE@)*S)!&eyK>p5y(uzuP(HanukzlG=@1Z*s%WfOpW0xMdV*Ek@~AO z#E&{zc5Y{!jAu0)j4@vx(c+3ODPdgM$pZ6{ZJ%sS;$)#~`c_??Sj5a+mMt^`ksHaP zRd&zAi}{uH)I!~`9Z!E&o`ddk1}UVVD^Rpz5PTtKko`DT@>ovzkFT=({A>G82a&m} zp^_2_AF=%2{dZi8oiqvJ3uEloLHZHKec% zgK=VN{ZdqxW6TAlB51Vv_ZTImpi!%NAxSzT3iO92Az8Mx6$SXfKEF7E|Yc5 zM=PaPhmppFFu^wp`U2qutv59-=G~-^(+Sl_shD4Xje0(13dbNf@V4tsrb`Ugw7FmW zS4q%?tlt{{n=()MMX1q*suf?K7wqEb&9l0@QRlUrnde`<+kq@&r+o*d<59iS_eZ@! zucbF=B7!(PPi8*aye?WLsHOvoKAlJu=wtcTs>hle2k$n;sMo+?B8DQ6`LX5GexQ6! zM1O!%Vr%Id^Q$_b4qD%r&l3XeLDJzaI%1~}X1UGm2+SwI_-x{<;&x&*^r>l(cYLA_ z4uvMUR%e$&8w6 z5p&|{X0g>y%$zucS)q){TCEzX-^9nis^1Q9LScZ`ynXi!d~IA`Mp|>bYr07f)|fRn z0k}06H^LV{tY`kPs%G?>U5^rX7bG3c@j0Jj{2E^ftFLRFJp%-t6!_)uHkZ2ZbMsl8_*oUf>N_fCwURDcM*^9gAm%q1Zx{7Q}O$j(R*;Y97@(T&s@+ac-p#E|Az)azNfOoubV1Qk zf}1Ts>wU}^)W0HcCdTM}$#&{B7S!4OEp?ITw9^h>gAhjjJrliRh<$EI=9iZ#aiKBz z)`ma-{u@FANG>qIxU`2+G}9uQ^%C0pp;|WA>skDiI7e=X(R-?dt3!gC|MuUube+$4 zN*2z#LZG<8+rKo=t$h0v>3lccesYJl(xZA=lqf$)A zZqY1>c+EsWD1dV2Ru<5kL9HrYUBa^ld%jO}%|be%D?sY*D#gNZxqs=*JoB9@7315Y zHMych$Z(9WLCW810nNxOa7(B=ANoNK@EP^YerG^zD^(`t11b^nUW&^TuEHmJh`uK{ z&t-VVj|7M|fKuU89873S{}nf+_G_H5eM5g1dXObDg5CgvqqpR1`b+4|ADjxGRJ30G ze-R19=rjxh?382K#x1v!Me=FFL*zk1nZo03ZdU#Yw>^DW6N`hIN^pi!aPFWmoSId* zPX;tftBCqOo!8pp#C|e}ZP4%fZ?U}{O`G|5v>=G@gxgyFuwNkktbRvPq+PW0MaEmL zBH>LXNaSu^t0c*yxMu{%&m!d$W`uK!#p6Hd zJ%hb25RKnRTiC`9y}*Na5R3=H=k07T<}jr8N7$U?F8YQ;U4IV%yVp(Bsw5&b8OYpx z99Y-_GDr;e4DI}y^tV!g%>~dqy#g^x9m8(pcF~)6ONGn6N#_!=YoER6e5(4tJrQQR zX_g+Sf>26=r)tq(uRiei;vmd>smGR9p?q8heUU_wx}f0ju`3ucbQbCSO2l4^@q&hi zMBnToYGx1&?a_74orCi8AOMLFc`pd>Z>9aznqklHMZza0MKcEw06R3dn~Pw@c5f7k8=O5qygwN)dr@tZ024xUqwxq0jxQ|Hz) z*bfWV%}ebyT0?Z&7Ajf+wgv<96sVIJ1H`O2M6=1Hb{hE_^h|^2x+4|=z(DC_LA?WL zmn_?E8Nao?Cfz%fm5Lk^5R_Knd_dpWy*=6$d)Pr4TnK#U8G{%r@Ux#4m^FD2j;nCH zuknRRObF@kL`4d1aLFzTiLhDy%UzJY_GlcN+rbu-T{tzYdsDJSpD=?sU!sMUzm;bT zU^iT9Zm}3eFSe+i6ji-$fLP}V2vsY;-bkwcQoANDMF!c{ z{?JbT&iWuj-?X2+7H(|wT}L!I8BKpG)-lxLij8Mt+C*6Dd01#9FTG`EwiO#YC^085 zwd!lVgo(T_U^q}#^S4~b7{mTDTAw^62xv!4au`VnwcL3-Fptcq4@mZzpUt?EY5|Qj zrb!D2blCA`IRx>qkOp*6#~xnxdde`bd--=@IzP8%oP0D63Z->Uh zom5IE75c=JZ9p)?A0R*RYGFK4JQ0dPks@YNJp5~sMz)1;Aq#={cCUTSim9cq(;fW| zX0pET_3I^k9aX&>9z;MW;Et_midu!kqQ&J2571gytK_g=UG8KlRF(v zda$qC4x%yp9@X@5JxqBVgC`?s|u@f39zEMXbp_oB$83!x-g$)nUjIYD(rS zJg5F$BLwGXk41Y(^*zpz3`-q>kFpAYV@u@zbIb{@p|C5}u2H z=vh_|N-$A#Y&OBnPu!u<%ga5CTFZQp7OB7sbmERDFg*e?uOS5z=7fxHXs$$fNJ;<^ zQt^u%!pD#b!c^~^3R3lXrGje@v>QnG1U}$tuWii`VUHaC2$q&sSX;j71|#b?R@}z| zQiemI-Qsb0kUYt}X3`Z`gnd&*QD)GWTZDaM{T21j2)0FB{=kwQt(dp-i-_jz57@O8 zk3!ckTD#FMh_g3Zd?;=Kg^zzzmR2~zZwxiUmmUk_((pM}Kj!+f3?|em{vhZ8q?Sj^ zsyg_=i6r)oX#`5Z3V1APB_(s*(Nna(WBZkQ6THzLncbaAn$97FI%JBBxTMoX0jf}Vjb3IsXOfovz4Rr|XLM@Pp2pZmh z2})1atq?D3$+RDkAhp@^9b+^1O-jJ&`Eil{4cW7@?*ciTjAJ|)O?Mb?{v_->O-vbu zrOh(%M=7wbMak3yG%g zLzle;8*h)3q&2ipR9)LZzpciDPyoDDoAyAR9MlGZ9O?Q!*-lrAik#p}k_cb%uZJi4 zhD}@)77|~Su53Oy-$*5qdD&@I?d6Grj=Bf|)aV;$D=Ta>XhbApC}7N8WLtqz>vs$rmsQo6}9&MBsrC!i-L+cVJN z2Xex~lL`azQXdRxH(4|{8?&5o#8yBFi9s@L|CV-Q?dKVe@SepPmH00983gJw6%r|e z0Ci8iU6+PSu?8q!9idU-9g}~PNuv-~kl7p@o4?d`?3$kn&vJXgLB3VahgZ`ci9A({ zy@&ZJ_C0#ZD3&*&m#r0RGoeoMOU4UJX3LKR%i^6=eY6x(}WjOf9HlB3Q*0*XsR;_!Cd?h1^pm7Ik zn79*BKiU`V!W^bZPC{tk{YPOfre-$%?C!-XBvc{sKNCGPKojIu=H3G&~ZO0rtPdrH5WWJ_|Yt>gh-y z)?2i9!FZ|-`z6N(Gbtqe%YDwZ``s0(vXMFvB>>a$Rd@!4LJwG&dDR+T(*ZV2FYnmh z*`ovGQBCtnl={c3rC1gE&}xQ&o@vAU#9tKgh**VC>)l=LE(V0aawhA1J7^I<@-|?d1(Yo;($$-%* z+TAdVCQCBQGJ{_Y``{1@4x~_JHw=e6Wc@MbWYvj%o#D>Z{)hl=q_Odba}#gHPl!F9 zBT_l#a_bA!40eOMBc9HnL0tCNH?fLWiZp|R5M(XWM!s)NBID3xKbZvPN}wLnaYPc6 zes9oH_}N`rf>Ea*##Jc9DcBnf*F+2? zJX<^_myQ<5-@Cu51!vI#vN4y> z?@UEw6Oaa0rOa@n5C#gcgGoq&3s8sE8q+hO zM)sGx>XVf+Yuys&pe;PpvT9IiX)lGZZui8osxIRqa`DKWljH64)$kcxV7&ioa4061 zSXZoRH0WgQRnVYddS^xCe93U&sVmo|69lX4pV9@Vl+@^0-?0^N1Fd?~($;P_)0&Pg zVC}M&rGR&ag8OHCnAL69V4cG2^hd9x1;zQW*5XM6=f?Jog*n(qcD~0!xxFzj2905$ zZ>-H9*^blVi3qu9`gOHRd(M$|vD}KuCK4{@h3mcXRQ4l66J0$ubArYwHWUWckb+(d z&nFnc}_TZqkLAZUO3U$I|gc`ZI*79Yn!{ey{?V>qZB%h-8nZ|6MJm! zpE0yK<1RhjY3lxLo7at6zidWb+L$rfx%ouQaKKGxWJ3Z`XyvQr3;&opTK`c~zkOZC zvFD7Kl``ABhT(pDJ^89bUBf)3e9&HhE~zz2$-Z>2B(>$0msE z`PTI*1M8{y04StvoZ6ds%N6#*o%<8+V5Ak|>*Xp493|t#U%7^Kb~D3C#Nh034i33? z_Jc~18A&$-IVHiOIdWRCJwS`}3Uj4okhgOu$oTyM6r+|u*$zq;PMh^O1hIJU{C2iM zE&>2@FYz-@z6gK!48HG!w&i<6^B#H=7B`IVQ``>uGYx*$Dw~mF@uSXv3yI{vB;_(; z{Y6+zaYVT9?)%rQ=ajh??*V_`4RXO}4F>6EeH!IBAeYXgn{$v= z@4@$CP8gKLXI%LJ-`?rOTt!6&57*DoPu8EiOnR83 zI-+Bf+W7vap-)YsW4jjjj`8&YWXo;eXM}Nzo~M(pos^-U%Qzf9O0S>H6Ls)K-)R{f zKBRn!%<)KL`a|)xhBj^mDkZPDDGI?401$=ni4wxFk6sCYcpv~nbga)`v;>J_>>CD- zu_Lh82^{SIFX7>4VdXG3w_r8n=H}wyGGTUdakO+Xwr8^R`G0H;mjB@9mXos9w~lRzls2KcxCjt(wsvI`H zYq`+GBDinzI!*i|&jM?Jwr-aE`N9a~S?_bG?pkoTvN`_f!RD>lm8I9FNIcZ9P4(J! z*cNt{r&W4SjqQ!dVHlt*QkUuX)Su%`Fv)Dl&!hF_I`N?`M=7w-+f9XT7awYR7BUUP zzmc<<(WUCFnRASD9OQ4aT`pq6D_)Lzunlw254#WG#DTy3h`J7^H|EwyTEGXC{EDE9{4TS58-Sh^MHwe?z)D;8ni5S}SNKtBt?D)b}Ed5 z$dXq9Af%wB!i)SF2zg)~M!6sx9sAQ<89%O6jZ8j%j1(*B2of&^iBdw^m|PkK4qV;dXYSBJ6qa66+%v>=AN&#}fE( zOEI$MtHj12$gCH=z})zF#%bekOmh4J8}7=d_pMhjzgNch8H~)ly4Rg|8_;}l3mu-3 zc-a#-P&xGUvZ+eMbbkAbs1}IqetL^ebUnYvMRdKm=j!%~O;p>L<#~P!uL>Kc{QtGv zj|dd{y4NYsSN)tD@H>F6k(bL$s>yiwHUB63CT(_p$6W@PW%?(4Z5o0gs+dry%*k(d z)b#E!0pyyQKE*enByoiL$#0tPm$8Gyn@_b=Ae=Yhc^*LV%`$PcXyuI}_1pH)Ino`3 zdISs=KnBiG(|r3MI!n6;;A%bYei`f@5`6fl^gR-RmZ#FM1g~jds(LjII*RbOYCZ^m zE|A1^(%}TC(ce@u_zu6!*#Oc%$eg*8({NJxDx!fdl^QD9S+#mzuuw{@@b?aMzyo*b z+MdIl+`FDv5dLlqPPNdU`7S|5st(I7F1yjBe8MlL%b9aiP{c1_Y}1F^bfM$@WruDN zCUcDA5AsWX_roQt72aycRNzSfX6P@MUMKqglNr4UGrtr;c4oiTGqRK3a+ec7lzzwi zG}o7^&qsPeocS^SD&o_QQ{U$MLo#Y_gn~Q?=aY7{3cn>2H$^Vm! zwe2JP346Rp(}cT*Q@@(qg=|`9BvalSxQ3^25XW5cS5E$b+t4Wv;lBbH&a_8c5 z*SKp}PhKy}*K4dChi`|vI~!LQ&^=-yJLfeYe{7FEQG9SNxA@l%w;O6aoouf@H}+7j z)1H?d9s=%r&TCZNZ{|F1o&|kvR-Uh)JW#x$dq_U-AV!fLfql(ImN*?hF_p$v6Uzm! zH73)gJ`O-eJY2`}3Zy;sNU0(Hr7*V-c+ry$!Y<@RQ!8cz3?z|K zMbFB<_+&>JxyU zUAg*XyiQ^fotSN)SZD9;y zz>nzNBjjl_wmR@Hgu)w$?OTzbYD^WorIj_hZD@OiVpep_4Mb>5jvnnR`?U4GobYZL zJgBx|yS9OMj>a)j@AjZA->fNT$jf*G-=X)3MqRszv25?ETHV%H*+Dyrf2#VV_v=atxB?hP({w*kkJ~&%SSh>X^C1JXUskVv$+-CQf-uURd5?OO)7rlI!Xs z>T9d27CYRw%Li=p9NKI&l?RAeGTs?U*98y9Q3k;3nrYCEuc8X?>;J8au?8WlN z-5A1C4jP2}tL0XZ-QP_cUZr``*}b>pXI4TcgY9d$TR-xcG!drOLtMz0UFu7EMgZsz z@grF4SfoF6`7)A%YG*87%tJeU`1zSqwl;y@PwqR4-0KSwcu#Jv$+uv7h}U7J#!&u6 z4lLovS-Uk?P;bnV zuH$}F3qrlIh`{hAL&WLykmJ#280UbFN*i9UPM1s#|0YjE&xUi}qhvz9POModC)! z9lj%0=RY5eI8RuWe$B;psnZ|)#P~085W_tjy%PN=*E;ySw01$Zo?qzFMA#rAH(%Sj zrhnO`1!7xLU-Ga>fsga;18?jJ17Dr@93pQ@gg%9Fp~k<;gxZCu z2%+?{LpX1nZ^?!uDgkPPZDc|wn{f943aWOtKkcP=AHp`zKPU|xnQdXft1xis2g}yT zPp5MgH^{2BTG_I<;u@N0dd3GK#q{dKwHlsmJdGy4Jcf%1wkn^C!zw~d168-cTv9LO zQ8z-gcugLz2qRI5_#{TofLGKv>$^?EbcK*;+~Q9m$-RrNslX~5v|*^v=B*V-m^ zKWHbkUvRW_!B*oTT1YLo8J(vF2wkYo+-BCk`V|ilu7c&>m7;L{Ws4R6L=u@eF#6)+ zFL5T&cE+zbQ132C^<3(dqcn)yY|7P6NAs}x-+@Zlz0i9WfBvzgJnR5&v7^+0MMC@&!RaJYSwFZVv#lIfDkjAx8n(s! z56aL8Or)}=JF~{NwjZfz=(`J!!iMS{w%YZ{bwm_P#!1v)y2$074rx7&*2e0(@*m-b z=_94pm&a^XL_XqFw7O;&RY9E?aOm??)z*-2jT-wCjkfq7HV!tJU`z&z)m&heNC=2| zvgdGV#bC`J%j#X~sP8t)0W;+PbV=*jPKTd!jHa|}@tAZwDgChO=hiVZ%Nchn zlSe#gcm5QnyBImAXUbVo%k?j@A*r0jnE~48*t$JWb_zpbdFhZ`+nNc^)JETYimg$& zK#U9SMhg7Yq2LYN*zM*l9?{qMZBn6^6-g0|%rWL<+j{CCJ?JI7=>r}#@uMSWQERn5X4 zt4{RZb-ps$g>n}Ihm@C*FR^|2B58|s28z5IXYvLu3`rvWLgKDk%U_7#c+Nwz-rtGU#KX8c%Lv9xnN02_9u6U?bhoMgb(?gp<*`w02X=!tH zSBxe3K4CJM5FuHeCSN`G^@Sa)S0f$Mz6u+5I~kF_F*VRKhy(vFp^SznnK(`IlQv6Q z1$ZBrt3F?PiK6O@?ywuIi*fWC&)8W)j~+qB++$>ce&`(Nc$5rrR*D%ZwJ?u+jpydk zq3IVU($d8Hr_}WRoR#+{^$@tx*SN4%OJ`++clY$VfaF4hx)%dwfgItO+W$%8Ix6x|P!3%aDZD-BLD+wKYCkC3gXsg5U0pAZ?{RTtttS zI>PSdoh8z1DE9aMfUSYXO=v4sli7;gfOsItRg<36lHtX@r$4V1sV;o*ezkJn}po zKC!xiiuKBR2K7f~Sia;D+`{iqMQyfpWT4e89WzL7C2bct^j9^1ElYN1PaO{1Hox#n zcK`BCFde>d>6NNa_OajnjaE?Alfb%HO z58>h8jKFKLz-w9)%Tsp{3Y*2JMRxktw*a*v@f&!st8y2Y=CN_&Ud>N|;oDHSZ@%fa zBucHXhp5vp4xuiFC|X5ueAF{`OU`VST=!|_V?#+ z^#G5)mN|%-Uc+-I`P7nK1LngWK!7W;pDVEd`Qc7MKtZA}$-6fl;3MFzN#I#&j*}RP z(kl5os_@#9dsYgRzIQA$tAy4z6#x>*px#}5_~*Fj!V6nKc>hxUJ^jg%aZw`RAmI!8VkC@+tV@ zTb=*r3bF}TV&Ol2?#wx|%_rMYn%rc$;C++M|1Tz`4uj%=<5&JCjlbkfn$LYc0g|MZ z?fNYH$)6O)GIt4RV5+h{ZkW(S>qF?2RCG|cn2@-nas%xg*ii|u6spQm)N089|3t|B zd2vYSF%eB$2RPh~k-=m@)}vB?p^}VZzwic0Sdl&-ejXSW5%r#}dI$}Hz4ee(rDu+( zX~I%dB>{@<=}yadS3@0w5w4@0piuhx#g1gD`&Z7Y&qvvGPtOm*&9bYVmM=kcf^pwR z7`lJbD_~Q6+XE&1(R(gZG8JOdA&dfWgI0Rw6dRCu)XfHKfg2U#zcD0F!B#N;{0V3f zsT+4Zkik}E!O9Q?X|WU|cRB0frZ^SO{FM4@Q}_T!ff=zQ5^**VDZVTAVZ2q_n~{!g zY!{cL9?dIm36l(oHAp~xBZKdjZ|p|2N#u~ZB#s$=Dx6j-D<%NVNluM1EU~+hFtSi9 z&X%8;G7*Z5FB3sAaO{*QveV)}y;ftbGlr5vrRhWttzCg>!OdY#cpR|jHPtVj2o3dI zLK;Iw4(|i*(24m*s%L%Ck?g#Y&%`_Y?o5+87gyGR9xJC`>lVPDVcf>Mw}GIvV;Y=@A$AW%O?&15?aWvZQ44JAnl|*(BAsx1Zh*^siNscZi9XypnV`9OF3|*sVE_O()cqpC&1O zNl`cKXAgJVSKjyB7dL^sj_g@Ht0xbI2l7DLp*K(Urtg5_0I{QYzh1ZOGZGW5zq3kv z@1MSwnYgnI`ww&^A3sL>7VnK}fdT-Ul81uXzVoah#guPsjFG!Dsyv~B-|j47zmhkB z#JAf4Ni)O+vtgM+-!rzg00R)f_}vz7_QZctJ_u+j>EVFPCNm48aZc*N_%mcX39-PN8F zR_82=DWImGUzgq{bi4M++$Z0EWC~^@EHgn}KfPVQ-*AfaxrbNrtWIJ$Ptx16PJyUT zgv_W_h?aDBZ-@lAiWk?0J;aVupL#T>k8ghdof1cRhRNT*fBM@83_Eo1 zG0(TbO8N_3lUTeTKeGV decoded_secret`. - - `-d` flag tells Linux to decode the content of secret using *base64* format - -## 3. Identify what the secret really is - -- Now that we've decoded the secret, we need to check the type of the decoded file, for this do `file decoded_secret` inside the terminal, from which we get: - -```console -decoded_secret: gzip compressed data, was "program", last modified: Sun Nov 3 01:09:28 2024, from Unix, original size modulo 2^32 94398 -``` - -- Behind the layed of *Base64 encoding* we can see that its just a compressed archive that uses `gzip` as the outer compression layer. We can see its content without extraction using `file -z decoded_secret`, that outputs the following: - -```console -decoded_secret: POSIX tar archive (GNU) (gzip compressed data, from Unix) -``` - -## 4. Extract the contents of decoded_secret - -- Now that we've identified that `decoded_secret` is a compressed archive, we can decompress it using `tar xvzf decoded_secret`. - - `tar`: Calls the `tar` command, which is used for creating, extracting, and managing tar archives. - - `x`: Extracts the contents of the archive. - - `v`: Displays the progress in the terminal (verbose mode), showing the names of files as they’re extracted. - - `z`: Specifies that the archive is compressed with gzip (a `.gz` file). - - `f`: Indicates that the following argument, `decoded_secret`, is the name of the file to operate on. -- After doing this, the terminal gives us the next output: - -```console -87014aef1d77646b/ -87014aef1d77646b/pendrive_image.bmp.gz -87014aef1d77646b/program.gz -``` - -- This means that the content of `decoded_secret` has been extracted to a folder called `87014aef1d77646b` with contents inside. These are two single compressed files that we can decompress with `gzip`, as follows: - - - `gzip -d 87014aef1d77646b/program.gz` - - `gzip -d 87014aef1d77646b/pendrive_image.bmp.gz` - - -## 5. Analyze the executable - -Before doing anything risky and compromise our system, we should check what the executable contains, for this we can do the following: - -- `strings decompresed_secret`: displays any readable strings within the binary, which can sometimes provide hints about its functionality -- `objdump -x decompressed_secret`: To display information about sections, headers, and other low-level details -- `ldd decompressed_secret`: To check the shared libraries the executable depends on -- (Not recommended) `gdb decompressed_secret`: If you want to debug or step through the program’s execution, you can load it into the GNU debugger. This isnt recommended yet because you should never execute something without knowing what it does. - -From all of these options, the one that takes our attention is `ldd decompressed_secret`, which gives us: - -```console -linux-vdso.so.1 (0x00007ffcec9ae000) -lib87014aef.so => not found -libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000074c6d0200000) -/lib64/ld-linux-x86-64.so.2 (0x000074c6d044b000) -``` - -- Now we can see that there are no unresolved dependencies except one called `lib87014aef.so`. We need to figure out what this library is and how we can obtain it. - -Here's where maybe we can use the hint written in the room where our team found the usb with the secret file... - -```plaintext -Si a %0.3pi sumas 0.10 y multiplicas por 100, la verdad se revelará. -``` - -For what I understand, this means that we should do (3.14+0.10)*100 = 324 - -28470 + (64 * 28) = 15504 -48184 + (64 * 35) = 50424 diff --git a/include/calloc.h b/include/calloc.h index 2e50e16..2fcc132 100644 --- a/include/calloc.h +++ b/include/calloc.h @@ -9,8 +9,8 @@ #pragma once // Prevents multiple inclusions of this header file during compilation. -#include "../include/malloc.h" ///< Includes memory allocation functionality for custom allocator. -#include "../include/memory.h" ///< Includes definitions for memory management structures and constants. +#include "malloc.h" ///< Includes memory allocation functionality for custom allocator. +#include "memory.h" ///< Includes definitions for memory management structures and constants. /** * @brief Allocates memory for an array of elements and initializes all bytes to zero. diff --git a/include/free.h b/include/free.h index 28189be..800cb9b 100644 --- a/include/free.h +++ b/include/free.h @@ -9,8 +9,8 @@ #pragma once // Prevents multiple inclusions of this header file during compilation. -#include "../include/mem_logging.h" ///< Provides functionality for logging memory operations. -#include "../include/memory.h" ///< Includes definitions for memory management structures and constants. +#include "mem_logging.h" ///< Provides functionality for logging memory operations. +#include "memory.h" ///< Includes definitions for memory management structures and constants. /** * @brief Merges a free memory block with adjacent free blocks. diff --git a/include/heap_test.h b/include/heap_test.h index c1494a3..f981d99 100644 --- a/include/heap_test.h +++ b/include/heap_test.h @@ -5,7 +5,7 @@ * This header file provides the prototypes for functions that test the memory */ -#include "../include/mem_metrics.h" // Include the header for memory metrics functionality. +#include "mem_metrics.h" // Include the header for memory metrics functionality. /** * @brief Test the memory usage function. diff --git a/include/malloc.h b/include/malloc.h index deea883..656d439 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -9,8 +9,8 @@ #pragma once // Prevents multiple inclusions of this header file during compilation. -#include "../include/mem_logging.h" ///< Includes functionality for logging memory operations. -#include "../include/memory.h" ///< Includes custom memory management definitions. +#include "mem_logging.h" ///< Includes functionality for logging memory operations. +#include "memory.h" ///< Includes custom memory management definitions. /** * @brief Finds a free memory block that can fit the requested size. diff --git a/include/mem_metrics.h b/include/mem_metrics.h index e84ffaf..dd02fe8 100644 --- a/include/mem_metrics.h +++ b/include/mem_metrics.h @@ -10,12 +10,12 @@ #pragma once // Prevents multiple inclusions of this header file during compilation. -#include "../include/calloc.h" ///< Includes functionality for zero-initialized memory allocation. -#include "../include/free.h" ///< Includes functionality for freeing memory blocks. -#include "../include/malloc.h" ///< Includes functionality for memory allocation. -#include "../include/memory.h" ///< Includes core memory management structures and definitions. -#include "../include/realloc.h" ///< Includes functionality for memory reallocation. -#include ///< Provides standard library functions like `exit`. +#include "calloc.h" ///< Includes functionality for zero-initialized memory allocation. +#include "free.h" ///< Includes functionality for freeing memory blocks. +#include "malloc.h" ///< Includes functionality for memory allocation. +#include "memory.h" ///< Includes core memory management structures and definitions. +#include "realloc.h" ///< Includes functionality for memory reallocation. +#include ///< Provides standard library functions like `exit`. /** * @def ALLOCATION_SIZE_MAX diff --git a/include/memory_test.h b/include/memory_test.h index 460a952..b066810 100644 --- a/include/memory_test.h +++ b/include/memory_test.h @@ -5,9 +5,9 @@ * This header file provides the prototypes for functions that test the memory */ -#include "../include/mem_metrics.h" // Include the header for memory metrics functionality. +#include "mem_metrics.h" // Include the header for memory metrics functionality. /** * @brief Test the memory usage function. */ -void test_memory_usage(void); \ No newline at end of file +void test_memory_usage(void); diff --git a/include/realloc.h b/include/realloc.h index a09793d..194008d 100644 --- a/include/realloc.h +++ b/include/realloc.h @@ -9,9 +9,9 @@ #pragma once // Prevents multiple inclusions of this header file during compilation. -#include "../include/free.h" ///< Includes functionality for freeing memory blocks. -#include "../include/malloc.h" ///< Includes functionality for memory allocation. -#include "../include/memory.h" ///< Includes definitions for memory structures and constants. +#include "free.h" ///< Includes functionality for freeing memory blocks. +#include "malloc.h" ///< Includes functionality for memory allocation. +#include "memory.h" ///< Includes definitions for memory structures and constants. /** * @brief Copies the contents of a source memory block to a destination block. diff --git a/include/test_mem.h b/include/test_mem.h index ff3ca9e..2337d00 100644 --- a/include/test_mem.h +++ b/include/test_mem.h @@ -3,10 +3,10 @@ #include -#include "../include/calloc.h" -#include "../include/free.h" -#include "../include/malloc.h" -#include "../include/realloc.h" +#include "calloc.h" +#include "free.h" +#include "malloc.h" +#include "realloc.h" void setUp(void); @@ -28,4 +28,4 @@ void test_valid_addr_validates_pointer(void); void test_extend_heap_adds_memory(void); -#endif // TEST_COMMANDS_H \ No newline at end of file +#endif // TEST_COMMANDS_H diff --git a/src/calloc.c b/src/calloc.c index f39634b..ee90735 100644 --- a/src/calloc.c +++ b/src/calloc.c @@ -1,4 +1,4 @@ -#include "../include/calloc.h" +#include "calloc.h" extern pthread_mutex_t memory_mutex; // Mutex for thread-safe memory operations. unsigned long calloc_ctr = 0; // Counter to track the number of calloc operations performed. diff --git a/src/free.c b/src/free.c index e2a4340..40af4f1 100644 --- a/src/free.c +++ b/src/free.c @@ -1,4 +1,4 @@ -#include "../include/free.h" // Include header for free-related functions and definitions. +#include "free.h" // Include header for free-related functions and definitions. extern void* base; // Pointer to the start of the heap. extern pthread_mutex_t memory_mutex; // Mutex for thread-safe memory operations. diff --git a/src/main.c b/src/main.c index 8a1e4bf..ad46931 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ -#include "../include/heap_test.h" // Include the header for heap test functionality. -#include "../include/memory_test.h" // Include the header for memory test functionality. +#include "heap_test.h" // Include the header for heap test functionality. +#include "memory_test.h" // Include the header for memory test functionality. int main(void) { diff --git a/src/malloc.c b/src/malloc.c index 96e493f..38d36ec 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -1,4 +1,4 @@ -#include "../include/malloc.h" // Include the header file for memory allocation functions. +#include "malloc.h" // Include the header file for memory allocation functions. extern void* base; // Global pointer to the beginning of the heap. extern int method; // Global variable indicating the memory allocation strategy. diff --git a/src/mem_metrics.c b/src/mem_metrics.c index 4e6f4f3..9e59360 100644 --- a/src/mem_metrics.c +++ b/src/mem_metrics.c @@ -1,4 +1,4 @@ -#include "../include/mem_metrics.h" // Include the header for memory metrics functionality. +#include "mem_metrics.h" // Include the header for memory metrics functionality. // External variables from memory.c for accessing heap state and memory statistics. extern void* base; // Pointer to the start of the heap. @@ -205,4 +205,4 @@ void clear_memory(void) clear_logs(); // Clear the memory operation logs. printf("Cleared Heap and Logs\n"); -} \ No newline at end of file +} diff --git a/src/memory.c b/src/memory.c index bec642a..7e02ef3 100644 --- a/src/memory.c +++ b/src/memory.c @@ -1,4 +1,4 @@ -#include "../include/memory.h" // Includes the custom memory management library header. +#include "memory.h" // Includes the custom memory management library header. extern t_log_entry* log_head; // External variable pointing to the head of the memory operation log list. diff --git a/src/realloc.c b/src/realloc.c index f875553..54c4d1a 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -1,4 +1,4 @@ -#include "../include/realloc.h" // Include header file for realloc-related functions and definitions. +#include "realloc.h" // Include header file for realloc-related functions and definitions. extern pthread_mutex_t memory_mutex; // Mutex for thread-safe memory operations. unsigned long realloc_ctr = 0; // Counter to track the number of realloc operations performed. diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 02248ff..4834843 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,4 +40,3 @@ add_test(NAME imemTests COMMAND tests) # Add coverage flags unconditionally for the tests binary set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fprofile-arcs -ftest-coverage --coverage") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov --coverage") \ No newline at end of file diff --git a/tests/heap_test.c b/tests/heap_test.c index f11b529..81f5103 100644 --- a/tests/heap_test.c +++ b/tests/heap_test.c @@ -22,4 +22,4 @@ void test_check_heap(void) check_heap(); memory_usage(); my_free(block5, TRUE); -} \ No newline at end of file +} diff --git a/tests/memory_test.c b/tests/memory_test.c index 5ff2e41..845efe4 100644 --- a/tests/memory_test.c +++ b/tests/memory_test.c @@ -22,4 +22,4 @@ void test_memory_usage(void) printf("%s\nFreing 128 bytes block at %p%s\n", GREEN, block7, RESET); my_free(block7, TRUE); // Free without merging memory_usage(); -} \ No newline at end of file +}