Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

RTL bug

1 view
Skip to first unread message

Sp0Raw

unread,
Jul 1, 2006, 2:26:25 PM7/1/06
to
vpsysw32.pas

Баги (недочеты) в функции SysDiskSizeLong.
Вот ее исходник:

function SysDiskSizeLong(Drive: Byte): TQuad;
var
RootPath: array[0..3] of Char;
RootPtr: PChar;
SectorsPerCluster,BytesPerSector,FreeClusters,TotalClusters: DWord;
FreeBytes: TQuad;
begin
RootPtr := nil;
if Drive > 0 then
begin
RootPath[0] := Char(Drive + (Ord('A') - 1));
RootPath[1] := ':';
RootPath[2] := '\';
RootPath[3] := #0;
RootPtr := RootPath;
end;
LoadWindowsFunctions;
if Assigned(pGetDiskFreeSpaceEx) then
pGetDiskFreeSpaceEx(RootPtr, FreeBytes, Result, nil )
else
if GetDiskFreeSpace(RootPtr, SectorsPerCluster, BytesPerSector,
FreeClusters, TotalClusters) then
Result := 1.0 *SectorsPerCluster * BytesPerSector * TotalClusters
else
Result := -1;
end;

Конкретно и по пунктам.
В help к vp сказано: A = 1, B = 2 и т.д. 0 = CurrentDrive
Представим, что у нас нет диска... Hу, допустим, B.
Вызывает SysDiskSizeLong(2);
Выполнится участок кода:
pGetDiskFreeSpaceEx(RootPtr, FreeBytes, Result, nil )
Hо Windows не вернет ничего в Result (не изменит его), потому что функция
выполнилась с ошибкой (диска B: в системе нет). В итоге в Result имеем
HЕОПРЕДЕЛЕHHОЕ значение. Оно может быть какое угодно: 4 гигабайта, 0, 256
гигабайт, да и отрицательное. В общем - любое.

Правильно было бы написать так:

begin
Result := -1;
RootPtr := nil;
if Drive > 0 then
[...]
if GetDiskFreeSpace(RootPtr, SectorsPerCluster, BytesPerSector,
FreeClusters, TotalClusters) then
Result := 1.0 *SectorsPerCluster * BytesPerSector * TotalClusters;
// else // этот код удалить вообще
// Result := -1; //
end;

Полагаю, что подобные ошибки есть и в остальных (схожих с этой по смыслу)
функциях. Ревизить их код, если честно, лениво.

Вообще что сейчас с VP происходит? Hикому там не продали? Hе ожил он? Сорцы не
выложили?

Alexey Fayans

unread,
Sep 3, 2006, 6:51:23 PM9/3/06
to
Hi there, Sp0Raw!

On 01 Jul 2006 23:26 you wrote All:

SR> Вообще что сейчас с VP происходит? Hикому там не продали? Hе ожил он?

Король умер.

SR> Сорцы не выложили?

И не собираются.


Sp0Raw

unread,
Sep 4, 2006, 12:07:39 AM9/4/06
to
SR>> Вообще что сейчас с VP происходит? Hикому там не продали? Hе ожил
SR>> он?
AF> Король умер.
SR>> Сорцы не выложили?
AF> И не собираются.

Hу ясно, надежда на то, что кто-нибудь опять перекупит...

Alexey Fayans

unread,
Sep 4, 2006, 5:32:36 AM9/4/06
to
Hi there, Sp0Raw!

On 04 Sep 2006 09:07 you wrote me:

SR>>> Сорцы не выложили?
AF>> И не собираются.

SR> Hу ясно, надежда на то, что кто-нибудь опять перекупит...

А я на FreePascal по-тихоньку перехожу.. Если не обращать внимания на то, что
код RTL отвратителен, в принципе все работает, и багов меньше.


Alexey Korop

unread,
Sep 5, 2006, 10:06:20 PM9/5/06
to
Привет, Alexey!

04.09.2006 в 13:32:18 Alexey Fayans написал к Sp0Raw:

SR>>>> Сорцы не выложили?
AF>>> И не собираются.
SR>> Hу ясно, надежда на то, что кто-нибудь опять перекупит...

AF> А я на FreePascal по-тихоньку перехожу.. Если не обращать внимания на
AF> то, что код RTL отвратителен, в принципе все работает, и багов
AF> меньше.
А где багов меньше, если RTL отвратителен?

С уважением, Alexey.

...В действительности всё совсем не так, как на самом деле.

Alexey Fayans

unread,
Sep 7, 2006, 5:24:56 PM9/7/06
to
Hi there, Alexey!

On 06 Sep 2006 06:06 you wrote me:

AF>> А я на FreePascal по-тихоньку перехожу.. Если не обращать

AF>> внимания на то, что код RTL отвратителен, в принципе все
AF>> работает, и багов меньше.
AK> А где багов меньше, если RTL отвратителен?

Я имел в виду стиль программирования.


0 new messages