Несигурен код/тип
8 отговора
296 прегледа
Несигурен код/тип
Здравейте!
Когато си компилирам нещо с д7, което включва явно преобразуване на типа на pchar или @, компилатора ми дава съобщение за несигурен код или несигурен тип.
Въпросът ми е какво му е несигурното и как може да се напише същият код но сигурно?
Венцислав Александрийски
Когато си компилирам нещо с д7, което включва явно преобразуване на типа на pchar или @, компилатора ми дава съобщение за несигурен код или несигурен тип.
Въпросът ми е какво му е несигурното и как може да се напише същият код но сигурно?
Венцислав Александрийски
Включил си си .NET предупрежденията на компилатора
Unsafe code warnings in Delphi
Starting with Delphi 7, the compiler includes three new warnings that can help you locate code that is non-portable (i.e. it uses a deprecated language feature or type), or unsafe in the .NET Framework. In the .NET Framework, "unsafe" simply means that the code cannot be verified by the static analysis performed by the CLR when the code is loaded. The compiler can warn about the usage of unsafe types, unsafe code, and unsafe casts.
Unsafe types
# PChar, PWideChar, and PAnsiChar
# Untyped pointers
# Untyped var and out parameters
# File of <type>
# Real48
# Variant records (records containing overlapping fields)
Unsafe code
# Absolute variables
# Addr(), Ptr(), Hi(), Lo(), Swap() standard procedures
# BlockRead(), and BlockWrite()
# Fail()
# GetMem(), FreeMem(), ReallocMem()
# inline assembler
# the @ operator
Unsafe casts
# Casting an object instance to a type that is not an ancestor or descendent of the instance type
# Casting a record type to anything else
Starting with Delphi 7, the compiler includes three new warnings that can help you locate code that is non-portable (i.e. it uses a deprecated language feature or type), or unsafe in the .NET Framework. In the .NET Framework, "unsafe" simply means that the code cannot be verified by the static analysis performed by the CLR when the code is loaded. The compiler can warn about the usage of unsafe types, unsafe code, and unsafe casts.
Unsafe types
# PChar, PWideChar, and PAnsiChar
# Untyped pointers
# Untyped var and out parameters
# File of <type>
# Real48
# Variant records (records containing overlapping fields)
Unsafe code
# Absolute variables
# Addr(), Ptr(), Hi(), Lo(), Swap() standard procedures
# BlockRead(), and BlockWrite()
# Fail()
# GetMem(), FreeMem(), ReallocMem()
# inline assembler
# the @ operator
Unsafe casts
# Casting an object instance to a type that is not an ancestor or descendent of the instance type
# Casting a record type to anything else
Re: Несигурен код/тип
В последните години използването на пойнтери се смята за несигурна и лоша практика от повечето фирми и имена
с малко влакче композирам патките в реката
с малко влакче композирам патките в реката
Re: Несигурен код/тип
Вече ти казаха причината, а аз мога да добавя само, че ако си сигурен какво правиш (най-вероятно си) и това съобщение те дразни, можеш да го изключиш от Project | Options | Compiler Messages
Re: Несигурен код/тип
Здравей!
Би ли ми обяснил малко по-подробно относно проблема с пойнтерите и как се решава?
Венцислав Александрийски
Би ли ми обяснил малко по-подробно относно проблема с пойнтерите и как се решава?
Венцислав Александрийски
Работата с указатели противоречи на ООП
Защото компилаторът не може да направи формален контрол на коректността на ползването на паметта.
(Да не си помислиш, че Ясер Арафат има нещо против!)
(Да не си помислиш, че Ясер Арафат има нещо против!)
Re: Несигурен код/тип
2 Венцислав Александрийски
Горе-долу така...
При една последваща операция със стойността (pp^)
ще се получи нещо, което програмиста евентуално(!)
знае какво може да е, но компилатора не.
procedure TForm1.Button1Click(Sender: TObject);
var
p1,p2:^integer;
pp:^double;
begin
//компилатора знае: да се заделят 4 байта от паметта
//стойността там се тълкува като четибайтово цяло със знак
new(p1);
//компилатора знае: да се заделят 8 байта от паметта
//стойността там се тълкува като число с плаваща запетая
new(pp);
//компилатора знае: p1 сочи към 4 байта
//там да се запише цялото число 123
p1^:=123;
//компилатора знае: p1 сочи към 4 байта и p1 сочи към 4 баита
//сега и p2 ще сочи към същите 4 байта които и p1
p2:=p1;
//компилатора знае: pp и p1 сочат към различни по размер и смисъл структури
//така че категорично отказва да компилира
//Incompatible types: 'Integer' and 'Double'
pp:=p1;
//за да мине операцията (pp:=p1) може така:
//компилатора знае: pp да сочи там където сочи и p1
//компилатора НЕ знае аджеба този програмист какво иска
//да прави по натам. Хем взима данни от структура която е 4 байта
//и се тълкува като цяло число, хем се опитва да интерпретира това като
//структура която е 8 байта и се тълкува като число с плаваща запетая
//в крайна сметка компилатора се съгласява, но "с особено мнение" по въпроса
//демек тук има нещо гнило, но ако мислиш че знаеш какво правиш...
//Unsafe type 'Pointer'
pp:=pointer(p1);
end;
Горе-долу така...
При една последваща операция със стойността (pp^)
ще се получи нещо, което програмиста евентуално(!)
знае какво може да е, но компилатора не.
Re: Несигурен код/тип
>>>>ще се получи нещо, което програмиста евентуално(!)
>>>знае какво може да е, но компилатора не.
Ами именно за това са Unsafe type вече - едно за проблемите с memory leaks, другото е, че кода става тотално нечетим - не само за другите ами и за този който го е писал след време. Да не говорим, че малко или много вече е безмислено при ползването на обектно ориентирани езици които добре "прикриват" операциите с указатели.
Това май беше директно по темата ама тук дойде
---

>>>знае какво може да е, но компилатора не.
Ами именно за това са Unsafe type вече - едно за проблемите с memory leaks, другото е, че кода става тотално нечетим - не само за другите ами и за този който го е писал след време. Да не говорим, че малко или много вече е безмислено при ползването на обектно ориентирани езици които добре "прикриват" операциите с указатели.
Това май беше директно по темата ама тук дойде
---
Re: Несигурен код/тип
>>Ами именно за това са Unsafe type вече ...
Ами човека точно това питаше:
"Въпросът ми е какво му е несигурното..."
Това беше просто илюстрация какво се има предвид
под "несигурно".
Ами човека точно това питаше:
"Въпросът ми е какво му е несигурното..."
Това беше просто илюстрация какво се има предвид
под "несигурно".