Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];

Вниз

Warning, которого быть не должно.   Найти похожие ветки 

 
Riply ©   (2008-06-10 21:48) [0]

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

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" ?
Что такое может быть "не так" в коде, где точки ?
(Если его закоментировать (но только весь сразу, а не кусочками), то варнинг исчезает)


 
DrPass ©   (2008-06-11 00:44) [1]


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

А если так:
if Tmp.Length > 0 then
begin
 SetLength(Result, Tmp.Length shr SHR_WCHAR);
 Move(Tmp.Buffer^, Pointer(Result)^, Tmp.Length);
end;


 
Riply ©   (2008-06-11 00:57) [2]

> [1] DrPass ©   (11.06.08 00:44)
> А если так:

Неа. Не помогло.
Просто в "точках" так мого всего, что лень(да и нереально) идти вручную.
Мне хочется понять, хотя бы какого типа безобразничество я там должна была совершить для такого эфекта :)
Не могу себе представить. Да и первой строкой результат задается: Result := "";
Пока оставила это дело до лучших времен, но процедуру не уничтожаю (хотя она уже не нужна).

P.S.
А может Delphi уже пора перезагрузить ?


 
Игорь Шевченко ©   (2008-06-11 09:50) [3]

нету warning"а не обманывай


 
Anatoly Podgoretsky ©   (2008-06-11 09:51) [4]

> Игорь Шевченко  (11.06.2008 9:50:03)  [3]

Дело наверно в точках.


 
Тын-Дын ©   (2008-06-11 09:59) [5]

Возможно с tmp.Buffer какие-то действия выполняются, в результате чего и происходитпредупреждение.


 
Riply ©   (2008-06-11 11:43) [6]

> [3] Игорь Шевченко ©   (11.06.08 09:50)
> нету warning"а не обманывай

Я уже как-то говорила, что могу чего-то не знать,
не понимать или заблуждаться, но не подтасовывать факты.
Как доказательство "не вранья" могу выслать код (его много).
Но так как он в разаработке, то "в нем черт ногу сломит" - было бы мягким его описанием :)

>  [4] Anatoly Podgoretsky ©   (11.06.08 09:51)
> Дело наверно в точках.

>  [5] Тын-Дын ©   (11.06.08 09:59)
> Возможно с tmp.Buffer какие-то действия выполняются, в результате чего и происходитпредупреждение

Там, действительно много преобразований с tmp.Buffer.
Для него идут операции с памятью средствами Nt (через Heap) и обычным ReallocMem.
Цель данной процедуры была в проверке корректности преобразований структур
с различными способами выделения и освобождения памяти друг в друга.
У меня было предположение, что он оказывается неопределенным,
но ведь второй строкой : RtlInitUnicodeString(@Tmp, nil) мы его инициализируем...

P.S.
Это все было затеяно для попытки уйти от зависимости от способа выделения памяти Nt-функциями.


 
Игорь Шевченко ©   (2008-06-11 11:49) [7]

Riply ©   (11.06.08 11:43) [6]


> Я уже как-то говорила, что могу чего-то не знать,
> не понимать или заблуждаться, но не подтасовывать факты.
>


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

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


Здесь Warning-а нету.


> Что такое может быть "не так" в коде, где точки ?


Например Exit


 
Игорь Шевченко ©   (2008-06-11 11:49) [8]

Riply ©   (11.06.08 11:43) [6]

Телепаты на форуме находятся в бессрочном отпуске


 
Riply ©   (2008-06-11 12:00) [9]

> [7] Игорь Шевченко ©   (11.06.08 11:49)
> Здесь Warning-а нету.

И не должно быть.
Я еще в самом первом посте написала "Если закоментировать код, то варнинг исчезает"

> Например Exit
Не поняла :(

> Телепаты на форуме находятся в бессрочном отпуске
Эт я знаю и это очень печально :)
Но я же просила не угадывать высказать предположения какого типа ляп
может привести к этому.


 
Игорь Шевченко ©   (2008-06-11 12:03) [10]


> Я еще в самом первом посте написала "Если закоментировать
> код, то варнинг исчезает"


ты предлагаешь подставять разные варианты кода в надежде получить Warning ?

Неплохо бы было тебе самой закомментировать до тех пор, пока Warning не исчезнет, убрать последний комментарий и выложить код на форум


 
Anatoly Podgoretsky ©   (2008-06-11 12:16) [11]


> Как доказательство "не вранья" могу выслать код (его много).
>
> Но так как он в разаработке, то "в нем черт ногу сломит"
> - было бы мягким его описанием :)

Вот и замаскируй весь код в точках, приведи к тому виду, что опубликовала, если ошибка исчезнет, начинай по тихоньку размаскировать.


 
{RASkov} ©   (2008-06-11 12:39) [12]

