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

Вниз

Проблема с иницилизацией переменных   Найти похожие ветки 

 
KygECHuK ©   (2006-07-31 10:26) [0]

Обрисовываю ситуацию: Я занимаюсь автоматизацией сборки дистребутивов, за полугодовой стаж у меня появилась проблема: При компиляции через IDE система работает без сбоев, а при компиляции через командную строку постоянно происходит ошибка доступа памяти. Ошибку я нашел: оказалось, что в одной под программе не был инициализирован указатель. Я всё объяснил руководству, сказал, что даже delphi показываеn warning на этой строчке кода, но с меня требуют более развернутое объяснение, почему три месяца проект обоими случаями компилировался стабильно, а сейчас через IDE переменная стабильно по умолчанию становится в nil, а через DCC32 стабильно не nil


 
Плохиш ©   (2006-07-31 11:07) [1]

Предлагаешь нам по-философствовать или денег на носовой платок не хватает?

PS. Для таких веток имеется конференция "Прочее"


 
Чапаев ©   (2006-07-31 12:02) [2]


> занимаюсь автоматизацией сборки дистребутивов, за полугодовой
> стаж

За полугодовой стаж не выучил, как пишется слово "дистрибутив"?


 
Юрий Зотов ©   (2006-07-31 12:15) [3]

> Плохиш ©   (31.07.06 11:07) [1]

Почему "прочее"? Разве это не вопрос по Delphi и программированию в ней? Причем вполне конкретный.

> KygECHuK ©   (31.07.06 10:26)  

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

2. Если раньше проект работал стабильно, то можно сравнить, что в нем изменилось в плане работы с этой переменной.

3. Если переменная глобальная, то ее можно проинициализировать явно, в секции initialization или так:
var
 P: pointer = nil;
Хотя по идее она и так должна инициализироваться, но ведь нельзя полностью исключить и баг DCC32.


 
Игорь Шевченко ©   (2006-07-31 12:43) [4]


> но ведь нельзя полностью исключить и баг DCC32.


"If you don’t explicitly initialize a global variable, the compiler initializes it to 0"
(с) F1

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


 
KygECHuK ©   (2006-07-31 12:56) [5]


> За полугодовой стаж не выучил, как пишется слово "дистрибутив"?

я почти всегда это слово пишу на английском


>
> 1. Нужен бы этот самый варнинг и кусок кода, где он возникает.
>  От таких вещей надо избавляться однозначно.


Я подробно объяснил коллегам, что такие вещи оставлять в коде нельзя, но некотрые сетуют на то, что таких мест в проекте много, но баг проявился именно в этом месте.


> 2. Если раньше проект работал стабильно, то можно сравнить,
>  что в нем изменилось в плане работы с этой переменной.


Изменилось многое, время обнаружения сбоя неизвестно. Сам модуль в котором произошла ошибка правился довольно давно да и не в месте сбоя.

Да вот сейчас: поправил ошибку - скомпелеровал обоими способами -
ошибок нет -  открыл заново - закоментарил исправленное -  скомпелеровал обоими способами - ошибок нет!  Просто генератор псевдо случайных чисел какой-то. Не зря, значит, Warning пушут.
 
Неужели единственный способ борьбы с этим багом  - регламинтирование обязательной инициализации переменных ?


 
Юрий Зотов ©   (2006-07-31 13:54) [6]

> KygECHuK ©   (31.07.06 12:56) [5]

> некотрые сетуют на то, что таких мест в проекте много

Пусть лучше посетуют на то, что либо все эти места придется править (а в дальнейшем писать код грамотно), либо придется смириться с тем, что в непредсказуемое время в непредсказуемых ситуациях в программе будут возникать непредсказуемые глюки. Трудно воспроизводимые или совсем невоспроизводимые.

Это - расплата за небрежность. Кажущаяся "скорость" разработки, которая потом выливается в гораздо большие труд и время.

