Re: Strict aliasing and buffer handling
"Francois Duranleau" <xiao.bai.xiong@gmail.com> ha scritto nel messaggio
news:f70612e6-c4e9-4166-842a-afc158fba36e@k6g2000yqc.googlegroups.com...
i don't know if this is right, it is only one try it is something about:
----------
#include <stdint.h>
#include <stdlib.h>
#include <iostream.h>
// macro for types
#define u64 uint64_t
#define u32 uint32_t
#define u16 uint16_t
#define u8 uint8_t
#define uns unsigned
// macro for function
#define P printf
// macro for keyWords
#define G goto
#define R return
#define W while
#define F for
#define T template
#define TN typename
// return u8 offset from type t offset (index)
T<TN t>u32 RetOffset(u32 index, t& m)
{t a[2];
u8 *i,*j;
u32 k;
(void) m;
i=(u8*)a; j=(u8*)(a+1);
k=j-i;
P("k==%u\n", k);
if((int)k<=0) R -1; // assurdo?
R index*k; // here how detect overflow?
}
// buf vettore ritornato da malloc o new
// allineato ok per ogni possibile tipo
T<TN t>u32 GetData(t* data, u8* buf, u32 bufsz ,u32 offset)
{t a[2], *d;
u8 *i,*j;
u32 k;
// problemi nel determinare l'overflow di offsetof
// P("offset=%u sizeof(t)=%u\n", (uns)offset, (uns)sizeof(t));
if((int)offset<0 || (offset+sizeof(t))>=bufsz)
R -1;
i=(u8*)a; j=(u8*)(a+1);
k=j-i;
if((int)k<=0) R -1;
k=offset%k;
if(k!=0) R -1; // non propriamente allineato
*data=*(t*)(buf+offset);
R 0;
}
// buf vettore ritornato da malloc o new
// allineato ok per ogni possibile tipo
// trasforma il vettore buf in un vettore di tipi t
// index offset/sizeof(t)
T<TN t>u32 SetData(u8* buf, u32 bufsz ,u32 offset, t& data)
{t a[2],*d;
u8 *i,*j;
u32 k;
if(offset+sizeof(t)>=bufsz)
R -1;
i=(u8*)a; j=(u8*)(a+1);
k=j-i;
if((int)k<=0) R -1;
k=offset%k;
if(k!=0) R -1;
*(t*)(buf+offset)=data;
R 0;
}
int main(void)
{long double ld0=1.123, ld1=0.0;
double d0=2.123, d1=0.0;
size_t s0=12345, s1=0;
u8 *buf;
u32 a, b, c, r;
buf=(u8*)malloc(1000);
if(buf==0) R 0;
a=RetOffset(0,ld0);
b=RetOffset(4, d0);
c=RetOffset(16, s0);
P("a=%u, b=%u, c=%u\n", (uns)a, (uns)b, (uns)c);
if(a+sizeof(long double)>b)
{err: P("Trovato errore"); free(buf); R 0;}
if(b+sizeof(double)>c) G err;
if(c+sizeof(size_t)>1000) G err;
r=SetData(buf, 100, a, ld0); if(r==-1) G err;
r=SetData(buf, 100, b, d0); if(r==-1) G err;
r=SetData(buf, 100, c, s0); if(r==-1) G err;
r=GetData(&ld1, buf, 100, a); if(r==-1) G err;
r=GetData(&d1, buf, 100, b); if(r==-1) G err;
r=GetData(&s1, buf, 100, c); if(r==-1) G err;
P("ld1=%f d1=%f s1=%u\n", (double)ld1, d1, (uns) s1);
free(buf);
R 0;
}
----------
k==10
k==8
k==4
a=0, b=32, c=64
ld1=1.123000 d1=2.123000 s1=12345
----------------