2009-11-25

Vortrag: Was eine WAF (nicht) kann

Gestern habe ich auf dem  OWASP-Stammtisch München einen Vortrag zum Thema Was eine WAF (nicht) kann gehalten.  Es gab jede Menge Diskussionen und hat mal wieder richtig Spaß gemacht :-)

2009-11-18

Kurioses vom C Präprozessor



Schauen wir uns mal dieses File an:

#define CPP1(s) #s
#define CPP2(s) CPP1(s)
char *a = CPP1(HELLO);
char *b = CPP2(HELLO);

CPP1() benutzt #s, den Operator im C-Preprozessor, der einen Namen in einen String umwandelt. 

Eigentlich sollte man ja erwarten, das CPP1 und CPP2 identisch sind. Auf der ersten Blick ist das auch so:

$ gcc -E t.c 
#...
char *a = "HELLO";
char *b = "HELLO"; 


Aber wenn man HELLO als Symbol definiert, ändert sich das Bild:

$ gcc -D HELLO=WORLD -E t.c
 # ...
char *a = "HELLO";
char *b = "WORLD";


Wieder mal was über den C-Preprozessor gelernt.

2009-10-29

Exceptions in Python sind langsamer als gedacht

Heute habe ich mal wieder ein Python Aha Erlebnis gehabt. Beim Optimieren einer Klasse habe ich ein paar Benchmarks zum Theme dict() Zugriff und Exception Handling durchgeführt.

Kurz gesagt, brauche ich eine Funktion, die ein Key in mehreren dicts sucht.


Klassisch in Python implementiert man das so:

def get_from_dict_list(dict_list,k):
    for d in dict_list:
        try:
            return d[k]
        except KeyError:
            pass
    return None
Eine alternative Implementation is

def get_from_dict_list(dict_list,k):
    for d in dict_list:
        if k in d:
            return d[k]
    return None
Die erste Methode wird normalweise bevorzugt. Dies hat zwei Gründe: Zum einen gilt der Spruch: "it's easier to ask forgiveness than permission" und exception handling ist ein integraler Bestandteil der Sprache. Zum anderen hat die zweite Methode potentielle Race-Conditions und kann eine unerwartete Exception werfen wenn k aus d gelöscht wird, während die Methode abgearbeitet wird.

Für den Fall, das der Key gleich im ersten dict gefunden wird, ist die erste Methode sogar leicht schneller. Falls aber das Exception Handling getirggert wird, wird es richtig langsam. Auf meinem Laptop liefert timeit einen Faktor von 10(!) zwischen den beiden Methoden, zugunsten der zweiten. Das Exception abfangen und ignorieren kostet auf meinem Laptop 4 Mikrosekunden