Die beste Möglichkeit zum Generieren eines Link-Zeitfehlers für veraltete Funktionen, die nicht von Benutzern verwendet werden sollen, besteht darin, sicherzustellen, dass die veralteten Funktionen nicht in den Bibliotheken vorhanden sind - wodurch sie eine Stufe über "veraltet" hinausgehen.
Möglicherweise können Sie eine Hilfsbibliothek mit der veralteten Funktion darin bereitstellen; die Verworfenen, die nicht aufpassen werden, können sich mit der Hilfsbibliothek verbinden, aber die Leute im Mainstream werden die Hilfsbibliothek nicht benutzen und deshalb die Funktionen nicht benutzen. Es geht jedoch immer noch über das "veraltete" Stadium hinaus.
Es ist schwierig, eine Link-Zeit-Warnung zu erhalten. Offensichtlich macht GCC das für einige Funktionen (mktemp()
et al), und Apple hat GCC warnen, wenn Sie ein Programm ausführen, das gets()
verwendet. Ich weiß nicht, was sie tun, um das zu erreichen.
Im Lichte der Kommentare, ich glaube, das Problem weg bei der Kompilierung, anstatt zu warten, bis Link Zeit oder zur Laufzeit gehen brauchen.
Die GCC-Attribute sind (von der GCC 4.4.1 Handbuch):
error ("message")
Wenn dieses Attribut auf einer Funktionsdeklaration und einem Aufruf einer solchen Funktion verwendet wird, wird nicht durch totem Code beseitigt Beseitigung oder andere Optimierungen, ein Fehler , der Nachricht enthält, wird diagnostiziert. Dies ist nützlich für die Kompilierzeit Überprüfung, vor allem zusammen mit __builtin_constant_p und Inline-Funktionen wo Überprüfung der Inline-Funktion Argumente ist nicht möglich durch externe char [(Bedingung)? 1: -1]; Tricks. Während es möglich ist, die Funktion undefiniert zu lassen und somit einen Verbindungsfehler auszulösen, wird bei Verwendung dieses Attributs das Problem früher diagnostiziert und der genaue Standort des Anrufs selbst bei Anwesenheit von Inline-Funktionen oder wenn keine Debugging-Informationen ausgegeben werden.
warning ("message")
Wenn dieses Attribut auf einer Funktionsdeklaration und ein Aufruf an eine solche Funktion ist nicht durch Beseitigung von totem Code oder andere Optimierungen eliminiert verwendet wird, wird eine Warnung die Nachricht enthalten wird wird diagnostiziert. Dies ist nützlich für die Kompilierzeit Überprüfung, vor allem zusammen mit __builtin_constant_p und Inline-Funktionen. Während es möglich ist, die Funktion mit einer Nachricht in .gnu zu definieren.Warnung * Abschnitt, wenn dieses Attribut wird das Problem früher und mit dem genauen Standort des Anrufs auch in Anwesenheit von Inline-Funktionen oder wenn nicht emittierende Debug-Informationen diagnostiziert.
Wenn die Konfigurationsprogramme die Fehler ignorieren, sind sie einfach fehlerhaft. Das bedeutet, dass neuer Code nicht mit den Funktionen kompiliert werden konnte, aber der vorhandene Code weiterhin die veralteten Funktionen in den Bibliotheken verwenden kann (bis er neu kompiliert werden muss).
Die Warnungen können mit der '.gnu.warning' Note getan werden, aber Ich kenne kein Äquivalent für die Generierung von Fehlern. Während Ihre Lösung die beste ist, erfüllt sie leider nicht meine Anforderungen, sowohl mit einem veralteten ABI als auch mit der Verknüpfung neuer Anwendungen übereinzustimmen. –
@R ..: Fair genug. Ist es fair zu sagen, dass Sie eine Kopie der Bibliotheken installiert haben möchten; Sie möchten, dass vorkompilierte Apps (die die veraltete Schnittstelle verwenden können) weiterhin ausgeführt werden. Sie möchten, dass neu kompilierte Apps, die die veraltete Schnittstelle verwenden, keine Verbindung herstellen können? Wenn ja, und wenn die Konfigurationsdetektoren die veralteten Funktionen erkennen, wie planen Sie, dass Leute Dinge reparieren lassen, damit der Code mit den modernen (nicht veralteten) Schnittstellen verknüpft wird? –
Es gibt keine neue Austauschschnittstelle; Der Versuch, diese veralteten Schnittstellen zu verwenden, ist nur schädlich, und das richtige Verhalten besteht darin, sie überhaupt nicht zu verwenden.Leider habe ich keine Kontrolle über die kaputte Software, die versucht, sie zu verwenden, und während ich die Betreuer wahrscheinlich dazu bringen könnte, neue Versionen zu reparieren, versuchen die Benutzer möglicherweise noch eine Weile alte Versionen zu kompilieren. –