Forum: PC-Programmierung strcpy vs. strcpy_s


von gast (Gast)


Lesenswert?

strcpy vs. strcpy_s

Wenn man in Visual Studio C Programmiert bekommt man immer eine warning 
wenn man strcpy verwendet.  (The function or variable may be unsafe)

Hab das bis jetzt noch nie gesehen dieses strcpy_s, hat da jemand 
Informatioen wie das implementiert ist ?

thx

von Sven P. (Gast)


Lesenswert?

Ist (zur Zeit noch) so ein Tick von Microsoft... Google.

von tata (Gast)


Lesenswert?

Mit strcpy_s bindest du dich an MS und einige wenige andere Libs,
als Alternative wäre strncpy zu nennen, dass ist in der string.h
bzw cstring.h vorhanden und gehört vermutlich zum C-Standard.

http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/strncpy.html
http://www.cplusplus.com/reference/clibrary/cstring/strncpy.html

von (prx) A. K. (prx)


Lesenswert?

Viele dieser String-Funktionen sind saublöd konstruiert und sorgen seit 
Jahrzehnten massgeblich für die berüchtigten Buffer-Overflows.

Dass strcpy() über das Ende vom Ziel hinaus schreibt ist einigermassen 
offensichtlich. Der Tip mit strncpy ist jedoch auch eine Falle. Denn 
wenn das "n" erreicht wird ist kein \0 hinten dran, was von vielen 
Programmierern vergessen wird, mit entsprechend hässlichen Folgen. Bei 
strncat wiederum vergisst man gern, dass sich das "n" nicht aufs Ziel 
sondern auf die Quelle bezieht und folglich den Zielpuffer auch wieder 
nicht absichert.

Daher gibt es mittlerweile einige Extrafunktionen um die übelsten Löcher 
zu stopfen und Microsoft strcpy_s ist eine davon. Aber m.E. sollte man 
für einigermassen sicheres Programmieren diese ganze Lib entweder 
garnicht oder nur mit grosser Vorsicht benutzen. Ein Ansatz besteht 
darin, sich auf Basis von ein paar solcher Funktionen eigene Funktionen 
zu definieren, die man dann konsequent an Stelle der Originale 
verwendet. Und so ist man dann auch nicht von mehr oder weniger 
proprietären Erweiterungen abhängig.

Besser ist es freilich, wenn man gleich C++ mit der entsprechenden 
Stringverarbeitung verwendet.

von Arc N. (arc)


Lesenswert?

tata wrote:
> Mit strcpy_s bindest du dich an MS und einige wenige andere Libs,
> als Alternative wäre strncpy zu nennen, dass ist in der string.h
> bzw cstring.h vorhanden und gehört vermutlich zum C-Standard.

Diese _s-Varianten werden sehr wahrscheinlich zum kommenden Standard 
gehören.
ISO/IEC TR 24731
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1225.pdf

von tata (Gast)


Lesenswert?

>> Mit strcpy_s bindest du dich an MS und einige wenige andere Libs,
>> als Alternative wäre strncpy zu nennen, dass ist in der string.h
>> bzw cstring.h vorhanden und gehört vermutlich zum C-Standard.
> Diese _s-Varianten werden sehr wahrscheinlich zum kommenden Standard
> gehören.
> ISO/IEC TR 24731
>
Oh, interessant, wusste ich noch gar nicht.

@A. K. (prx)
Stimmt schon, ist halt wie immer in C, man muss wissen was man tut. ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.