Примечание: знаю несколько случаев, когда устранение 50-80 хинтов и варнингов в проектах под миллион строк заняло пару дней, но после этого "сами собой" исчезли несколько багов, которые никто не мог выловить месяцами. Выходит, что овчинка очень даже стоит выделки.

> но баг проявился именно в этом месте.

Пропущено слово "пока". Баг ПОКА проявился именно в этом месте. Где и когда проявится он же, или следующий - непредсказуемо.

> Просто генератор псевдо случайных чисел какой-то.

Нормальный плавающий баг, ничего нового.

> Не зря, значит, Warning пушут.

Еще как не зря.

> Неужели единственный способ борьбы с этим багом  - регламинтирование
> обязательной инициализации переменных?

Самый лучший (если вообще не единственный) способ борьбы с такими вещами - это жесточайшая корпоративная политика "ноль хинтов, ноль варнингов". Введенная административно, возведенная в абсолют, беспрекословно соблюдаемая и предусматривающая материальные взыскания за нарушение. На своей машине, пока работаешь с кодом, делай что угодно, но после заливки в VCS каждый твой хинт будет стоить тебе, к примеру, 5 баксов, а варнинг - 10. Доказывается логами VCS.

==============

Так можно привести текст сообщения и кусок кода? Может быть,тогда удастся сказать что-то более конкретное.


 
KygECHuK ©   (2006-07-31 14:11) [7]

В принципе, всё элементарно, вот только поиск этого места заняло двое суток:



procedure TfmFinal.FormShow(Sender: TObject);
var
  .
  .
  .
 
 MainModule  : TxModule;
  .
  .
  .
begin
 try
   MainModule := nil;  // это я добавил

      if  MainModule is TxModuleEnt then // вот сдесь ошибка
   begin
      .
      .  
      .
   end;
 except
   ShowError;
 end;
end;



простейшая процедура не давала мне спать, сдесь даже нечего обчуждать
пойду убъюся ап стену :)


 
Eraser ©   (2006-07-31 14:26) [8]

> [7] KygECHuK ©   (31.07.06 14:11)

дык то что автоматически инициализируются локальные переменные никто и не обещал...


 
Eraser ©   (2006-07-31 14:27) [9]

ЗЫ бычно инициализицию проводят перед входом в блоки try..except/try..finally, хотя в данном случае разницы нет.


 
KygECHuK ©   (2006-07-31 15:03) [10]


> дык то что автоматически инициализируются локальные переменные
> никто и не обещал...


Тем не мение, они до какого - то времени инициализировались правильно


 
Игорь Шевченко ©   (2006-07-31 15:13) [11]


> Тем не мение, они до какого - то времени инициализировались
> правильно


Не обманывай


 
KygECHuK ©   (2006-07-31 15:25) [12]


> Не обманывай


я в это верю :)


 
Германн ©   (2006-07-31 15:25) [13]


> Тем не мение, они до какого - то времени инициализировались
> правильно

Лотерея, блин.
До каких-то пор мусор в стеке не принимал значений выходивших за АП процесса.


 
Юрий Зотов ©   (2006-07-31 15:34) [14]

> KygECHuK ©   (31.07.06 14:11) [7]

Локальные переменные не инициализируются. То есть, инициализируются случайным мусором. Неинициализированный MainModule мог миллион раз содержать случайный ноль (что и есть nil), мог даже случайно попасть на экземпляр TxModuleEnt, мог попасть куда угодно еще - но рано или поздно ошибка все равно бы всплыла. Причем именно непредсказуемо и без всякой гарантии ее воспроизведения.

Искать такие ошибки ОЧЕНЬ трудно, в тысячи раз легче их не допускать. У Вас ушло 2 дня плюс нервы, а у программиста, изначально писавшего этот код на инициализацию ушло бы секунд 15 и никакой нервотрепки.

Разница огромная. Так что же быстрее и выгоднее - сразу писать без варнингов или мучаться потом?

