• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

memset() Compileroptimierung verhindern

Themenstarter #1
Guten Morgen,
ich bastel mir gerade ein paar Bibliotheken für C in Visual Studio und stoße hin und wieder auf ungewollte Optimierungen, zB bei meinem freezero()
Code:
void
freezero(void *ptr, unsigned long size)
{
    memset(ptr, 0, size); // <- wird gefühlt gerne vom Compiler entfernt

    free(ptr);
}
Wie kann ich sinnvoll eine (Weg-) Optimierung von memset() verhindern, ohne einen Wert zu überprüfen?
 

schorsch_76

Well-Known Member
#2

Yamagi

Possessed With Psi Powers
Mitarbeiter
#3
Das ist nicht so einfach. Meistens hat der Compiler ja recht, manchmal - wie hier - ist er aber schlauer als der Entwickler und nimmt Code heraus, der funktional durchaus wichtig ist. Einen wirklich korrekten Weg gibt es für solche Fälle nicht, man muss im Einzelfall entscheiden:

 
Themenstarter #4
Unter Visual Studio (bedeutet wohl Windows) gibt es das ZeroMemory Macro [1]. Der Compiler erkennt, dass du den Speicher beschreibst und anschließend frei gibt's. Ergo für ihn kein SideEffect, Deshalb wird das wegoptimiert. Du musst dem Compiler sagen, dass es einen SideEffect gibt oder du sagst, dass er das nicht optimieren soll [2].
Vielen Dank, beide Wege führen zum Ziel, wobei ich wohl ZeroMemory verwenden werde bzw. mittels define zu freezero mache :)
 
Themenstarter #5
Man könnte *ptr als 'volatile' markieren. Das fände ich persönlich aber unschön.
Es kam mir vor, wie wenn ihm das volatile in meinem Fall egal war, da ich nicht
Code:
...
volatile void *ptr;
ptr = memset(ptr, 0, size);
...
verwendet habe, sondern einfach den return von void *memset() ignoriere. Merke gerade, dass ich memset als (void) hätte casten sollen :)

Aufjedenfall:
Die Compileranweisung führt zum Ziel, sowie ZeroMemory(), wobei ZeroMemory() deutlich eleganter wirkt. Mit volatile habe ich keine Erfahrung, aber mir kommts bisher etwas unlogisch vor, als ob der Compiler auch gerne mal das volatile wegoptimiert bzw. manchmal etwas unlogisch anwendet.
 
Zuletzt bearbeitet:
Themenstarter #6
Noch ein kleiner Zusatz:
Code:
ZeroMemory()
kann auch wegoptimiert werden :)
Code:
SecureZeroMemory()
wäre die Alternative, welche gegen Optimierung geschützt ist (Windows nervt mich).