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!