Обсуждать тут и правда нечего. Надеюсь, Вам теперь есть что показать Вашему руководству. И если учесть, что из-за этого очевидного ляпсуса контора зазря потеряла 2 человеко-дня и 2 дневных человеко-зарплаты, то на месте этого самого руководства я бы подумал о штрафе. Не с Вас, естественно, а с того, кто пишет кривой код, совершенно не думая головой и даже не обращая внимания на варнинги.


 
KygECHuK ©   (2006-07-31 15:41) [15]

Спасибо за понимание.


 
icWasya ©   (2006-07-31 16:55) [16]

из законов Мэрфи

если программа работает правильно, это не значит, что в ней нет ошибок


 
@!!ex ©   (2006-07-31 17:09) [17]

Вообще не инициализировать переменные - ИМХО плохой тон.
В свое время на работе меня приучили всегда инициализировать.
И спасибо им за это. Теперь и в Delphi поректах всегда 0 присваиваю nil или что нибудь другое.
Уж лучше я потрачу пол секунды на это, чем потом баги искать.


 
Игорь Шевченко ©   (2006-07-31 17:19) [18]


> В свое время на работе меня приучили всегда инициализировать.
>
> И спасибо им за это. Теперь и в Delphi поректах всегда 0
> присваиваю nil или что нибудь другое.


О неинициализированных сообщает компилятор, а остальные - незачем.


 
@!!ex ©   (2006-07-31 17:21) [19]

>>О неинициализированных сообщает компилятор, а остальные - незачем.
Ну это естественно.
Если значение вычисляеться в первых строчках кода, инициализировать переменную не имеет особого смысла.


 
KygECHuK ©   (2006-07-31 17:42) [20]


> если программа работает правильно, это не значит, что в
> ней нет ошибок


я удивляюсь как она вообще работает с таким подходом к делу :^[


 
@!!ex ©   (2006-07-31 17:49) [21]


Если программа не компилиться - значит в ней есть ошибка.
Если программа компилиться - значит ошибка в компиляторе.
</b


 
StriderMan ©   (2006-07-31 18:34) [22]


> @!!ex ©   (31.07.06 17:49) [21]

Если программа компилируется с первого раза без ошибок, значит она написана принципиально неверно.


 
jack128 ©   (2006-07-31 20:16) [23]

Юрий Зотов ©   (31.07.06 13:54) [6]
Примечание: знаю несколько случаев, когда устранение 50-80 хинтов и варнингов в проектах под миллион строк заняло пару дней, но после этого "сами собой" исчезли несколько багов, которые никто не мог выловить месяцами. Выходит, что овчинка очень даже стоит выделки.

тебе повезло. Имею противоположный опыт. Обниливание указателя в нужном месте выявляло баг, который никак ся не проявлял. Хоят, конечно, всё что ни делается - всё к лудшему.

@!!ex ©   (31.07.06 17:21) [19]
Если значение вычисляеться в первых строчках кода, инициализировать переменную не имеет особого смысла.

даже если не в первых, а в последних - тоже не имеет смысла.  Иначе те компилер - хинт выдаст, "переменной присвоено значение, которое нигде не используется".
Короче - стандартное правило - 0 хинтов, 0 варнингов.


 
Юрий Зотов ©   (2006-07-31 20:34) [24]

> jack128 ©   (31.07.06 20:16) [23]

Да так и было - частично исчезли (по крайней мере, перестали возникать), частично проявились. Главное, что проявились стабильно, после чего убрать их было уже несложно.



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

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

Наверх





Память: 0.53 MB
Время: 0.048 c
9-1135003633
GameMac
2005-12-19 17:47
2006.09.10
Видовая матрица


15-1155627234
Sergey_b
2006-08-15 11:33
2006.09.10
Вопрос


6-1145860570
cosmos
2006-04-24 10:36
2006.09.10
Ошибка подключения к Paradox через ADO


15-1155645054
гастрит
2006-08-15 16:30
2006.09.10
скрипт


2-1156264773
Gagarin
2006-08-22 20:39
2006.09.10
как Добавить прогу в контекстное меню аля Winrar





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский