From e0e6bad67e41feba0faa9aa2bfa19ed44099b8dc Mon Sep 17 00:00:00 2001 From: cannoli-fruit Date: Sun, 2 Aug 2026 07:34:05 -0400 Subject: [PATCH] revolutionize c or whatever --- README.md | 2 ++ examples/a.out | Bin 0 -> 28344 bytes examples/ll.c | 28 +++++++++++++++++++++ memsafe.h | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 README.md create mode 100755 examples/a.out create mode 100644 examples/ll.c create mode 100644 memsafe.h diff --git a/README.md b/README.md new file mode 100644 index 0000000..4795e2a --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Memory safe C +don't use this diff --git a/examples/a.out b/examples/a.out new file mode 100755 index 0000000000000000000000000000000000000000..abfbea791d688e457ad31065b859af44d1fb9760 GIT binary patch literal 28344 zcmeHwdw5&LnfII{9b2|yTefp25II1?&DS`I0}04+oJim}ZsL?np^7ZYwumixB{?Lt zo2CtEF(E)o>Cy|37TVH2?YG^QZGm>d0ZKx*+YPkavb~YgQk-%rESHA1kni`KGb78g zlu(}U`Tp3)^Z3lnd!2XQxgMQ!#vf_#SYsN7(7_ZJ3PPSrpG4WQ5G_#&DqM>w7e292 zoGFTcapLkx3R63$Q;)+Y=+ve7h^AbZqIWrblA_aj5)wkE+Crw38xKB}wNp>24eC^Q zY?yKuvkDd-A0fa#nS4PRrc=$ADbFj}gz(z@IvrK^>oi-AzS&=E%k5uj%jwjsDsjE8 zjIzrFJLL{3xkE}$ryepO=v4cYYItovom8g238@W@w^Od%ekHeG$?4Q9wV>K6)#h$| zE**I<<#j2!%W7r#ojCdpBWcm^)jO(o8a zSl5&EVqDX4u?}UpN^n)-VxWE1xTX=v6I6GUV>l04_AQN9RgmMN0?2Y)#IbDFhko0s zE2i+pRr^?c!QcSDwl$k+umHZc0Dg7>{7X=pPyg-${I?ds(~tS|e5nAwseqn;D8L^m zfPb(6p2Iz#J(~*PM+)HYD1h%MU_a2piz_!A0HRWyB1T(%lBD~m2nPEG6Y*dw9ZIHy zL4c`HJeH1K8%+jd@pLp94-Etdql1Hqtip-A}t~r4Gjz=!a1~5I+2XFh`|Z8#85hhYDA*xXgJNrn{$vfCm0vK$tay5D=-{SM*CtZYVR9J^n?adnzA*TOwpFX zSZXko4)+Jc{ZUx6wM8@J6--4@?cPvq09=@J!m33EL$SC3%rZIav=9h0w^Xd{2&`%g zHq|X|&SabFmP~AUQ|K9FB3?rVW{7X0)988fzI~s@G~p26SGeK1F-%vcI0%?QuXhBq z=d7nM@{ug(7|wS(9Ld6GPc*t8at-JFlnFkc%uiVr&$U5^%d+sgZAjak zh3DF$Lw^=N-@K#wrqU@7OnG3+15+OO-|2zZDo*>0f7gpH{~qhfdLjI~N7Lr|#)MJ*n; zo(IOb>d{H%k^hAo$cR?=_(%Tn*w|O!Iez?sBVM0)a4EDr!c4;NoJzpVUT(_NCG3j3LJRR(R%Q@GuRlfA~5en9*SOL-i7>Y z2$*)RMj_BUyy)Rk7IOiM8L?Iqd(a9X;aEp@DUD%v&y0E!_gD=~mOqkg1?mjuvwEc6 zFRZuEBU(1QX)At#m_63(OwfHttUpRb*-vCLnZ`p%DTsK;A+kq91iaSSZ4qZ3O0rB&(^Px&f9E2izLy7Oc49X7f<}@nj z^DlsC7xt#C@9uuPFtVL+gfFv;kbHY?lTssH80)rzcW36UZ%H#LyyrHW#7?UeNJDqo zhJN(lNPOOb<>{vNH0+?Pja{*_x6fhytaq5~8e^-zCNVQ!WRl&ua`wtMc6=4LJ$~I2 z6?Yz}`SHk~ADB&t?K*1s_coXMM_$dHKw2wq8{PGXVqeRTEABY3y5>O1TbPH+9+Fb< z{maK#DGc&$uE5CF(ZI-#L!8F~BWn&H+}#c9Y4!_i0(;hs?zxSyKm3&cz_VBm4xeaX z&yv1EeGZO&7$xkIs*F7{@rMsX-64*Xd#RU9mx4*IEF+HumOqoO!#FNqdZgWd{~Ia< zM(m-hhbqzjJ#E__hjp_9YFyJ+&A>do`O(KXg?ym(%GRq|KiC?)O3pA3aj}1R)aMgp zbtu?IjwgXWX`JewxvRqT;o+Psiq57#X<$);=OnG3+15+ND^1%Nq5AgT=6NS3E zdOXcZg?giP{U_opL~HOaT0d+5~ufBTxcn>#yn%;G@<0j``>&Bv8 z#g27OvPxa7^D}Q8KhEdjGZ`7r{bCpUoc3&0d7_>eO8Lg9vKdoQ$1O7xD>`y4eR@qh9Vp0{RTse zqH{ma@Do)Z{jL=6R~Y0ygq@W!o(ISSEDc&hj5)#&1@z z_QPhyr{C?;<>N7>tWSgD$8Cj#RdE8hcoKFhx>EE1Ez$3f=N7nB^@lYoeZNY3Rk~HB zA6Mz8Rr+O>en+K`tMq3o{ew#1RB4gwr@7^y4Cd2l2Hx7U4K+-^vyG1^x^532a17oW zpG=!oDgi|MeKuahM_O%Ix1**mFChO-CGTBjb836^c+&D61>{9e*sSbtQuxg(-S95u z*S58t?>!55hG%;lm)14bHF}#GnwB;!ZCWBGk{UE=apO|&SU7I*d7+{-$coJM<`>$S%$SrzH%@JntB$o*L)#)egy2uUJn_r6Z#F zboXg~%nZgJ_k$R4^SfgaVLWV<1;A9Y3{lna;wJIcnIx7FIpY}KQ8z}7iq!yk>+YR{ z0cISq5u)a6m`04pl!9&Gss17{KQJnG0}u-?CHJj!kD|Af+zv!l3i`h>{nv!QN_co_ zv-sM)cL+ZK*!ffiYQAvVJ;=M9SHVZkz6wt3F^JDLUEOGr_rcyPX>%=b4q7a%-ywUN z>AD8_A&|CevM6qW-uY(HJ+Q0^OgDk@8BMi?CClmNw0}aIECb8GfXp{{jTPhiuY?VY zOxG;5?O~99nbAN2Q5*uf-Ynu9H7w*ckl)fQ!sYFyHGQG6FD%S_ip zXh7EETu>TGWyzxWTWF^9&1r3@!H?kl04VDxQdgQqUqG2>fxQouK~m`zQG6JY&vcyz zfSPxMvL_>JwL){N>G~qfz6;o|X*uQ1J7Crt)Ac#@u!lf;B8R*c#&nvlB9MO#((g1` z6!*ZG^``3$P<{ZWzmkG7RDEWlIp1ea^MT6x%mHQoL~6HL#I>6BSq92VQe}N+M&l82 zsW~kG!zsH7ln-QNCG`rks038Xra;-Ak+m*Gt9{UPIbqFSU~ktHM=M=*=ARLnQM2-w zkp2c}_h;y`Z&lm|dy{4n6^n{Dp(|y&NO4ts7ZPb3@XYEKPr|T;gYX^ej={puBc?xt zXt((su!{%_!zx4m6Q-jLz&vCZ;4;=w`B|ix*PC)%VzdBg(=^pE(*WOSI<7~LxD;8A zJzI1(MQ<|S24M)f4{3tq5-Oha0;+Jc*$2g4fIkT;n^=n498&%k^JdiUo1lCzL*0~- z-)DXX?ML~iK>hVZ4pn!YiuFc3<&8Wp4rfU}%J^*a5ra0Iyg!OwwcbcxtP~f#7 zeS8A>YGbDuw3=My9c}W(UXhoe;YRmvK8wlY}LXw~_xYkOwuvL0cRF zaM&zM9Tz~?FF^j&WEREuTg(OLyFNt+piVAa#vQVZ23U2W>kRnm6d)IBf0BX&uSC(#y>7btFV1HP+$4dwojV}nyjcRTI{99U^A-vGk8>6ZaPE`9 zYtA%H_@o5haQ++Ycit+2H=R4k_9+Sc+4&}X>%2_@e{+7D+CD9TW6oZ({gVXVa-K)Z z?Gkv$`3dw8=Vv7Fb*B&BbADC=-*f&9o^gIo0zY*Ah6+9}fqyT57Tw-?r*sD2Y%AyD z>%2?Cd_zXKK8!m4$asmK_z&p`;Yy&;|1|iOUeRHN`W$pVWmFUO6NTE0R{k$zAyGfm zT&V8T#&V+mTcNhV9lta-67?&IDtcK_mZJi{F?vaPMxovS@LOX$QO_z=4I29Q#*IWh zr%=BD>UrZXqQ(^JN|f?P<6A_%piqa5Tnwc71pH$DjM48Hy~5}nM&)p-c^aZp>MP}1 zQN~;uiz?+FsEoK$PCjK^PRf{TbTKaFR8-3O*8DF^|J%MO(QAOop=xy$WSBj=zcrQvTap*hjB^RSQ*8GKH9#dhsZbn*B zha2Wo9cyPg6T+>pE3z7iEFssNkgxmgz>Z`f^M*dy2DGVI1M?8Y#RqIb|VhG~`I z^Pft)?F^T73<^MFtCntu7ROGh%6g4>y8+$hB|iYN_#jagGB2EAG`-oJQw?a<(igwmK}w}3+w&ji7AO()(Z9PCd;|pQcO2_ zt9+7IKH){q`23GxR{1v3GKY<2?z;>n7|Uggn)^0e=mQtJC}{5M7qfm&MN5iwr#(li zqLNbdZYWtYL$S`j5u9^@L{ocxHrt$?NQs-vrg4c<3Sk>50@clPPyoJLtcJye(YDRP zQGUMr0{3!vpnAoed2Up$&bVj}kTvE7)^c~eys5@mF(*=OfV=2?aej>fbWP=KfWs09yvXV8^X?N93JaVRKvexJcN;j&joiN>m z_3oP4w)&c4R$xXBThRdAIa68=ZOU5{d@!pX1+l8Lb^XXy<4{h$!BBpkGl4vdmP=1& z80OklmEN(ddWsfN9;4wja$cozW_h*y7Q?;ID00j{WxfYL%ALBL6_%}x+g{l)5}?3* z=?pj9nwENVD(Pk=Yrw-^qIec4P`U4PC8GNf){!%EP?*2ZR0c~e<1M_f0jdMl?0Adj zp@X!zn~*(gB6E{_#hkG6)!DPro6pIyvJCs*YPOi$t|cpW9(<-MZM&>Cqg3`Wdd%+D zb#+4ac5e+BAXKbafLw(7E2ml{{0_tIlc{MB?ZMurq;|7y;zy$O4lWEVi?!Wi%S zraclJnQ`IF7+zCiTW&#NrYcleG_eJWW%rQf+X60W0s5qD6H1i0jY^{m?NDkDLwB_y zySE$!bXR5wI@v|b7tPT^%NwUnE$dYaIY!=JOkOj^$jDVcm z=GLJ1)x$t>87>PGXBXSaF#cLz#)Jz4E@b9A>XGNP|9M=dG2g6kokr^81dlL!jZrDt z=Q5JiX5`ESBI>>v40&}sxm)=VE-tS3;gb4`_yd(VfXI-!e<$Imh#XvC9M)`6V(Qhx z(QH_zFrCKtta+{c^-qndqI*~hGzX{*dUtIBdy z=UE*5gpbj$s;W!`C3U2c^FQ)ZrDZMn?W zYHJ?Yji;>XNX)cV{FY^WgP0=o0fYKX^CBh=YIVB2R!PzKEaP%mlz>H!O7jxKwZe6= zIUi0AUeVdun03NJV@p6Cv9NA1H1vL)T#!fx!tHI%?So=VE57*GWPda?v@X;a!%+zD zTE$izBoOI^l1Va6&06nxv7L!FS$IcJLwozO)zMTsnb_XG)iz@zk5kx`inj7Fg^l6F zP}DXC8^%yLmfkKTLw7P1j*8ZyA^hOAMs&BX4YqCC*u8$8*r1MakX4eb>tc}&(a5!l zxKgxb9gaERuf>z9*D$WSsbOt2-5K4M4#Z*IaF_=^bcNxn;h}U=Y}pV^$CA;A3-BW*MyULYe^3df`~&>>mB#%ig14@d7<>h zrp`+`*I(NC_p5JCT@xB=->|VUD7LJQ_J)QB(raP^sNJ@WIHlw7*Vl;pSYJFE@xmf~l7>8OBrW^h&~U0h*n@s*m$z1)$uU8d zEC#(e*_DW;(DfqgZocDfPGVz><)xhpJqAGMPxOi>6YczUZpq z-d>C#w%d-$z2$^%UCsg3+R?GTtsS+8t@a@;Vkj}Bs(oo98KLSxd{r!+63NgtIQN97 zsfaCYA)G4v|CT^}D@KMriv(5++@FR7{er<~PsnQMggE=G zPe!6i)qis4<&zq;OwEe4h!U5QS4bP0R&6cBA z&fb_MaoSFPn+q>T>pA;Oni%s=q|J00nkv&>gqx17d4VSkgullvsL!Gw8VPC6J6k-QUpUZqRzT}*oyM%M`)(1Z!4 zZ8(|4gLiC2)OLwhtig8?YLo?2;o(Sv8x+ibsc3g%{YE+WW1{Jd;;<-TZ#~{a)3)fL zm8YFfIsvull_QUE_IhqNvf941V+`rdgIwgh`*BE@JzdJKrFM?u(%8TN*4j0pRC-hV znpphATRZF-x-J>K8jUpEldqMs?P+Q*G>Ky@%8@gv$xiBvW^Nqv_~GP&YPJgow_!Q8 z2dv1qO%<8#3%7)mEX=N8W5f8~xn1q2Pbi?gNB7~&p2_?D0>eAB5vxc3k#@3aRj>II z2WWOBmZ`a`y(>J(4;{R1=bqcRjPJCZ;Kdbh?O>`umEM9hJsgj&?2BTX7z+aoCBywI z?XwrXwSC^&^-bPdym7L!FFq{w*7kM<+Pt;B@kDLUaBLtQi`zhSn_3W4Hk?eSW5^{2 zW9iyn-XzoxCFHsZ=;@9LjNb{`_t)}%@H}rXP791)Xzwf2B92>H5k|j}E*L)t zP>!0W#U~##CmSmb=&R^H@`hn$C=$WWg@+YR{t&LCqcahSPW%*3ZgevzG0Nizal4%o z{18ta!I=3bFV8o00~027WNl*sv{7KZxSJh&;*AJ(X^}J~vpmU@f^Eu9*x$9%`@W3$oh?LTR z($0FNF;Vu~8EBJLV2?)T!~wq@;v2YE`C`F@fSvUmx0e`|92(-^vpS%tUtq}xbpEI0^Yz$zxtUQp18~K8^p9nzgMo`r+!J{ z_50`a3qv7){tYxkc*Ok+e8^1<`Rw5@&G_YA=<}bo1fOOacq=>iz2$`xKS${Ix;6g_ z;AvBC;2V_r@O&dFAD&N(J$Rd)=W%5RzG|6|f49U>oAlK50Q7sIXQywXo?F0Q$&;4V zGf%wDAj4fsPwsQ%dn8^lWhD<%k2zOdpQHb7l*@B__2Y9qCy;^XvF5Y?x5S%eLVpLK zi+H{OKi@2@!fSgzH7@YPOon;HYvHW)2NFLmbDsP{MO$8gzq0`T_55f&S&Tz=s9bZ z&sLz~C#9YVC<(k&0AGS9;`!=(D)7{wTd%W$&v%Y9-zv?g=c)pDzK!LbY^D(5WV*2~ z!L3M7EXcR^fJmjWeZ@EO__a%)d7K^$hOxF|9l?!tLLGq|jNliKR4_EWO<<+NDwB>z z>KgKM1hHntf+7A28N}Ulayw2}#(q2)86F(uY0_B`*1cGI0;^mnv-bqSD>|0xeV_cC zKhO4tmZXMzf~$iK4Gqhe2Nf7lAP<6Gv!Qied$7H8wLA$M8?a!zUm^XgH;CZs%R5`w z1=>V#ZO8gmtsTMjYu0RR?+$jiuIgy#+1b)Ab%eD%raJ2&>D8!m~ zFt8pcK}TY7o@O1vq1QMLTFJqsgQw9nO+ESa68PahP`)1jr`LC5Nxea3W# z2Zu=qBLn#5m|KE$l*dq~W8vUXtnl&Q>TK{ymCqb_UHGi*LdSs14SX=zy{;|O8i`0! z`nN96E;F+OMQ6m%kM`Nw0{sdos;$si8^d*>-s~feo+_M9tXRf z;(?f?sG=qSLD0~=AquG6&;WMf(&u$)-i_38aDtYQeY7sxuZClP1hN`}RdSGux;Sov zWpTJC!tb7VAZVjnR|Rl8-6!hQ(6q;}U6Rg^PXp5O&>$Xi*7e~wfl-|_%r*k97j@h~ zW3~Wmv}d>vIzsV2%s~o_#d{MvAL{AB5B(a#KW~WYJUpngM58^E`6j}@56AE4xRzj= zm!ZqyQ>hK>@8@jD=GA$oi*Rx6)$&71ehBk4!+sfa4`>IyFVyhqK);D^(zLwC>645e z#c+l#Hc4KgMJ+OX<3P*n@AUX8KLcOcW}uDC>hkq|WC?IIRm(RN`2gWHl_HsBzVox8 z$@O0e0>81-^7^|vrz%LV$I6^cIhy}s$n%>$4eRgr_)a!MgPlyWU!le2$WXVI*WU?l zR`Qz_qb@(U{$VA*O7V@ld@?tx7`v4JD9^WUa^(ksBa3p^_`V2l)iLPrGi_+RA85EA znQVEl$0tc%CI5|4KItX5i znh>-fHS#0KP+t3A@27>==D3W+tl-VcGi%>xjmzu%kIQOo#*Q5R-12V&J-hsSYkX4T zUL`+0r+nRhTJ2rPyq?wnMi=-bX>@^1#C3L(iF4(@0t#KM>%aMQpXA-lfsNpk@pzOg z{~$=&^7?*xzmoTki^^PX{SN`lHgzaI{Z_O7e>u73X;`N}haB#LGV=Pn;(IxA!^7{W-Jk1xZ z5Hz0+jgMcg=WP(O<@NpSn3BI<3#wGh>9h#K+4A~+V`qac;3F|Bc(d}%P6M5~wEg*~qROnwHb(vsL*T*6AiC z-^tFE6>{a56p+8$XA7OH8(!(im2WE`|6^5gd=N4rLA zuP7jY-(|MMA2g# XE?47Ny&M)v`j4>9adnPB4k-RF)6~H& literal 0 HcmV?d00001 diff --git a/examples/ll.c b/examples/ll.c new file mode 100644 index 0000000..617ea0e --- /dev/null +++ b/examples/ll.c @@ -0,0 +1,28 @@ +#include +#include +#define MEMSAFE_PLEASE +#include "memsafe.h" + +typedef struct LLNode { + int dat; + struct LLNode *next; +} LLNode; + +int main(void) { +memsafe_pushhist; + LLNode *root = safemalloc(sizeof(LLNode)); + root->dat = 0; + + LLNode *curr = root; + + for (int i = 1; i < 1000; ++i) { + LLNode *next = safemalloc(sizeof(LLNode)); + curr->next = next; + next->dat = i; + curr = next; + } + + root = NULL; +memsafe_pophist; + return 0; +} \ No newline at end of file diff --git a/memsafe.h b/memsafe.h new file mode 100644 index 0000000..706aacb --- /dev/null +++ b/memsafe.h @@ -0,0 +1,66 @@ +#include +#include +#include +// 14 LOC in i realized this is just shitty raii... +// Still finishing it we ball + +#ifndef MEMSAFE_ONCE +#define MEMSAFE_ONCE +void safefree(void *x); +void *safemalloc(size_t x); +#endif + +#ifdef MEMSAFE_PLEASE +typedef struct { + void **ptrs; + size_t cnt; + size_t cap; +} memsafe_allocation; + +struct { + memsafe_allocation *allocs; + size_t cnt; + size_t cap; +} memsafe_allocstack = {0}; +#define memsafe_pushhist do {\ + if (memsafe_allocstack.cap == 0) { \ + memsafe_allocstack.allocs = malloc(8*sizeof(memsafe_allocation)); \ + memsafe_allocstack.cap = 8; \ + memsafe_allocstack.cnt = 0; \ + } \ + if (memsafe_allocstack.cnt >= memsafe_allocstack.cap) { \ + memsafe_allocstack.allocs = realloc(memsafe_allocstack.allocs, \ + 2*memsafe_allocstack.cap*sizeof(memsafe_allocation)); \ + memsafe_allocstack.cap *= 2; \ + } \ + memsafe_allocstack.allocs[memsafe_allocstack.cnt++] = \ + (memsafe_allocation) { \ + .ptrs = malloc(64*sizeof(void*)), \ + .cnt = 0, \ + .cap = 64 \ + }; \ + } while(0) + +#define memsafe_pophist do {\ + memsafe_allocation a = memsafe_allocstack.allocs \ + [--memsafe_allocstack.cnt]; \ + for (int i = 0; i < a.cnt; ++i) { \ + free(a.ptrs[i]); \ + } \ + free(a.ptrs); \ + } while(0) + +void safefree(void *x) { + assert(0 && "No manual freeing we do memory safety here"); +} +void *safemalloc(size_t x) { + memsafe_allocation *a = &memsafe_allocstack.allocs[memsafe_allocstack.cnt-1]; + if (a->cnt >= a->cap) { + a->ptrs = realloc(a->ptrs, 2*a->cap*sizeof(void*)); + a->cap *= 2; + } + void *p = malloc(x); + a->ptrs[a->cnt++] = p; + return p; +} +#endif