Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Warning] Unit.pas(747): Unsafe code 'String index' ???? (https://www.delphipraxis.net/6016-%5Bwarning%5D-unit-pas-747-unsafe-code-string-index.html)

bundy 26. Jun 2003 12:30


[Warning] Unit.pas(747): Unsafe code 'String index' ????
 
Was bedeutet

[Warning] Hauptform_Unit.pas(747): Unsafe code 'String index to var param'

:coder: :coder: :coder: :coder: :coder:

Christian Seehase 26. Jun 2003 12:47

Moin Bundy,

bist Du schon mal auf die Meldungszeile gegangen und hast F1 gedrückt?
(mit Meldungszeile meine ich nicht die genannte 747, sondern die in der dies steht)

Luckie 26. Jun 2003 12:49

Und zeig mal Zeile 747 und was so dazu gehört.

sakura 26. Jun 2003 12:49

Sei mal so lieb und poste den Code, wo die Fehlermeldung kam.

...:cat:...

bundy 26. Jun 2003 13:17

Delphi-Quellcode:
for i:= 1 to Length(Text1) do
  begin
  if Text1[i]=#35 then Text1[i]:=#13;
  if Text1[i]=#187 then Text1[i]:=#10;
  end;
[Edit=Sakura]Delphi-Tags eingefügt.[/Edit]

Luckie 26. Jun 2003 13:22

Schon mal an StringReplace gedacht?

sakura 26. Jun 2003 13:38

Wie ist Text1 definiert?

...:cat:...

bundy 26. Jun 2003 13:49

Text1 : widestring;


Er compiliert das Programm aber er sagt ebeb immer diesen Fehler.

Muss man Variablen wieder freigeben oder ?.

r_kerber 26. Jun 2003 13:54

Zunächst ist es erst mal nur eine Warnung und kein Fehler. Ich vermute, diese steht in Zusammenhang mit der Entwicklung von .net-Anwendungen. Für gesicherten Code sind dafür doch ein paar Restriktionen zu beachten, auf die nur hingewiesen wird.

Christian Seehase 26. Jun 2003 14:08

Moin Zusammen,

vielleicht könnte ja mal schlicht jemand der D7 hat dieses Warning reproduzieren, im unteren Fenster, wo die Meldungen stehen, die Warning Zeile markieren und F1 drücken.
Dann sollte man ja eine klärende Hilfeseite bekommen.

bundy 26. Jun 2003 14:20

Compiler Errors: Delphi
Unsafe code '<element>'

List of compiler error messages

You have used a data type or operation for which static code analysis cannot prove that it does not overwrite memory. In a secured execution environment such as .NET, such code is assumed to be unsafe and a potential security risk.

Christian Seehase 26. Jun 2003 14:32

Moin Bundy,

bei HugeStrings, also Strings ohne Längenangabe in der Deklaration, wird beim Zugriff auf den Index [...] keine Bereichsüberprüfung gemacht, man kann also mit dem Index auf Bereiche zugreifen, die hinter den eigentlichen Daten des Strings liegen.
Damit ist dann also der Zugriff auf Speicherbereiche möglich die ansonsten eigentlich nicht im Zugriff sind.
(soviel zum Thema: Sichere Stringverwaltung in Delphi ;-) )

Dies wird für .NET als unsicher angesehen, und deshalb mit einem Warning kenntlich gemacht.

Vielleicht hilft ja Luckies Vorschlag, StringReplace zu benutzen.

bundy 27. Jun 2003 10:52

Was heist das jezt genau ?

was bewirkt REPLACESTRING ? für dummys :wall:

Christian Seehase 27. Jun 2003 11:01

Moin Bundy,

schau Dir doch einfach erstmal StringReplace in der Hilfe an.
Ist dort eigentlich ausreichende kommentiert.

Luckie 27. Jun 2003 11:06

Das heißt folgendes: Jetzt wird es etwas länger. *tief.luft.hol*

Nehmen wir an du hast zwei Variablen auf dem Stack abgelegt:
Code:
v2
v1
Jetzt hängst du an v2 etwas hintendran. Der Speicher Bereich für v2 ist aber nbicht groß genug, da keine Bereichsüberprüfung statt findet, weder vom Compiler zur Kompilierzeit, noch vom System zu Laufzeit, wird v1 überschrieben. Geschieht das versehentlich, ist das nicht weiter schlimm, dein Programm wird sich wohl nur verabschieden, da wenn v1 eine Rücksprungadresse enthält, dein Programm an einen blödsinnigne Punkt zurückspringt.

Jetzt kann man das aber auch gezielt machen. Und wenn in v1 eine Rücksprungadresse liegt, kann ich diese mit einer neuen Rückspringadresse überschreiben. Und diese neue Rücksprungadresse zeigt auf bösartigen Code, der vorher im Speicherbereich deines Programmes abgelegt wurde. Deinem Programm und Windows ist es egal, wohin zurückgesprungen wird, denn beide merken nicht, dass an die falsche Adresse zurückgesprungen wird. Folge: Dein programm führt den bösartigen Code aus, ohne es zu merken. In diesem Zusammenhang spricht man auch von einem sogenannten BufferOverflow.

bundy 27. Jun 2003 11:06

Meine Hilfe ist in Englisch. (lol)

dachte mir Ihr könntet mir das erklären.
Sorry für die Frage. :oops:

Luckie 27. Jun 2003 11:13

Delphi-Quellcode:
type
  TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string
S: String in dem ersetzt werden soll.
Oldpattern: String der ersetzt werden soll.
NewPattern: Durch was erstezt werden soll.
Flag: Wie ersetzt werden soll.

Lies auch noch mal mein letztes Posting auf der ersten Seite, ich habe mir so viel Mühe gegeben. :?

Es gibt bei Borland übrigens eine Deutsche Hilfe zu D6 Personal. Ups, du hast ja D7 Professional. Warum hast du dir keine deutsche Version gekauft, wenn du mit englisch nicht klar kommst? :roll:

bundy 27. Jun 2003 11:19

:hello: JO danke für die Hilfe. :hello:

Ich dachte ich lerne English. :warn:


:bounce2: :bounce2: Danke noch mal :bounce2: :bounce2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz