Несигурен код/тип

8 отговора 296 прегледа
#1

Несигурен код/тип

Здравейте!
Когато си компилирам нещо с д7, което включва явно преобразуване на типа на pchar или @, компилатора ми дава съобщение за несигурен код или несигурен тип.
Въпросът ми е какво му е несигурното и как може да се напише същият код но сигурно?
Венцислав Александрийски

Отговор
в отговор на v_automation #2

Включил си си .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

Отговор
в отговор на v_automation #3

Re: Несигурен код/тип

В последните години използването на пойнтери се смята за несигурна и лоша практика от повечето фирми и имена

с малко влакче композирам патките в реката
Отговор
в отговор на v_automation #4

Re: Несигурен код/тип

Вече ти казаха причината, а аз мога да добавя само, че ако си сигурен какво правиш (най-вероятно си) и това съобщение те дразни, можеш да го изключиш от Project | Options | Compiler Messages

Отговор
в отговор на karasko #5

Re: Несигурен код/тип

Здравей!
Би ли ми обяснил малко по-подробно относно проблема с пойнтерите и как се решава?
Венцислав Александрийски

Отговор
в отговор на v_automation #6

Работата с указатели противоречи на ООП

Защото компилаторът не може да направи формален контрол на коректността на ползването на паметта.
(Да не си помислиш, че Ясер Арафат има нещо против!)

Отговор
в отговор на v_automation #7

Re: Несигурен код/тип

2 Венцислав Александрийски


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^)
ще се получи нещо, което програмиста евентуално(!)
знае какво може да е, но компилатора не.

Отговор
в отговор на Eмил #8

Re: Несигурен код/тип

>>>>ще се получи нещо, което програмиста евентуално(!)
>>>знае какво може да е, но компилатора не.

Ами именно за това са Unsafe type вече - едно за проблемите с memory leaks, другото е, че кода става тотално нечетим - не само за другите ами и за този който го е писал след време. Да не говорим, че малко или много вече е безмислено при ползването на обектно ориентирани езици които добре "прикриват" операциите с указатели.

Това май беше директно по темата ама тук дойде

---
Отговор
в отговор на PhantomAS #9

Re: Несигурен код/тип

>>Ами именно за това са Unsafe type вече ...

Ами човека точно това питаше:
"Въпросът ми е какво му е несигурното..."
Това беше просто илюстрация какво се има предвид
под "несигурно".

Отговор