Der Martin: Windows-API: Speicherverbrauch der laufenden Anwendung abfragen

Beitrag lesen

Hallo,

wsprintf(str, "RAM: %d kB", pmc.WorkingSetSize>>10);

woher weiß denn wsprintf hier, wie groß str ist? Oder weiß es das gar nicht

das weiß es tatsächlich nicht. Aber ich weiß es.

die berühmten „letzten Worte eines C-Programmierers“ analog zum Beifahrer, der vermeldet, dass „von rechts kein Auto kommt“ 😉

oder die des stotternden Beifahrers: Frei... frei... FREI... FREILICH KOMMT DAS WAS!!

Nein, im Ernst: Ich weiß doch, was ich den den String reinkippe. In diesem Fall ein DWORD. Das hat als Zahl ausgeschrieben maximal 10 Ziffern. Dazu in diesem Fall eine Handvoll Zierat drumrum, Summe <20 Zeichen. Also reicht mein üblicher 1kB-Puffer lang und schmutzig.

Wenn ich natürlich wiederum Strings einsetze, von denen ich vorher nicht weiß, wei lang sie sind, sieht's anders aus.

Ich habe die 1024-Byte-Anmerkung bei wsprintf aber bisher so verstenden, dass die Funktionen auch keine Strings >1024 Byte Länge liefert. Getestet habe ich das allerdings noch nicht. Sollte ich vielleicht mal.

Note Do not use. Consider using one of the following functions instead: StringCbPrintf, StringCbPrintfEx, StringCchPrintf, or StringCchPrintfEx. See Security Considerations.

Ich mag solche Pauschalaussagen nicht.

Das Beispiel gets zeigt allerdings, dass solche Warnungen notwendig sind, weil sonst Programmierer, die glaube zu wissen, was sie vermeintlich tun, auch weiterhin unsicheren Code schreiben.

Natürlich gibt es solche gefährlichen Fälle. Hier in diesem Fall ist es aber überschaubar, und das barsche Verbot daher unangemessen. Es sollte eher heißen: Use only if you know exactly what you're doing.

Weiter unten heißt es übrigens:

The maximum size of the buffer is 1,024 bytes.

Nanu, warum benutze ich wohl immer CHAR[1024] als Puffer für wsprintf()? 😉

Deine formatierten Strings sind 1 KiB groß?

Nein, viel kleiner.

Auf einem C64 wäre das aber sehr eng geworden 😜

Auf einem C64 hätte ich schon etwas Aufwand treiben müssen, um Strings mit einer Länge >256 Zeichen zu verarbeiten. C64-Programmierer waren von Haus aus sparsam und haben daher auch bei Stringoperationen meist nur ein 8bit-Indexregister verwendet. Das sorgte für eine natürliche Grenze.

Du kannst aber auch Annahmen über deine Stringlänge treffen und Funktionen verwenden, die dann garantiert keinen Buffer-Overflow erzeugen, z.B. snprintf

Das kannte ich tatschlich noch nicht, danke für den Tipp!

Es ist nicht alles schlecht am C-Standard.

Das habe ich auch nicht gesagt. Nicht einmal gedacht. 😉

Live long and pros healthy,
 Martin

--
Fische, die bellen, beißen nicht.