Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Warning, которого быть не должно.


Страницы:   1 2 3

Riply ©   (2008-06-10 21:48:00) 

Здравствуйте !
Вот скелет некой функции:

function Test: WideString;
var
Tmp : UNICODE_STRING;
begin
Result := '';
RtlInitUnicodeString(@Tmp, nil);
if NT_SUCCESS(............) then
 try
  ............
  if NT_SUCCESS(............) then
   begin
    // ............ Много кода, но Result в нем нигде не используется

    SetLength(Result, Tmp.Length shr SHR_WCHAR);
    if Tmp.Length > 0 then Move(Tmp.Buffer^, Pointer(Result)^, Tmp.Length);
   end;
 finally
  RtlFreeUnicodeString(@Tmp);
 end;
end;


Почему Delphi настырно выдает следующее предупреждение:
"[Pascal Warning] Alx_Unicode.pas(746): W1035 Return value of function 'Test' might be undefined" ?
Что такое может быть "не так" в коде, где точки ?
(Если его закоментировать (но только весь сразу, а не кусочками), то варнинг исчезает)


Тын-Дын   (2008-06-12 18:16:00) [21]


> Игорь Шевченко ©   (12.06.08 18:15) [33]
> Сузим просторы для поиска:function TestExtract: WideString;
> var  Tmp: UNICODE_STRING;begin  FillChar(Tmp, 8, 0);  Result
> := '';  if NT_SUCCESS(Us_HoldInteger_(@Tmp, 353453, 10,
> 8, 0)) then    Result := Us_ToStringW(@Tmp);  Us_FreeMem(@Tmp);
> end;Здесь тот же самый warning


То же самое - у меня при компиляции нет предупреждения.


Игорь Шевченко   (2008-06-12 18:15:00) [22]

Сузим просторы для поиска:

function TestExtract: WideString;
var
 Tmp: UNICODE_STRING;
begin
 FillChar(Tmp, 8, 0);
 Result := '';
 if NT_SUCCESS(Us_HoldInteger_(@Tmp, 353453, 10, 8, 0)) then
   Result := Us_ToStringW(@Tmp);
 Us_FreeMem(@Tmp);
end;


Здесь тот же самый warning


Тын-Дын   (2008-06-12 18:08:00) [23]

PS.
После единственного добавления inlineв функцию Us_HoldInteger_ предупреждение исчезло.


Тын-Дын   (2008-06-12 18:06:00) [24]

Не факт, конечно, что это единственное место, но видимо только эта функция участвует в цепочке вычислений.

Ещё можешь обратить внимание на функцию
function BlockMem_Append(const pMemBlock: PMEM_BLOCK; const pBuffer: Pointer; const BytesWrite: LongWord): NTSTATUS;{$IFNDEF SH_MEM_DEBUG}inline;{$ENDIF}

Эта функция не раскрывается в код по месту.


Тын-Дын   (2008-06-12 18:04:00) [25]


> Но правда особо и не смотрела т.к. удалось от нее избавиться
> :)


Что именно не понравилось?
В описании есть inline, в реализации нет.
После исправления предупреждение исчезает.


Riply   (2008-06-12 17:43:00) [26]

Sorry. Опять забыла выделить код :(


Riply   (2008-06-12 17:41:00) [27]

Некоторые результаты
Удалось довести подопытную функцию до такого вида:

function TestExtract: WideString;
var
Tmp, Empty: UNICODE_STRING;
RetStatus: NTSTATUS;
begin
Result := '';
RtlInitUnicodeString(@Tmp, nil);
try
 RetStatus := Um_GetMemory(Empty.Buffer, 1024);

 if RetStatus = STATUS_SUCCESS then
  try
   Empty.MaximumLength := 1024;
   Empty.Length := 0;
   RetStatus := Us_HoldLen_(@Tmp, Empty.Buffer, Empty.Length, 0);
  finally
   _Um_FreeMem(Empty.Buffer);
  end;

 if NT_SUCCESS(RetStatus) then Result := Tmp.Buffer;
finally
 Um_FreeMem(Tmp.Buffer);
end;
end;

Любые дальнейшие попытки "раскрытия" функций (у меня) ведут к исчезновению Warning`а.
Даже при замене в последней строчке Um_FreeMem(Tmp.Buffer)
на _Um_FreeMem(Tmp.Buffer) он исчезает.
Пока остается только смотреть на реализацию функций и медитировать,
что именно в них не нравиться компилятору :)

> [26] Тын-Дын © (12.06.08 02:06)
> Обрати внимание на определение и описание функции Us_HoldInteger_

Она оказалась не при чем. Ее удалось выбросить.
(Что именно тебе в ней не понравилось, пока не поняла.
Но правда особо и не смотрела т.к. удалось от нее избавиться :)

P.S.
Для перекомпиляции проекта с новой функцией надо изменить Sh_MemMng.inc
Он должен выглядеть так:
{$DEFINE SH_MEM_MNG}
{.$DEFINE SH_MEM_DEBUG}
{.$DEFINE SH_MEM_US_DEBUG}
{.$DEFINE SH_MEM_US_HEAP}


Тын-Дын   (2008-06-12 03:00:00) [28]


> Обрати внимание на определение и описание функции Us_HoldInteger_

Сорри, описание и реализацию...


Тын-Дын   (2008-06-12 02:06:00) [29]


> Riply ©   (12.06.08 01:07) [25]


Обрати внимание на определение и описание функции Us_HoldInteger_


Riply   (2008-06-12 01:07:00) [30]

> [24] Игорь Шевченко ©   (12.06.08 00:57)
> Как ты понимаешь, Warning можно проигнорировать, ничего страшного.
> Есть даже такие директивы {$WARNINGS OFF} .... {$WARNINGS ON}

Игорь, после такого утверждения,
"но на это стоит списывать в самой последний момент,
когда остальные варианты рассмотрены community и отброшены",
я стала относиться к этому Warning`у как к манне небесной,
ибо с его помощью я смогу найти очередную ошибку в коде.
Так что в данный момент времени я на этот код и не дышу, боюсь, что он исчезнет :)


