в твоём случае это не Warning, а Hint.
в твоём случае это не Warning, а Hint.
Нет. Стопроцентный warning (подсвечено жёлтым, я науськал MSEIde выделять хинты зелёным а вонинги жёлтым).
(я использую фпц 2.6.4 для сборки 32-битной версии и 3.1.1 для сборки 64-битной)
исходя из твоего фикса, ты утверждаешь, что при перемножении 64-битного на 32-битное, результат будет 32-битный?
ЕМНИП, Паскаль при операциях с целыми берёт наименьшую разрядность из двух операндов - так сложилось исторически. Поэтому надо кастовать мЕньший операнд к бОльшему, чтобы не получить на выходе тыкву.
В случае (k * f_Size) само умножение - пофиг, там не бывает больше 128К, но потом надо это значение скастовать к 64-битному, чтобы не порезало операцию сложения.
Потом мне говорят: если первый операнд - PByte, то ничего не порежет. а, наоборот, расширит до разрядности указателя.
Твой пример - 
лажа, там переполнения в умножении прут и всё развозит (оба результата одинаковые, но ОБА некорректные).
Причём, проверять надо не какой Self на душу положит, а большой указатель > $ffffffff, причём, собирая под 64 бита.
Но... Что самое смешное - 
все варианты работают корректно. Даже (pointer(ptruint(bigptr) + k * f_Size));
ИЧСХ, вонинги прут только при сборке под 32 бита. Кросс-компилятор x64 в этих местах молчит.
- Код: Выделить всё
- program project1;
 
 {$mode objfpc}{$H+}
 
 uses
 {$IFDEF UNIX}
 cthreads,
 {$ENDIF}
 sysutils,
 Classes
 { you can add units after this };
 {$rangechecks on}
 {$overflowchecks on}
 
 type
 TMyObject = class(TObject)
 public
 k, f_size : longint;
 bigptr: pointer;
 function Alloc: Pointer;
 function Alloc2: Pointer;
 end;
 
 function TMyObject.Alloc: Pointer;
 begin
 Result:=(pointer(ptruint(bigptr) + k * f_Size));
 end;
 
 
 function TMyObject.Alloc2: Pointer;
 begin
 Result:=(pointer(ptruint(bigptr) + ptruint(k * f_Size)));
 end;
 
 var
 m : TMyObject;
 begin
 m := TMyObject.Create;
 m.bigptr:= pointer({$ifdef cpu64}$100000000{$else}$400000{$endif});
 m.k := 2;
 m.f_size:= 2;
 writeln(sizeof(pointer));
 writeln(IntToHex(PtrUInt(m.bigptr), 16));
 writeln(IntToHex(PtrUInt(m.Alloc), 16));
 writeln(IntToHex(PtrUInt(m.Alloc2), 16));
 end.
d:\stuff\tmp>c:\fpc\2.6.4\bin\i386-win32\ppcrossx64 -Twin64 project1.pas
Free Pascal Compiler version 2.6.4 [2014/03/06] for x86_64
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Win64 for x64
Compiling project1.pas
Linking project1.exe
45 lines compiled, 0.2 sec , 174528 bytes code, 42852 bytes data
d:\stuff\tmp>project1
8
0000000100000000
0000000100000004
0000000100000004