PREfast und third-party-code

Wenn man Third-Party-Code einsetzt, hat man sehr oft nicht den Luxus, an dem so lange rumschrauben zu können, bis er sauber durch PREfast durchläuft. Ein neues Release dieses Third-Party-Codes, und die Arbeit fängt wieder von vorne an. SQLite ist so ein Fall. Ich benutze in einer Reihe von Projekten die SQLite Amalgamation, das ist ein einziges riesiges C-File namens sqlite3.c mit dem kompletten Code von SQLite drinne. Damit ich Projekte, die sqlite3.c benutzen, auch mit PREfast übersetzen kann und dabei nicht von den Gazillionen von PREfast-Warnungen aus der sqlite3.c, an denen ich eh nichts ändern kann/sollte, erschlagen werde, injiziere ich beim Übersetzen von sqlite3.c ein Headerfile von mir. Das Injizieren von Headerfiles ist ein ziemlich fieses mächtiges Feature von Visual C, das seit Urzeiten in diesem Produkt drinne ist, das aber auffällig wenige Leute kennen. Das ganze geht mit dem Compilerschalter /FI, mit dem man den Namen eines Headerfiles angibt, das gelesen werden soll, und zwar vor allen Headerfiles, die von dem zu übersetzenden Sourcefile inkludiert werden (sogar vor einem eventuell einzulesenden precompiled header). Damit kann man also allerhand fiesen Schabernack treiben und Header inkludieren, ohne Sourcefiles zu ändern. Speziell im Fall sqlite3.c habe ich ein Headerfile namens sqltpref.h, bei dem ich über die include-Pfade dafür sorge, dass es in den relevanten Projekten automatisch über Angabe des Dateinamens gefunden wird, und das in etwa folgendermassen ausschaut:

#ifndef SQLTPREF_H__
#define SQLTPREF_H__

#ifdef _PREFAST_
///
/// here we collect all those warnings that prefast
/// shows if we compile the sqlite amalgamation:
///
#pragma warning (disable:6386 6326 6001 6246 6011 6292 6244 6385 6239 6235 6328 6295)

#endif /// _PREFAST_


#endif /// SQLTPREF_H__

Dann muss ich nur noch in jedem Projekt für die Datei sqlite3.c mit dem Compilerschalter /FI diesen Header injizieren, also durch Angabe von

/FI"sqltpref.h"

auf der Kommandozeile des Compilers. In Visual Studio geht das sehr einfach, indem man die Datei sqlite3.c im Baum vom Solution Explorer anwählt, sich die Properties anzeigen lässt und zur Anzeige der Kommandozeile navigiert unter "Configuration Properties"-"C/C++"-"Command Line". Dort trägt man einfach unter Additional Options den /FI"sqltpref.h" ein und fertig. So sieht das dann in echt aus:

Das war's, damit lässt sich nun sqlite3.c auch dann problemlos übersetzen, wenn mit PREfast übersetzt wird, und bleibt dabei mucksmäuschenstill. Happy PREfasting, you know, I am!

PREfast und MFC

Da meine Ansprüche an meinen eigenen Code dergestalt sind, dass er ungestreift mit PREfast übersetzt werden können muss, habe ich bei meinen MFC-basierten Anwendungen immer ein kleines Problem: Die Headerfiles der MFC sind nicht PREfast-compliant und an diesen Headern schraubt man selber nix rum. Daher benutze ich meist folgenden kleinen Trick: Während in der stdafx.h die MFC-Headerfiles eingelesen werden, schalte ich die notorischen PREfast-Warnungen der MFC-Headers aus und schalte sie hinterher ein. Das tue ich nur, wenn auch ein Übersetzungslauf mit PREfast ansteht, denn ansonsten erhalte ich Warnungen für nicht-existierende Warnungsnummern (nämlich die aus PREfast). Das ganze sieht also in einer stdafx.h von mir etwa so aus:

 

#ifdef _PREFAST_
#pragma warning (push)
#pragma warning (disable: 6387)
#endif ///_PREFAST_

#include <afxwin.h>        
#include <afxext.h>

/// include other stuff from MFC, yaddaa, yaddaa ...

#ifdef _PREFAST_
#pragma warning (pop)
#endif ///_PREFAST_

Durch das Makro _PREFAST_, das automatisch definiert ist, wenn ein Übersetzungslauf mit PREfast stattfindet, kann man somit sehr geschickt ganz selektiv die Warnung 6387 ausschalten.

Happy PREfasting, you know, I am!

Quote of the day

"Das ist wie Pädagogisch, nur ohne Füße"

Karl Farrent am 21.3.2012 zur Frage nach der Bedeutung des Worts "Agogisch"

Mein Kobold bei der Arbeit

Seit etwas mehr als einer Woche bin ich jetzt der stolze Besitzer eines vollautonomen Saugroboters vom Typ Vorwerk Kobold VR100. Da gehört es sich, dass ich den Knaben mal bei der Arbeit beobachte. Das Bild während der Fahrt hat meine Digitalkamera gefilmt, die ich mit Gaffer-Tape vorne an den Roboter angeklebt habe. Das Picture-In-Picture wurde mit meinem Handy vom Tisch aus aufgenommen, auch provisorisch mit Gaffer-Tape angebracht. Ich hoffe, dass ausreichend viele Betrachter in der Lage sind, die gelungene Musikauswahl zu goutieren (man muss den Film dazu kennen).

Also: Unbedingt die Lautsprecher einschalten beim Videokucken.





Made me chuckle...

Aus dem Flyer im Programmheft eines Konzerts, das ich gestern abend besucht habe:

Das Konzert war übrigens hervorragend, anders als die Ottogravieh des Flyers vermuten liesse.

Free Blog Themes and Free Blog Templates