> 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;


> "[Pascal Warning] Alx_Unicode.pas(746): W1035 Return value of function "Test" might be undefined" ?


По идеи, если оптимизатор не выкидывает первую строку, то глюк какой-то... ибо возвращаемое значение определено в первой строке...
Нужно весь код смотреть, иначе эти гадания могут затянуться....


 
DrPass ©   (2008-06-11 12:46) [13]


> По идеи, если оптимизатор не выкидывает первую строку, то
> глюк какой-то... ибо возвращаемое значение определено в
> первой строке...

Более того, первая строчка вообще не нужна. String/WideString - это управляемые типы, и они всегда инициализируются пустой строкой при входе в область видимости, даже если ты это явно не написал. Компилятор эту фишку знает, и не даст никаких ахтунгов.


 
guav ©   (2008-06-11 13:13) [14]

> [13] DrPass ©   (11.06.08 12:46)
> Более того, первая строчка вообще не нужна

Нужна. Тут строка не локальная переменная, а результат, он передаётся как неявный var параметр, потому там может быть и не пустая строка.


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

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

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


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

Riply ©   (11.06.08 15:00) [15]


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


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


 
Riply ©   (2008-06-11 15:48) [17]

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

Хорошо.

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

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


 
Riply ©   (2008-06-11 17:56) [18]

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


 
Riply ©   (2008-06-11 20:28) [19]

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

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

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


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


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


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


 
Тын-Дын ©   (2008-06-11 23:17) [21]


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


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


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

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

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

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

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

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


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


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


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


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


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


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

Riply ©   (12.06.08 00:03) [22]

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


 
Riply ©   (2008-06-12 01:07) [25]

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

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


 
Тын-Дын ©   (2008-06-12 02:06) [26]


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


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


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


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

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


 
Riply ©   (2008-06-12 17:41) [28]

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

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}


 
Riply ©   (2008-06-12 17:43) [29]

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


 
Тын-Дын ©   (2008-06-12 18:04) [30]


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


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


 
Тын-Дын ©   (2008-06-12 18:06) [31]

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

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

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


 
Тын-Дын ©   (2008-06-12 18:08) [32]

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


 
Игорь Шевченко ©   (2008-06-12 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:16) [34]


> Игорь Шевченко ©   (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:19) [35]

Сейчас удалю всё, кроме исходных текстов, ещё раз перекомпилирую...


 
Игорь Шевченко ©   (2008-06-12 18:19) [36]

Кстати, Warning исчезает, если функцию Us_HoldInteger_ перенести без всяких изменений из модуля Sh_Unicode в тело проекта сразу перед TestExtract.

Мой хороший совет - не париться.


 
Тын-Дын ©   (2008-06-12 18:26) [37]


> Кстати, Warning исчезает, если функцию Us_HoldInteger_ перенести
> без всяких изменений из модуля Sh_Unicode в тело проекта
> сразу перед TestExtract.


Не потому ли, что Rеsult присваивается непосредственно в этой функции безусловно?


 
Riply ©   (2008-06-12 18:26) [38]

> [34] Тын-Дын ©   (12.06.08 18:16)
> То же самое - у меня при компиляции нет предупреждения.

Надо компилировать с такими дериктивами:
{$DEFINE SH_MEM_MNG}
{.$DEFINE SH_MEM_DEBUG}
{.$DEFINE SH_MEM_US_DEBUG}
{$DEFINE SH_MEM_US_HEAP}
тогда будет.

> [36] Игорь Шевченко ©   (12.06.08 18:19)
> Мой хороший совет - не париться.

Наверное Вы правы, но я хорошо запомнила историю, когда inline функция
"меняла" входной параметр - константу.
Вдруг и здесь что-то подобное ?


 
Тын-Дын ©   (2008-06-12 18:30) [39]


> Надо компилировать с такими дериктивами:


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


 
Игорь Шевченко ©   (2008-06-12 18:45) [40]


> Вдруг и здесь что-то подобное ?


а ты попробуй функцию перенести. define все те же самые, inc-файл тот же включается, функция сама не inline, посмотришь, уйдет warning или нет.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.283 c
15-1211885033
pasha_golub
2008-05-27 14:43
2008.07.13
Превратить старый ноутбук в multimedia комбайн


2-1213534522
Zonder2008
2008-06-15 16:55
2008.07.13
Как обратиться к неизвестному экземпляру по индексу?


15-1211975218
SergP
2008-05-28 15:46
2008.07.13
test


6-1190105366
ocean
2007-09-18 12:49
2008.07.13
Как успокоить брандмауэр?


2-1213535300
NieL
2008-06-15 17:08
2008.07.13
Скорость работы алгоритма





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский