Wie verwende ich das printf-Formatattribut von GCC mit variadischen C ++ 11-Vorlagen?

Ich habe eine C ++ - Klasse, die das Frontend für ein Protokollierungssystem ist. Die Protokollierungsfunktion wird mithilfe der verschiedenen Vorlagen von C ++ 11 implementiert:

template <typename... Args>
void Frontend::log(const char *fmt, Args&&... args) {
  backend->true_log(fmt, std::forward<Args>(args)...);
}

Jedes Protokollierungs-Backend implementiert eine eigene Version vontrue_log, die unter anderem die weitergeleiteten Parameter zum Aufrufen verwendetvsnprintf. Z.B.:

void Backend::true_log(const char *fmt, ...) {
  // other stuff..
  va_list ap;
  va_start(ap, fmt);
  vsnprintf(buffer, buffer_length, fmt, ap);
  va_end(ap);
  // other stuff..
}

Alles funktioniert super und ich bin glücklich.

Jetzt möchte ich eine statische Überprüfung auf die hinzufügenlog() parameter: speziell möchte ich das GCC-Attribut printf format verwenden.

Ich begann mit dem Taggen derlog() funktionieren mit__attribute__ ((format (printf, 2, 3))) (wiethis ist der erste "versteckte" Parameter, ich muss Parameterindizes um eins verschieben). Dies funktioniert nicht, da bei einem Kompilierungsfehler Folgendes fehlschlägt:

error: args to be formatted is not ‘...’

Dann habe ich versucht, das gleiche Attribut zu dem hinzuzufügentrue_log() Funktion. Es wird kompiliert, aber es wird keine Fehlerprüfung durchgeführt: Ich habe versucht, an zu übergebenlog() Einige ungültige Format- / Variablenkombinationen, und es wurde keine Warnung ausgegeben. Vielleicht ist diese Art der Prüfung "zu spät", oder mit anderen Worten, die Information über die Variable ist in der Aufrufkette verloren gegangen?

Als letzten Ausweg, wenn ich kommentiert habelog() mit__attribute__ ((format (printf, 2, 0)))Ich würde Warnungen über falsche Formatzeichenfolgen erhalten, aber für ungültige Format- / Variablenkombinationen würde keine Diagnose ausgegeben.

Das Problem zusammenfassen:Wie kann ich die vollständige Formatüberprüfung von GCC aus durchführen, wenn ich die unterschiedlichen Vorlagen von C ++ 11 verwende?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage