![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Warning, которого быть не должно.
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" ?
Что такое может быть "не так" в коде, где точки ?
(Если его закоментировать (но только весь сразу, а не кусочками), то варнинг исчезает)
guav (2008-06-11 13:13:00) [41]> [13] DrPass © (11.06.08 12:46)
> Более того, первая строчка вообще не нужна
Нужна. Тут строка не локальная переменная, а результат, он передаётся как неявный var параметр, потому там может быть и не пустая строка.
DrPass (2008-06-11 12:46:00) [42]
> По идеи, если оптимизатор не выкидывает первую строку, то
> глюк какой-то... ибо возвращаемое значение определено в
> первой строке...
Более того, первая строчка вообще не нужна. String/WideString - это управляемые типы, и они всегда инициализируются пустой строкой при входе в область видимости, даже если ты это явно не написал. Компилятор эту фишку знает, и не даст никаких ахтунгов.
{RASkov} (2008-06-11 12:39:00) [43]> 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" ?
По идеи, если оптимизатор не выкидывает первую строку, то глюк какой-то... ибо возвращаемое значение определено в первой строке...
Нужно весь код смотреть, иначе эти гадания могут затянуться....
Anatoly Podgoretsky (2008-06-11 12:16:00) [44]
> Как доказательство "не вранья" могу выслать код (его много).
>
> Но так как он в разаработке, то "в нем черт ногу сломит"
> - было бы мягким его описанием :)
Вот и замаскируй весь код в точках, приведи к тому виду, что опубликовала, если ошибка исчезнет, начинай по тихоньку размаскировать.
Игорь Шевченко (2008-06-11 12:03:00) [45]
> Я еще в самом первом посте написала "Если закоментировать
> код, то варнинг исчезает"
ты предлагаешь подставять разные варианты кода в надежде получить Warning ?
Неплохо бы было тебе самой закомментировать до тех пор, пока Warning не исчезнет, убрать последний комментарий и выложить код на форум
Riply (2008-06-11 12:00:00) [46]> [7] Игорь Шевченко © (11.06.08 11:49)
> Здесь Warning-а нету.
И не должно быть.
Я еще в самом первом посте написала "Если закоментировать код, то варнинг исчезает"
> Например Exit
Не поняла :(
> Телепаты на форуме находятся в бессрочном отпуске
Эт я знаю и это очень печально :)
Но я же просила не угадывать высказать предположения какого типа ляп
может привести к этому.
Игорь Шевченко (2008-06-11 11:49:00) [47]Riply © (11.06.08 11:43) [6]
Телепаты на форуме находятся в бессрочном отпуске
Игорь Шевченко (2008-06-11 11:49:00) [48]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
Riply (2008-06-11 11:43:00) [49]> [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 09:59:00) [50]Возможно с tmp.Buffer какие-то действия выполняются, в результате чего и происходитпредупреждение.
Anatoly Podgoretsky (2008-06-11 09:51:00) [51]> Игорь Шевченко (11.06.2008 9:50:03) [3]
Дело наверно в точках.
Игорь Шевченко (2008-06-11 09:50:00) [52]нету warning'а не обманывай
Riply (2008-06-11 00:57:00) [53]> [1] DrPass © (11.06.08 00:44)
> А если так:
Неа. Не помогло.
Просто в "точках" так мого всего, что лень(да и нереально) идти вручную.
Мне хочется понять, хотя бы какого типа безобразничество я там должна была совершить для такого эфекта :)
Не могу себе представить. Да и первой строкой результат задается: Result := '';
Пока оставила это дело до лучших времен, но процедуру не уничтожаю (хотя она уже не нужна).
P.S.
А может Delphi уже пора перезагрузить ?
DrPass (2008-06-11 00:44:00) [54]
> 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;