2009-03-07 17 views
2

In C kann eine Funktion den Speicher freigeben, der auf niedrigerer Ebene als nur für diejenigen, die diese Funktion aufrufen, "verwaltet" (ihre Adresse wird angezeigt). return * const ist nicht effektiv, aber ich fragte mich, ob ich eine Programmierhilfe übersehen hatte?Speicher als schreibgeschützt anzeigen

Danke.

const uint8_t * get_value(int index) 
{ 
static uint8_t data[2] = {0, 0}; 
return (const uint8_t *)&data[index]; 
} 

int main(void) 
{ 
uint8_t * value; 
value = get_value(1); 

*value += 1; 
return 0; 
} 

@j_random_hacker empfohlen, einen guten Kompromiss zu meiner Frage, gibt die zusätzliche Barriere ich suche lässig falschen Gebrauch dieser Daten zu verhindern.

typedef struct 
{ 
    const uint8_t * value; 
    const uint8_t size; 

} readonly_t; 

readonly_t get_value(int index, int size) 
{ 
    static uint8_t data[2] = {0, 0}; 
    uint8_t rsize; 

    /* ... validate index, size params */ 

    readonly_t r = { &data[index], rsize }; 
    return r; 
} 
+0

Ich habe keine Ahnung, warum dies ein Community-Wiki ist. – TheTXI

+0

Mein Fehler. Ein paar Klicks hier und da ein bisschen zu schnell, dann einreichen - aber nicht rückgängig machen. – Oliver

Antwort

6

Es ist C! Du kannst nicht :) Es gibt immer einen Weg, es zu umgehen. Mach es einfach const und hoffe, dass jemand es nicht ändert.

Wenn Sie ein Add-In oder ähnliches hosten, sollten Sie es in einem separaten Prozess ausführen, um den Zugriff auf den Arbeitsspeicher zu beschränken.

+0

Markierte Antwort, weil Sie technisch richtig sind - ich kann in diesem Szenario keine echte schreibgeschützte Funktionalität erreichen. Danke für Ihre Eingabe – Oliver

1
+0

Plattformabhängige und Zuweisungsgranularität> = 4 KB. Aber wenn das kein Problem ist ... :) – peterchen

+0

Nicht auf MS-Plattform, weit davon entfernt. Mit einem OSEK OS und Vanille C, keine Standard-Bibliotheken etc. – Oliver

+0

Ja, seine Art von skeezy Antwort, stimme ich zu. Aber ich dachte mir, andere Leute würden auf seine Unmöglichkeit in C hinweisen. Natürlich können Anrufer VirtualProtect() benutzen, um den Status zu ändern. Am besten geben Sie ein Handle einer Art zurück und ordnen es intern der undurchsichtigen Datenstruktur zu. –

1

Sie einen Zeiger nicht zurück, geben Sie die spitzen Wert auf Objekt wie in:

uint8_t get_value(int index) 
{ 
    static uint8_t data[2] = {0, 0}; 
    return data[index]; 
} 
+0

Ich würde aber das könnte n-Bytes in der Länge sein, z. B. eine Struktur – Oliver

+0

Dann, was Sie bereits haben, ist das Beste, was Sie mit dieser Sprache können. – dirkgently

+0

Wenn n festgelegt ist, können Sie das Array in eine Struktur einschließen und diesen Wert als Wert zurückgeben. C erlaubt es, Strukturen als erstklassige Werte zu behandeln (sie können mit =, an Funktionen übergeben und von diesen zurückgegeben werden), aber aus irgendeinem Grund nicht mit Arrays. –

0

Speicherschutz in ‚C nicht ein Sprachkonstrukt, es ist etwas mit der Hardware zu tun. Wenn beispielsweise der Speicher, auf den der Zeiger zeigt, in irgendeinem ROM-Bereich oder etwas liegt, ist das Schreiben nicht möglich. Und umgekehrt können wir sogar den Teil von ReadOnly auf der Hardware-Ebene machen, dann können Sie eine Speicherausnahme erwarten.

Verwandte Themen