Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

11

28.08.2008, 21:06

hhmmmm ok, aber ich glaube bei strcopy o.ä. verwendet er für die strings keinen dynamisch angeforderten speicher. habe jetzt mal nen macro geschrieben, das noch ein sizeof einbaut

C-/C++-Quelltext

1
#define strcpy(a, b) (strcpy_s((a), sizeof((a)), (b)))

->von knapp 900 warnungen auf 400 runter

allerdings kapiert der compiler es nich so ganz und gibt trotzdem noch weiterhin ne pragma warnung aus, deshalb noch

C-/C++-Quelltext

1
#pragma warning(disable:4995)

->von 400 warnungen auf ~40 runter

dann noch

C-/C++-Quelltext

1
#define vsprintf vsprintf_s


soweit so gut ;) ich denke mal, es ist nicht grade die perfekte lösung, aber für den arbeitsaufwand doch schonmal nich schlecht und macht es auch schon etwas sicherer

jetzt habe ich mir noch ein macro für sprintf geschrieben, problem hierbei ist nur, dass es eben nich immer gleich viele parameter hat ^^

C-/C++-Quelltext

1
#define sprintf(a, b, c) (sprintf_s((a), sizeof((a)), (b), (c)))


also weniger als 3 parameter hats nie (macht dann auch wenig sinn ^^), nur manchmal kommt

warning C4002: too many actual parameters for macro 'sprintf'

was genau wird denn hier dann gemacht? wird das macro einfach ignoriert, oder die 3 parameter ersetzt, und der rest halt so wie es da steht auch? (würde das problem auch lösen)?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

12

28.08.2008, 21:15

Also bevor du so rumbasteln gehst, würde ich doch einfach die Warnings auf ein niedrigeres Level schalten, wenn sie dich stören.

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

13

28.08.2008, 21:28

ach naja, ist vielleicht ja ganz praktisch, bin jetzt bei 9 warnings angelangt...
8 davon für fopen, daraus soll fopen_s werden, was allerdings einen FILE** parameter verlangt oO bin ja noch n ziemlicher anfänger, ist das ein zeiger auf nen zeiger auf nen FILE? ^^ und wenn ja, wo is da der sinn?

sobald alle warnings weg sind, und die funktionen durch sicherere ersetzt, lad ich alles mal hoch... sind ja auch schon die ganzen errors raus von den for-schleifen etc... erspart den leuten mit einer alten auflage vielleicht etwas arbeit...

EDIT: so, fopen_s auch überall eingebaut... letzte warnung (jedenfalls im debugmodus ^^)

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

14

28.08.2008, 22:14

hier war mal ein ganz toller link :P

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

28.08.2008, 22:55

Zitat von »"n0_0ne"«

C-/C++-Quelltext

1
#define strcpy(a, b) (strcpy_s((a), sizeof((a)), (b)))


soweit so gut ;) ich denke mal, es ist nicht grade die perfekte lösung, aber für den arbeitsaufwand doch schonmal nich schlecht und macht es auch schon etwas sicherer


:shock:

sicherer? ich würde mal sagen du hast extremes glück wenn das nicht abstürzt. schonmal überlegt was sizeof((a)) bedeutet!? wenn a ein zeiger is (und das ist es wohl meistens, weil die funktion immerhin an der stelle einen zeiger erwartet), dann wird das mächtig in die hose gehen.

_CRT_SECURE_NO_DEPRECATE definieren und gut ist.

warnings haben nen sinn. man sollte nicht einfach alles daran setzen sie wegzubekommen, sondern erstmal besser den ursachen nachgehen...

Zitat von »"n0_0ne"«

warning C4002: too many actual parameters for macro 'sprintf'

was genau wird denn hier dann gemacht? wird das macro einfach ignoriert, oder die 3 parameter ersetzt, und der rest halt so wie es da steht auch? (würde das problem auch lösen)?


sprintf is ne funktion mit ner variablen anzahl an parametern. mit dem makro wirst du da nicht weit kommen. wenn dann wirst du da auf variadic macros setzen müssen (ist zwar nonstandard, aber da du eh die _s funktionen verwendest schätze ich mal dass das egal ist).

