// t20251211a.c: use-after-freeのテスト#0.
#include "acl4.c"
int main(void)
{
acl4_ini();
char *s = Amalc(16); // malloc.
AUaf u[1]; AUaf_ini(u, s _1); // これでuはsを監視するためのオブジェクトになる.
AUaf_chk(u _); strcpy(s, "hello"); // ここではエラーならずに通してもらえる(あたりまえだけど一応テスト).
Amfre(s, 16); // ここでメモリを開放してしまう.
AUaf_chk(u _); puts(s); // これは許されないはず.
return 0;
}C:\rsd0027\progs\acl4>t20251211a t20251211a.c(11): AUaf_chk: invalid pointer C:\rsd0027\progs\acl4>
// t20251211b.c: use-after-freeのテスト#1.
#include "acl4.c"
int main(void)
{
acl4_ini();
char *s = Amalc(16);
AUaf u[1]; AUaf_ini(u, s _1); // これでuはsを監視するためのオブジェクトになる.
AUaf_chk(u _); strcpy(s, "hello");
Amfre(s, 16);
char *a = Amalc(16); // a~cのどれかでsだった場所にもう一度割り当てさせたい.
char *b = Amalc(16);
char *c = Amalc(16);
printf("s=%08x a=%08x b=%08x c=%08x\n", (uintptr_t) s, (uintptr_t) a, (uintptr_t) b, (uintptr_t) c);
AUaf_chk(u _); puts(s); // これは許されないはず.
return 0;
}C:\rsd0027\progs\acl4>t20251211b s=00f99c08 a=00f99c08 b=00f9db50 c=00f9dba8 t20251211b.c(15): AUaf_chk: invalid pointer C:\rsd0027\progs\acl4>
int func(A1_ int x, char *y, double z)
{
Aenter;
...
Aleave;
return ...;
}i = func(A_ 123, "hello", 4.56);