Net van een schitterende presentatie gekomen waarin een student een paar vormen van C syntax abuse presenteerde. Ik herinner me niet alles meer, maar wel de volgende dingen die ik voor de eerste keer zag (ik heb me nooit met obfuscation bezig gehouden, waarschijnlijk is er nog veel meer):
Code: Select all
while (i --> 0)
{ printf("%d\n", i); }
is een elegante, zij het ietwat verwarrende, manier om alle nummers uit te printen van i dalend tot 0, gegeven i positieve integer.
Code: Select all
bool castToBool(int myInt)
{ return !!myInt; }
doet een cast van int naar bool zonder dat de compiler reclameert. De truk stamt blijkbaar uit de tijd van code checking met
lint, dat een expliciete cast van int naar bool als error zou interpreteren. !! triggert die error niet, en is dus de ideale "don't you tell me how to code" oplossing van dodgy programmeurs.
Maar deze is wreed lelijk: "&" kan op twee manieren gebruikt worden: als unary dereference operator voor variabelen, of als binary and. Maar in GCC, kan ook "&&" op exact dezelfde twee manieren gebruikt worden. De binaire logical and kennen jullie, en de unaire "&&" doet ook dereferencing - maar dan dereferencing van labels:
Code: Select all
void endlessLoop()
{
void *ptr = &&begin;
begin:
doSomeThing();
end:
goto *ptr;
}
Ideaal om goto-statements totaal up te fucken. Het is geen deel van de C syntax, maar een extensie die in GCC zit. Er werd me verteld dat in de begindagen van GCC een hoop mannen van Intel dat gebruikten in hun eigen compiler en in hun eigen software er extensief gebruik van maakten. Dan kloegen ze tegen de GCC devs dat ze hun software niet gecompileerd kregen met GCC, en blijkbaar hebben de devs dat er toen maar ingestoken om van het gezaag van Intel af te zijn. Weet niet wat er van dat verhaal waar is, maar het zou me niet zo hard verbazen...
Er is ook nog array indexing, die ik wel al kende maar die een vreemd zicht blijft (geldige syntax btw): a[5] is equivalent met 5[a], want ze worden vertaald als *(a+5) en *(5+a) respectievelijk, wat hetzelfde is.
Iemand die nog voorbeelden heeft van syntax abuse / obfuscation in C of in andere talen?