Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятная ошибка при работе со строками 
V
    Опции темы
uwannadie
Дата 23.5.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



отлаживал программу ,пытаяся выловить AV. для этого подключил FASTMM
после подключения имеем налицо ошибку в строчке
Код

aSourcePath := pSourcePath + '\' + pFilePath;

лог фастмм-а:
Код

--------------------------------2011/5/23 10:32:41--------------------------------
FastMM has detected an error during a GetMem operation. The block header has been corrupted. 

The current thread ID is 0xBCC, and the stack trace (return addresses) leading to this error is:
40E94D [FastMM4.pas][FastMM4][FastMM4.DebugGetMem][6843]
4EBCEE [BuildThread.pas][BuildThread][BuildThread.TBuildThread.Execute][164]
44CFD1 [Classes.pas][Classes][Classes.ThreadProc][11407]
7C80B729 [Unknown function at GetModuleFileNameA]

сама ошибка возникает в System._NewUnicodeString:
Код

function _NewUnicodeString(CharLength: LongInt): Pointer;
{$IFDEF PUREPASCAL}
var
  P: PStrRec;
begin
  Result := nil;
  if CharLength > 0 then
  begin
    // Allocate a memory with record and extra wide-null terminator.
    if CharLength >= (MaxInt - SizeOf(StrRec)) div SizeOf(WideChar) then _IntOver;
    GetMem(P, SizeOf(StrRec) + (CharLength + 1) * SizeOf(WideChar));
    Result := Pointer(NativeInt(P) + SizeOf(StrRec));
    P.length := CharLength;
    P.refCnt := 1;
    P.elemSize := SizeOf(WideChar);
    P.codePage := Word(DefaultUnicodeCodePage);
    PWideChar(Result)[CharLength] := #0;
  end;
end;
{$ELSE}
asm
        { ->    EAX     length                  }
        { <-    EAX     pointer to new string   }
        TEST    EAX,EAX
        JLE     @@lengthLEZero  // length <= 0?
        PUSH    EAX             // save length
        ADD     EAX,EAX         // convert to bytes
        JO      @@overflow
        ADD     EAX,rOff+2      // + record + terminator
        JO      @@overflow
        {$IFDEF ALIGN_STACK}
        SUB     ESP,8
        {$ENDIF ALIGN_STACK}
        CALL    _GetMem                       //<<<<< ======= тут возникает ошибка
        {$IFDEF ALIGN_STACK}
        ADD     ESP,8
        {$ENDIF ALIGN_STACK}
        ADD     EAX,rOff
        POP     EDX                              // requested string length
        MOV     [EAX-skew].StrRec.refCnt,1
        MOV     [EAX-skew].StrRec.length,EDX
        MOV     word ptr [EAX+EDX*2],0           // wide null terminator
        MOV     word ptr [EAX-skew].StrRec.elemSize,2
{$IFDEF PIC}
        PUSH    EBX
        PUSH    EAX
        PUSH    ECX
        CALL    GetGOT
        MOV     EDX, [EAX].OFFSET DefaultUnicodeCodePage
        MOV     EDX, [EDX]
        POP     ECX
        POP     EAX
        POP     EBX
{$ELSE !PIC}
        MOV     EDX, DefaultUnicodeCodePage
{$ENDIF}
        MOV     word ptr [EAX-skew].StrRec.codePage,DX
        RET
@@overflow:
        {$IFDEF ALIGN_STACK}
        POP     EAX
        {$ENDIF ALIGN_STACK}
        JMP     _IntOver
@@lengthLEZero:
        XOR     EAX,EAX
end;
{$ENDIF !PUREPASCAL}

на борту 
Embarcadero® Delphi® XE Version 15.0.3953.35171 
FastMM 4.97
на всякий пожарный прилагаю код модуля, в котором находится строка с ошибкой

Добавлено через 5 минут и 14 секунд
UPD
выключил FastMM, ошибка исчезла, но появляется старый AV :(

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  BuildThread.pas 7,13 Kb
--------------------
PM MAIL   Вверх
MetalFan
Дата 23.5.2011, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



uwannadie, сразу бросилась в глаза неинициализированная локальная переменная в цикле
Код

    for i := 0 to pFilePriority.Count - 1 do
      Tmp := Tmp + pFilePriority.Strings[i]+';';

Ну и по StrLCopy замечание... учитывается ли, что Dest должно быть размером MaxLen+1 для null terminator'а?
Может еще какие косяки есть.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
uwannadie
Дата 23.5.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



Цитата(MetalFan @  23.5.2011,  14:19 Найти цитируемый пост)
Ну и по StrLCopy замечание... учитывается ли, что Dest должно быть размером MaxLen+1 для null terminator'а?
Может еще какие косяки есть. 

- в смысле поставить в параметр MaxLen в моем случае размер массива + 1 ?
- ну очевидные косяки исправил. типа соответствия типов и освобождения объектов и удаление указателей на них

самое интересное, что на системах с полноценной поддержкой AV не появляется (проверял на висте, семерке)
может где-то тут собака зарыта?


Это сообщение отредактировал(а) uwannadie - 23.5.2011, 15:13
--------------------
PM MAIL   Вверх
northener
Дата 23.5.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(uwannadie @  23.5.2011,  15:12 Найти цитируемый пост)
самое интересное, что на системах с полноценной поддержкой AV не появляется (проверял на висте, семерке)
может где-то тут собака зарыта?

Появление или не появление AV это дело случая. Появление AV есть прямое указание на ошибку в программе, отсутствие AV ни о чем не говорит.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
uwannadie
Дата 23.5.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



ну это ясно.
в общем ошибка со строкой исчезла совсем после правки параметров StrLCopy
теперь FASTMM добрался до основного гвоздя - AV  smile 

Это сообщение отредактировал(а) uwannadie - 23.5.2011, 15:55
--------------------
PM MAIL   Вверх
MetalFan
Дата 23.5.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(uwannadie @  23.5.2011,  15:12 Найти цитируемый пост)
- в смысле поставить в параметр MaxLen в моем случае размер массива + 1 ?

Всмысле, что размер Dest = MaxLen+1, т.е. эта функция запишет MaxLen cимволов, и в конце добьет нулем. В твоем случае, если строка слишком длинная, то ноль этот улетал за пределы Dest.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
uwannadie
Дата 23.5.2011, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



Цитата(MetalFan @ 23.5.2011,  17:27)
Цитата(uwannadie @  23.5.2011,  15:12 Найти цитируемый пост)
- в смысле поставить в параметр MaxLen в моем случае размер массива + 1 ?

Всмысле, что размер Dest = MaxLen+1, т.е. эта функция запишет MaxLen cимволов, и в конце добьет нулем. В твоем случае, если строка слишком длинная, то ноль этот улетал за пределы Dest.

ну это понятно, но я думаю тут проблема решилась бы проверкой длины массива символов вида
Код

длина массива <= MAX_PATH - 1

как раз 1 место для #0 останется в любом случае
--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1284 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.