anyway. wenn du meinen rat willst: ich würd den ganzen #define kram möglichst schnell wieder loswerden...


Zitat von »"drakon"«

[...] aber i.d.R ist es nicht sonderlich gut die Grösse eines Arrays mittels sizeof zu ermitteln. Vor allem funktioniert das mit dynamisch angefordertem Speicher nicht mehr.


es is kein problem mit sizeof die größe eines arrays zu bestimmen, da spricht nichts dagegen.
das problem ist, dass viele denken das arrays und zeiger das gleiche sind. sind sie aber nicht. auch wenn man den namen eines arrays wie einen zeiger verwenden kann. und das führt dann genau zu sowas wie dem define da oben...
aber ja, du hast recht. bei dynamisch angefordertem speicher funzt das nicht, eben weil da kein array zurückkommt ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

16

29.08.2008, 00:17

Zitat

es is kein problem mit sizeof die größe eines arrays zu bestimmen, da spricht nichts dagegen.

Joa,habe auch nicht gesagt, dass es richtig angewendet ein Problem ist.
Aber wegen dem, was du noch geschrieben hast, ist es keine gute Idee. Im übrigen ist es ja eh Sinnfrei das für ein statisches Array zu machen, da dort die Grösse zur Kompilierzeit bekannt ist und man somit das sizeof auch mit einer konstanten erstzen kann.

EDIT:

Zitat

auch wenn man den namen eines arrays wie einen zeiger verwenden kann.

Auch nicht ganz. :)

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

17

29.08.2008, 10:08

naja, das einzige, was ich da jetzt mit nem macro gelöst habe, ist jetzt strcpy, weils eben einfach zu oft vorkam ^^
und ich habe auch mal kurz n bisschen getestet, obs abstürtzt oder nich, is aber nix passiert, allerdings auch nur bei den ersten 3 übungsprogrammen :P weiter bin ich noch garnich xD

einer von euch, der nen größeres projekt damit gemacht hat, könnte ja mal kurz die dateien austauschen, und gucken obs geht, oder nich... falls es dann wirklich abstürtzen sollte, oder merklich langsamer wird, oder sonstwas, nehm ich den link da schnell wieder raus ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

29.08.2008, 10:17

da brauchts gar kein größeres projekt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <string.h>

#define strcpy(a, b) (strcpy_s((a), sizeof((a)), (b)))


void foo(char* dest)
{
  strcpy(dest, "hallo welt");
}

int main()
{
  char test[11];

  foo(test);

  return 0;
}


das reicht schon...

19

30.09.2008, 08:46

@No_One
dot hat Recht mit seinem Beispiel zu Deinem Macro.

Beispiel :

char buf[256];
strcpy_s(buf, sizeof(buf), "irgendeintext"); // sizeof(buf)=256

Stattdessen ist folgendes FALSCH :

char* buf = new char[256]; // sizeof(buf)=4



Schau Dir den Befehl tbGetD3DFormatString() in tbUtils.cpp an.
Dort findest Du

case D3DFMT_R8G8B8: strcpy(pcOut, "R8G8B8"); break;

Dein Macro gibt für die Länge immer 4 zurück, weil pcOut ein Zeiger ist.
Das stürzt dann zwar im ersten Moment nicht ab, weil anstatt der 6 Buchstaben nur 3 kopiert werden (+ Nullbyte am Ende ergibt die max. erlaubten 4).
Aber mit dem Ergebnis dürftest Du nicht zufrieden sein.

Eine Lösung wäre :

tbGetD3DFormatString(D3DFORMAT Format, char* pcOut, int laengeOut)

case D3DFMT_R8G8B8: strcpy_s(pcOut, laengeOut, "R8G8B8"); break;

Nach Durchsicht der Tribase-Texte scheint tbGetD3DFormatString() aber das einzige Mal zu sein, wo David einen Zeiger benutzt.
Die anderen Male hat er immer ein array geschrieben.

almidi

Werbeanzeige