C test, wenn die Variable schreibgeschützt ist

8

Ich möchte eine Low-Level-Logging-Funktion schreiben, die wie folgt aussieht:

%Vor%

Ich möchte, dass der Zeiger aus Performancegründen anstatt einer Kopie der Zeichenkette auf die Zeichenkette gespeichert wird. Dies setzt voraus, dass die Zeichenfolge ein schreibgeschütztes Literal ist. Um zu verhindern, dass Benutzer den Debugger debuggen müssen, wäre es nett, wenn der Compiler sich beschweren könnte, wenn der erste Parameter von DO_DBG in einem schreibbaren Codeabschnitt gegen Text usw. wäre. Ich frage mich, ob ein Mechanismus dafür existiert. (Ich benutze gcc 4.9.1, ld 2.24).

    
John 29.01.2016, 20:11
quelle

4 Antworten

7

Sie könnten die automatische Literal-String-Verkettung zu Ihrem Vorteil verwenden:

%Vor%

Und implementieren Sie Ihr echtes Makro als _DO_DBG .

    
Amit 29.01.2016, 20:20
quelle
1

Sie können einen SIGSEGV -Handler einrichten und dann versuchen:

%Vor%

Wenn der Handler ausgelöst wird, bedeutet dies, dass sich die Variable in einem schreibgeschützten Segment befindet, sodass Sie den Zeiger speichern können. Wenn nicht, können Sie sich beschweren (oder einfach eine Kopie der Zeichenfolge erstellen).

Sie müssen die Zeichenfolge volatile deklarieren, damit der Compiler die Zuweisung nicht entfernt.

    
Barmar 29.01.2016 20:57
quelle
0

Alternativ können Sie das Konstrukt stringify verwenden:

%Vor%

und rufe deine Funktion DO_DGB_INTERNAL so würden Leute tun:

%Vor%

PS, möglicherweise eine variadic Funktion und Makro wäre hier eine gute Idee.

    
John Hascall 29.01.2016 20:25
quelle
0

Ihre Funktion erhält einen Zeiger auf den Anfang der Zeichenfolge. Wenn Ihr Betriebssystem dies zulässt und der Compiler es so einrichtet, könnte eine konstante Zeichenfolge (wie in Ihrem Beispiel) in einem schreibgeschützten Speicherbereich zugewiesen werden. Wenn der Compiler intelligent ist, speichert er eine Kopie einer mehrfach angezeigten Zeichenfolge. Es könnte sogar herausfinden, dass einige Zeichenketten nie benutzt werden und sie überhaupt nicht speichern.

Abgesehen von den obigen Angaben sollten Sie nicht herausfinden können, ob sich das Programm auf ein nicht definiertes Verhalten (Schreibzugriff auf eine konstante Zeichenkette) beschränkt, oder ob es sich um einen Nur-Lese-Speicher handelt. Sie könnten Adressen von Strings vergleichen, um zu sehen, ob sie nur eine Kopie sind, aber das ist es.

Bei jeder vernünftigen C-Implementierung (dh einer, die nicht umständlich ist, nur um Sie zu überspielen), sehen Sie keinen (oder höchstens einen extrem kleinen) Leistungsunterschied, wenn Die Zeichenfolge ist schreibgeschützt, schreibgeschützt, eine Kopie oder mehrere.

Wenn Sie Ihre Funktion mit einem char * -Parameter schreiben und diesen wegspeichern (keine Kopie in die angegebene Zeichenfolge), sollten Sie immer die gleiche Zeichenfolge zurückgeben (es sei denn, Ihre Umgebung ist wirklich seltsam).

    
vonbrand 29.01.2016 20:40
quelle

Tags und Links