syntax abuse

Examenroosters, algemene discussies, ...

Moderator: Praesidium

User avatar
Foundation
Posts: 622

syntax abuse

Post#1 » Sat Mar 06, 2010 5:12 am

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?

User avatar
Tom
Posts: 602

Post#2 » Sat Mar 06, 2010 12:16 pm

Wedstrijd voor C met ingezonden oplossingen van de vorige jaren:
The International Obfuscated C Code Contest

Obfuscation van een oplossing op een probleem in heel wat talen:
Stack Overflow - Code Golf: Evaluating Mathematical Expressions

Allemaal soortgelijk aan voorgaande, wel niet allemaal obfuscation:
Stack Overflow - Search for 'Code Golf'

timvdm
Posts: 47

Re: syntax abuse

Post#3 » Sun Sep 16, 2012 9:05 pm

Al een oude topic maar hier zijn er nog enkele leuke voor C++.

Code: Select all


%:include <iostream>

int main(int argc, char **argv)
<%
std::cout << 0<:argv:> << std::endl;
%>
en wat is de output van volgende code?

Code: Select all


#include <iostream>

int main()
{
int x = 0;
for (int i = 0; i < 100; ++i);
// what does this line do ?????????????/
++x;
std::cout << "x = " << x << std::endl;
}

Return to “Algemeen”

Who is online

Users browsing this forum: Google [Bot] and 5 guests

cron