[РЕШЕНО] FPCUnit - куда пропал Access Violation?

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

Ответить
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

[РЕШЕНО] FPCUnit - куда пропал Access Violation?

Сообщение Brainenjii »

Долго искал ошибку - внезапно обнаружил, что код вида:

Код: Выделить всё

Procedure TTestCase1.TestHookUp; 
Var
  aManager: BAttributesManagerClass;
Begin
  aManager.AddAttribute(nil, 'Test Group1', akGroup);
End;

прекрасно выполняется. Как такое может быть? Проект прилагаю.

P.S. вне FPCUnit Access Violation замечательно поднимается
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Brainenjii 12.04.2012 18:06:44, всего редактировалось 1 раз.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Всё даже ещё интересней:

Код: Выделить всё

Unit TestCase1;

Interface

Uses
  Classes, fpcunit, testutils, testregistry;

Type

  TTestCase1= Class(TTestCase)
  Published
    Procedure TestHookUp;
  End;

Implementation

Procedure TTestCase1.TestHookUp;
Var
  aStringList: TStringList;
Begin
  aStringList.Add(''); //<- Тут потерялся Exception
End;

Initialization
  RegisterTest(TTestCase1);
End.

Выполняется на 5 с плюсом, что в FPCUnit, что в Lazarus'e.
Как вернуть Exception? ^_^
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Сообщение kosteek »

Я не верно понял вопрос. А как удалить свое сообщение не знаю.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

А если явно?

Код: Выделить всё

Var
  aStringList: TStringList = nil;
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

если явно - exception возвращается... Из-за чего такое может быть? В багтрекере говорят что не могут воспроизвести
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Из-за того, что на месте неинициализированной переменной в стеке оказался другой TStringList или другой объект, обращение к которому не приводит к AV. Воспроизвести не могут, видимо, из-за разных опций компиляции (причем компиляции всего начиная с RTL), т.к. они влияют на раскладку стека.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Какой-то способ, кроме явной инициализации в nil существует?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Ключи компиляции -gt, -gtt, -gttt будут инициализировать мусором, но не все (например, открытые массивы недоделаны).
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Спасибо!
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

C -gt вылез слабообъяснимый глюк с generic'ами

Код: Выделить всё

  ..
  WriteLn(bNewReqPatterns.UnitName); // <- Здесь всё хорошо
  aStored.Compare(aReqPatterns, bNewReqPatterns, bOldReqPatterns);
  ..
Procedure Compare(Const aTarget: BList; Out aLack, aOver: BList);
Begin
  WriteLn(aLack.UnitName); // <- Здесь Access Violation
  ..
End;
..

без него всё отрабатывает как нужно
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Очень даже объясним. Out-параметр используется до присвоения ему значения.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

И точно. Ещё раз спасибо
Ответить