Игорь Шевченко   (2008-06-12 00:57:00) [31]

Riply ©   (12.06.08 00:03) [22]

Как ты понимаешь, Warning можно проигнорировать, ничего страшного. Есть даже такие директивы {$WARNINGS OFF} .... {$WARNINGS ON}


Тын-Дын   (2008-06-12 00:12:00) [32]


> В принципе, если для дела, то можно.


Конечно, для дела. Разве найти глюки или баги - не дело?-)


> Код с стадии разработки. В нем много недописанных или просто
> тестируемых на данный момент функций.А также много лишнего
> и не относящегося к данному вопросу. (Я конечно попробую
> его еще почистить)


Да главное, чтобы нужный код можно было скомпилировать.
А в каком он виде - не столь важно...


Riply   (2008-06-12 00:03:00) [33]

> [20] Игорь Шевченко ©   (11.06.08 22:45)
> Ключевое слово - community.

Так... Достойно улепетнуть от этой работы опять не получилось :)
Придется попробовать "выполнить работу компилятора" и вынести
результаты на обсуждение :)

> [21] Тын-Дын ©   (11.06.08 23:17)
> Можно тоже посмотреть код?

В принципе, если для дела, то можно.
Есть несколько "но"
Код с стадии разработки.
В нем много недописанных или просто тестируемых на данный момент функций.
А также много лишнего и не относящегося к данному вопросу. (Я конечно попробую его еще почистить)
И последнее: единственное, что этот код делает - это показывает, что Warning мне не приснился :)

P.S.
Чуть не забыла: эффект проявляется под BDS 2006.


Тын-Дын   (2008-06-11 23:17:00) [34]


> вроде, удалось частично "повыдергивать" и собрать проект,
>  воспроизводящий этот "варнинг".Отправила Вам на e-mail,
>  для форума он великоват, да и ляпов там многовато для выкладывания
> :)


Можно тоже посмотреть код? Если да, то запрос на email в анкете высылаю.


Игорь Шевченко   (2008-06-11 22:45:00) [35]


> Возни с этим много


Да не очень много. Но тем не менее, ошибка с точки зрения компилятора может быть именно потому, что он-то разворачивает вызовы и анализирует получившийся код. Впрочем, с inline, как с недавно появившейся директивой, возможны и в компиляторе странности, но на это стоит списывать в самой последний момент, когда остальные варианты рассмотрены community и отброшены. Ключевое слово - community.


Riply   (2008-06-11 20:28:00) [36]

Вот первые выводы:

[4] Anatoly Podgoretsky был прав - дело именно в точках :)
Если серьезно, то в коде (который заменяли точки) среди прочего
использовались inline ф-ии. Именно inline и есть виновник данного эффекта.
Более точно сказать (привести пример кода и влияния inline на компиляцию), пока сложно.
Игорь Шевченко предлагает поступить так:
"Если есть желание помучиться, то разверни тела функций непосредственно в места
вызовов (проделай работу компилятора) и по получившемуся
коду компилятор может указать более точное место ошибки"

Возни с этим много, но если кому-то инресна более детальная информация (или просто этот вопрос),
то я попробую этим заняться.


Riply   (2008-06-11 17:56:00) [37]

Игорь,
вроде, удалось частично "повыдергивать" и собрать проект, воспроизводящий этот "варнинг".
Отправила Вам на e-mail, для форума он великоват, да и ляпов там многовато для выкладывания :)


Riply   (2008-06-11 15:48:00) [38]

> [16] Игорь Шевченко ©   (11.06.08 15:16)
> Вот и воспроизведи, а то гадание на кофейной гуще.

Хорошо.

> И потом, у тебя в коде процедуры так много строк, что она в пост не влезает ?

Неа, там хуже ситуация.
Вызываются процедуры из др. юнитов, которые вызывают процедуры,
(используют структуры) из "Дома, который построил Джек" :)


Игорь Шевченко   (2008-06-11 15:16:00) [39]

Riply ©   (11.06.08 15:00) [15]


> Тем не менее вполне реально собрать не очень большой проект,
>  воспроизводящий "неправильный варнинг".


Вот и воспроизведи, а то гадание на кофейной гуще.
И потом, у тебя в коде процедуры так много строк, что она в пост не влезает ?


Riply   (2008-06-11 15:00:00) [40]

> [10] Игорь Шевченко ©   (11.06.08 12:03)
> Неплохо бы было тебе самой закомментировать до тех пор,
> пока Warning не исчезнет, убрать последний комментарий и выложить код на форум

Игорь, я пыталась так сделать.
Выяснилось, что условие сохранения Warning`а
переводит код в разряд "не дышать" :)
Например, небольшие изменения в вызываемых процедурах (точнее в двух)
приводят к его исчезновению.
Тем не менее вполне реально собрать не очень большой проект, воспроизводящий "неправильный варнинг".
(повыдергивать процедуры, а если не получается, то юниты, где они сидят).
Если это представляет интерес, то я займусь "выдергиванием" :)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо