| TCH (statz) | ![]() #1, Főfasz (10579) |
4185 | #3c8d | ^ | Idézet | Mon, 11 Apr 2016 15:28:41 +02 |
| 178.164.*.* |
|
*.pool.digikabel.hu |
A cé szar, mer bufferóverflórovatban két úriember méltó választ adott a bloatnyelvesek picsogására, az egyik egy tömör egysorossal, a másik kissé bővebben. Mondjuk most saxusnak is volt valid gondolata csak már megint nem mindegy, hogy a felesleges munka megspórolásáról, vagy a döntési jog elvesztéséről beszélünk, nem mindegy, hogy a gép helyettem dolgozik, vagy helyettem dönt! Az egészben a vicc egyébként, hogy olyanokkal bírnak előjönni, mint a tömbök "túlindexelésének" védelme; bazdmeg, ezt kb. 40 sor lenne megírni C-ben: #include <stdlib.h>
struct intarray_struct
{
int *data;
unsigned long long int count;
};
typedef struct intarray_struct *intarray;
#define new_intarray() (intarray)calloc(sizeof(struct intarray_struct), 1)
#define kill_intarray(ia) { free(ia->data); free(ia); ia = NULL; }
int set_intarray_e(intarray ia, unsigned long long int index, int value)
{
if (ia == NULL)
{
return 1;
}
if (index >= ia->count)
{
return 2;
}
ia->data[index] = value;
return 0;
}
int get_intarray_e(intarray ia, unsigned long long int index, int *value)
{
if (ia == NULL)
{
return 1;
}
if (index >= ia->count)
{
return 2;
}
*value = ia->data[index];
return 0;
}És ennyi! Persze lehet tovább bonyolítani, hogy mi szükséges még, de most itt a tömbindexelés védelméről volt szó, meg a plusz függvények is beleférnek kb. 100 sorba:int clear_intarray(intarray ia)
{
if (ia == NULL)
{
return 1;
}
if (ia->data != NULL && ia->count > 0)
{
free(ia->data);
}
ia->data = NULL;
ia->count = 0;
return 0;
}
int resize_intarray(intarray ia, unsigned long long int count)
{
int *new_data;
if (ia == NULL)
{
return 1;
}
if (count == 0)
{
return clear_intarray(ia);
}
new_data = (int *)realloc(ia->data, sizeof(int) * count);
if (new_data == NULL)
{
return 2;
}
ia->data = new_data;
ia->count = count;
return 0;
}
int append_intarray_e(intarray ia, int value)
{
int e;
if (ia == NULL)
{
return 1;
}
e = resize_intarray(ia, ia->count + 1);
if (e != 0)
{
return e;
}
ia->data[ia->count - 1] = value;
return 0;
}
int insert_intarray_e(intarray ia, unsigned long long int index, int value)
{
int e;
unsigned long long int lo, hi;
if (ia == NULL)
{
return 1;
}
e = resize_intarray(ia, ia->count + 1);
if (e != 0)
{
return e;
}
hi = ia->count - 1;
lo = hi - 1;
while (lo >= index)
{
ia->data[hi--] = ia->data[lo--];
}
ia->data[index] = value;
return 0;
}
int delete_intarray_block(intarray ia, unsigned long long index, unsigned long long count)
{
unsigned long long int i, lo, hi, limit;
if (ia == NULL)
{
return 1;
}
if (count >= ia->count)
{
return clear_intarray(ia);
}
if (index + count > ia->count)
{
count = ia->count - index;
}
hi = index + count;
limit = ia->count - hi;
lo = index;
i = 0;
while (i++ < limit)
{
ia->data[lo++] = ia->data[hi++];
}
return resize_intarray(ia, lo);
}És ennyi! Alig 150 sor (és 2-3 kB lefordítva) és van egy olyan integer tömb típusunk, ami fúr, farag, körmöt rág, faszt vakar és segget nyal. És nem lesz benne túlindex, overflow, meg bármilyen segfault, ha nem piszkálják a belsejét, hanem a függvényeket használják hozzá. És ilyet bármilyen típusra lehet írni. Ugyanezen az elven lehet csinálni stream típust is. Vagy akármit. És még mindig kicsi és gyors. Tán még egy "szaros" C64-en is használható lenne. A bloatnyelveknek ugyanezt sikerült úgy megoldani, hogy sok-sok MB és sok-sok GHz kelljen csak ahhoz, hogy megmoccanjon az a monstrum, amit kifosnak magukból! Úgyhogy a kurwa anyját a dzsuvának és a cisztának, de főleg a dzsuvaszkriptnek! |