Obfuscated C Code



  • Hallo,

    ich programmiere schon seit ein paar Jahren etwas C und C++, aber die Codes, die ich auf http://www.de.ioccc.org/ gefunden habe, verstehe ich einfach nicht mal annähernd. (Dass der Code natürlich absichtlich so kryptisch ist ist mir klar, mir geht es auch eher um diese ganzen operatoren und Tricks die da verwendet werden)

    Beispiel: http://www.de.ioccc.org/2004/gavare.c

    Ich bin über diese Operationen irgendwie noch nie wirklich gestolpert.
    Was bedeutet z.B. E="1""111886:6:??AAF""FHHMMOO55557799@@>>>BBBGGIIKK"[b]-64;
    Was machen die :,? und @. Wieso macht man mehere Zeichen in "" und das aufeinander also "1""111..."?
    Und so wie es aussieht wird da ja auch mit , (Komma) getrickst.

    Oder hier: http://www.de.ioccc.org/2001/schweikh.c
    Hier wird ein ! Operator benutzt.

    Wo finde ich Informationen darüber? Gibt es eine Quelle die an Beispielen diese Dinge erklärt? Ich finde das so unglaublich interessant.

    Vielen Dank für alle Tipps 🙂

    Viele Grüße,
    Samu



  • Wo finde ich Informationen darüber? Gibt es eine Quelle die an Beispielen diese Dinge erklärt?

    Das C/C++ Buch deiner Wahl.

    Edit um heute auch mal hilfreich zu sein lol:

    ! heißt NICHT.
    ? fragezeichenoperator, macht nichts anderes als if else.

    Und das obere beispiel möchte ich nicht nachvollziehen müssen.



  • Samuirai schrieb:

    Oder hier: http://www.de.ioccc.org/2001/schweikh.c
    Hier wird ein ! Operator benutzt.

    Der Code ist ziemlich trivial, aber absolut unsauber. Der ! Operator ist übrigens eine logische Negation. Das kein Prototyp für m vorhanden ist funktioniert deswegen, weil der Compiler hier einfach etwas annimmt. Das selbe mit dem weggelassenem Rückgabetyp. Der Compiler nimmt hier einfach an, die Funktion genügt dem Prototyp int foo(...)



  • Oh Gott wie peinlich. ! ist ja nicht.
    Hab mich von den ganzen anderen Sachen so verwirren lassen.

    Was ich gerne noch sehen würde ist, wie eben diese Operatoren genutzt werde für irgendwelche coolen Sachen. Kennt irgendjemand eine Seite mit Codeschnipsel die Probleme besonders Kurz oder intelligent lösen, durch eben die Verwendung solcher Operatoren?

    Viele Grüße



  • Ich kann dir nur davon abraten solch unleserlichen Unsinn zu schreiben. Es bringt genau gar nichts. Von all deinen Mühen lässt der Compiler zum Schluß nichts mehr übrig. Dass heißt, es bringt schon etwas, und zwar wesentlich mehr Aufwand für dich. Und wenn du dir mal genau den Code anschaust, wirst du feststellen, dass viele nutzlose Anweisungen dort stehen. Die einfach nur da sind, um diese "hübsche" Formatierung zu erreichen.

    Der bedingte Ausdruck ist aber sinnvoll, wenn man eine Bedingung in einer Zeile unterbringen will oder muss.

    const int a = wert < 0 ? -1 * wert : wert;
    

    Hier wird zum Beispiel eine Konstante a mit dem Betrag von wert initialisiert. Mit if-else wäre dies nicht möglich, weil dort für jeden Fall ein eigener Anweisungsblock existiert.



  • Danke für das Beispiel. Das ist ja echt klasse.

    Ich programmiere viel in meiner Freizeit. Auch python und da versuch ich dann z.B. auch schöne Einzeiler zu schaffen. Wen ich so programmiere geht es mir auch nicht um die Entwicklung eines wichtigen Programms, sondern um kreativität. Gerade Informatiker sind doch dafür bekannt "out of the box" zu denken und daher ist das für mich in irgendeiner Weise künstlerische kreativität die sich später eventuell in neuen kreativen Lösungen für Probleme niederschlägt.

    Ich möchte so Code nicht schreiben/verstehen für meinen Arbeitgeber, sondern für mich selbst. Eine art Selbsterfüllung 🙂



  • Du meinst also Codeverkürzungen, zum Beispiel durch implizite Konvertierungen? Wenn du nicht selber darauf kommst, dass ein Ausdruck das gleiche bedeuten könnte, dann würde ich die Finger von so etwas lassen. Zum Schluss verstehst du deinen eigenen Quelltext nicht mehr. Und gerade wenn du dich noch mit anderen Sprachen beschäftigst ist diese Vorgehensweise eher hinderlich. Wenn diese keine impliziten Konvertierungen unterstützt wunderst du dich dann nur, warum es nicht funktioniert. Das Beispiel mit dem Betrag würde man der Übersicht halber normalerweise in eine Funktion auslagern und dort kann dann auch wieder if-else benutzen.



  • ... würde man der Übersicht halber normalerweise in eine Funktion auslagern ...

    genau das sagte ich ja ist garnicht mein Ziel.
    Ich mach mal ein Beispiel.
    Ich will den numerischen Wert einer Zahl die im Ascii Code steht.

    char a='3';
    int b=a-48;
    // oder
    b=a-'0';
    

    Ich weiß, dass das Beispiel absolut trivial ist, aber es verdeutlicht was ich meine. Elegeante Lösungen. Wie bei Rekursion. Rekursion ist oft langsamer, vielleicht auch mal komplexer als iterative Lösungen aber dafür elegant.

    Ich würde sagen ich bin kein Informatiker der nur für die Arbeit programmiert und irgendwie stupide immer alles ähnlich und langweilig macht.
    Aus dem Grund mach ich z.B. immer wieder Aufgaben bei Projecteuler usw.
    Das macht mir einfach Spaß. Und Algorithmen die eben durch eine interessante Verwendung von Operationen gelöst sind, ist das etwas was ich erreichen will.
    Ich will ja auch kein Code schreiben wie z.B.

    #define p main
    

    um einfach die Main für irgendwas ekliges umzubennenen. Sondern ich dachte in in diesen Codes werden Operationen (anders) verwendet um einfach auf irgend eine andere Weise die Lösung zu finden. Ziel der Sache wäre für mich, so auf andere/schönere Lösungen bei zukünftigen Problemen zu kommen.

    @Hinweisgeber Es gibt nicht nur Softwareentwicklung in der Informatik gibt, sondern zum Beispiel ein Bereich, der mir mehr Spaß macht, das Lösen von (mathematischen) Problemen mit der Hilfe von Algorithmen.
    Und da würde ich keine Funktion für den Betrag extra schreiben. Das dauert mir zu lange. Da schreib ich das wie das Beispiel oben. Das würde mir in diesem Fall besser gefallen. So Code macht mich dann einfach glücklich ^^

    Wie schon gesagt, es ist nur für mich, zur kreativen Selbstverwirklichung (wie für andere ist es z.B. Zeichnen oder Malen).

    Viele Grüße,
    Samu



  • Ich weiß ehrlich gesagt nicht worauf du hinaus willst. Wenn dich Funktionsaufrufe stören und das müssen sie nicht, dann gibt es immer noch Makros. Und die sind genau für den Zweck alles andere als evil. Sie machen evil Code, wie x-48, leserlich zu einem CHAR_TO_INT(x).
    Übrigens würde ich gerade bei der Lösung von mathematischen Algorithmen nicht die Bildung des Betrages selber hinschreiben. Weil es einfach natürlicher ist Betrag von x zu schreiben, als wenn x kleiner 0, dann multipliziere es mit -1.
    Noch als letzter Hinweis, wenn es dir hauptsächlich um mathematische Algorithmen geht, wäre vielleicht octave/Matlab etwas für dich. Es ist aber wesentlich langsamer als C, besonders eigene Algorithmen. Dafür bekommst du schon eine Menge Algorithmen, aus denen du etwas eigenes basteln kannst.



  • ich find den verlinkten code jetzt nicht sonderlich schwierig FÜR OBFUSCATED code.
    natürlich würde ich jedem eine Ohrfeige geben der mir sowas abliefert, aber das zu verstehen ist doch echt kein Problem...

    Bedenke das es teilweise sehr schwierig wird, weil schllichtweg Kommentare fehlen und man sich nicht so gut in andere Denkmuster hineinversetzen kann, wie man sich in seiner eigenen Logik fühlt 😉

    Ich glaube bei sowas kommt es sehr darauf an WIE man C gelernt hat.
    Wer sich das mit nem Jürgen Wolf Buch beigebracht hat wird wohl weniger damit anfängen können als jemand der K&R laß, da dort wesentlich mehr auf Auswertungen eingegangen wird um die Eigenschaften der Sprache zu beschreiben.



  • Übrigens hebt sich im obrigen Beispiel das "" einfach weg. "1""2" ist das gleiche wie "12". Das ist vor allem in zwei Zusammenhängen praktisch, nämlich erstens bei mehrzeiligen Stringliterale:

    char const *usage =
      "Aufruf: programmname -a -b filename [-c ...]\n"
      "\n"
      "Ruft ein Programm mit Parametern auf\n";
    

    und zweitens bei Makros:

    #define FOOIFY(x) "foo" #x
    
    /* FOOIFY(bar) wird zu "foobar" */
    

Anmelden zum Antworten