-
Я наконец довел тот проект, которым занимался в последние месяцы, до состояния, когда его можно показать публике. Встречайте FixInsight: http://sourceoddity.com/fixinsight/FixInsight - статический анализатор, позволяющий находить потенциально проблемные места в коде на Delphi. Больше информации и скриншоты есть по ссылке. Например, вот такой нездоровый код, когда некто оставил пустым блок except будет найден автоматически: try
DoWork;
except
end; Что сэкономит кому-то немного времени :) Полный список отслеживаемых ситуаций можно посмотреть вот тут http://sourceoddity.com/fixinsight/doc.html#rulesБета версия, не все совершенно. Но это только начало :)
-
-
как и говорил - давно пора :-)
-
Привет. Пустой finally опасен тем, что в нем забыли что-то написать ?
Object "Foo" created in TRY block Я раньше часто так делал. Даже писал на мастерах об этом как то. По-моему ничего криминального
-
> Привет. Пустой finally опасен тем, что в нем забыли что- > то написать ?
опасен, создал - удали
> Object "Foo" created in TRY blockЯ раньше часто так делал. > Даже писал на мастерах об этом как то. По-моему ничего > криминального
почти та же причина в этом блоке выбросит ктонить исключение - объект останется неудаленным
-
Спасибо. Есть польза от статических анализаторов, нашел несколько неточностей. Использую еще вот такое: http://www.peganza.com/#PALчитал про такой для плюсов: http://www.viva64.com/ru/d/в качестве затравок для будущих идей. из пеганзы хотелось бы довольно легко реализуемые: "const s string" вместо "s string" в параметрах функций то же самое для открытых массивов если бы в анализе format кроме числа переменных был тип - было бы супер! бывают там ошибки из-за сменившихся типов переменных.
-
> silver © (06.10.14 21:13) [4] > > Пустой finally опасен тем, что в нем забыли что-то написать ? > опасен, создал - удали
Сильное утверждение. Всё равно, что сказать «if без else опасен». Нередко попадаются операции, которые кидают бесполезные в контексте задачи исключения.
-
> Kerk © (06.10.14 19:55)
> Но это только начало :)
надо идеи начинать собирать
> Дмитрий Белькевич © (06.10.14 23:20) [5]
> если бы в анализе format кроме числа переменных был тип > - было бы супер!
Но функция Format сама же интерпретирует свою строку, это не часть языка.
-
> RWolf © (06.10.14 23:34) [6] >
> Нередко попадаются операции, которые кидают бесполезные > в контексте задачи исключения.
Чревато все же ошибками. Так можно ненароком задавить постороннее исключение, а не то которое мы ожидаем и потом долго искать проблему. Если уж давить то хотя бы выборочно.
-
> Дмитрий Белькевич © (06.10.14 23:20) [5] > DVM © (06.10.14 23:37) [7]
Да, идеи активно ищутся :) Не все пока можно реализовать, но многое вполне в рамках возможного.
-
ИМХО.
Для начинающих - полезно. Для профи - вряд ли, потому что таких очевидных ляп они уже практически не делают.
Тем не менее, впечатление хорошее.
-
> Kerk © (06.10.14 19:55) > > Я наконец довел тот проект, которым занимался в последние > месяцы, до состояния, когда его можно показать публике. > > Встречайте FixInsight
А почему поддерживаемые версии Дельфи начинаются с Д2010?
-
> silver © (06.10.14 21:13) [4] > > > Object "Foo" created in TRY blockЯ раньше часто так делал. > > > Даже писал на мастерах об этом как то. По-моему ничего > > криминального > > почти та же причина > в этом блоке выбросит ктонить исключение - объект останется > неудаленным
Угу. Почти та же причина, но с точностью до наоборот. Возникнет исключение в конструкторе - объект не будет создан. А что тогда пытаемся удалить в finally?
-
> Юрий Зотов © (07.10.14 01:21) [10]
Отвечу своей имхой :) Это всем полезно, потому что никто не совершенен. Тем более когда в проекте много людей. А так как работает оно автоматически и довольно быстро, то даже если хотя бы иногда будет что-то находить, то уже хорошо и полезно. Вот возьмем простой пример: if Abc then;
raise Exception.Create('abc'); Это даже не ошибка. Просто опечатка - палец скользнул. Глазами тут проблему найти не так уж легко, а анализатор легко справится. Уже справляется. Таких маленьких примеров я много могу приводить. > Германн © (07.10.14 01:24) [11] > А почему поддерживаемые версии Дельфи начинаются с Д2010?
В D2010-XE7 пакет компилируется без изменений. В 2009 не компилируется. У меня пока времени не было разобраться, чего она от меня хочет. Но так вообще принципиальных ограничений нет.
-
> В 2009 не компилируется. У меня пока времени не было разобраться, > чего она от меня хочет. Но так вообще принципиальных ограничений > нет.
Я вообще-то имел в виду Д2007. Последнюю неюникодную, но в то же время "первую" Rad Studio.
-
Ответ тот же самый :) У меня в планах поддержка всех версий, начиная с 2006. Но что успел, то успел :)
-
> Kerk © (07.10.14 01:46) [13] > > if Abc then; > raise Exception.Create('abc');
Пример неудачный, поскольку:
1. Безусловные исключения проявляют сами себя и поэтому легко ловятся на первых же этапах тестирования. Отладчик покажет точку возникновения исключения, а не увидеть в ней пустой оператор может разве что слепой.
2. Последующий код будет отмечен компилятором, как недостижимый, причем даже и без тестирования. И если мы придерживаемся профессионального стиля кодинга "варнингов быть не должно", то не увидеть этот единственный варнинг тоже может разве что слепой.
PS Возможно, есть и более сложные примеры. Но в материале по ссылке я таких не нашел. Там ошибки именно уровня начинающих - чем и было обусловлено мое ИМХО.
-
Кстати, а комментарии учитываются? Будет ли поймано вот такое: raise Exception.Create('abc');
Или вот такое:
-
Юрий Зотов © (07.10.14 02:10) [16]
> Последующий код будет отмечен компилятором, как недостижимый, > причем даже и без тестирования.
Не будет. Delphi так не умеет. А вот FixInsight умеет. Думаю, одного только этого аргумента достаточно.
Разговоры про начинающих-заканчивающих считаю неконструктивными. Все люди ошибаются, бывают невнимательными, у всех есть коллеги разной степени оригинальности. Идеальных людей я пока только в интернете на форумах видел :)
Но имхо есть имхо. Это нормально.
-
> Юрий Зотов © (07.10.14 02:20) [17] > > Кстати, а комментарии учитываются?
Конечно учитываются :)
-
Я просто придерживаюсь мнения, что если какую-то работу можно переложить на бездушную машину, то нужно переложить.
-
> Kerk ©
Setup я не скачивал - просто пока что он мне ни к чему, а потом будет видно. Скажи, а реализована эта штука в виде вращиваемого в среду препроцессора (имеется в виду эксперт с методом BeforeCompile), или как-то иначе?
-
> Kerk © (07.10.14 01:57) [15] > > Ответ тот же самый :) > У меня в планах поддержка всех версий, начиная с 2006. Но > что успел, то успел
Ну тогда всё-таки с Д2007. 2005 и 2006 это всё-таки некие бэта-версии.
-
> Юрий Зотов © (07.10.14 02:32) [21]
Эта штука добавляет в среду кнопку, которая при нажатии запускает анализ текущего проекта. Возможно, BeforeCompile я сделаю позже опционально, но пока подумал, что не нужно.
> Германн © (07.10.14 02:54) [22]
D2006 наряду с D7 - одна их самых популярных версий до сих пор! :)
-
> Юрий Зотов © (07.10.14 01:21) [10]
> Для начинающих - полезно. Для профи - вряд ли, потому что > таких очевидных ляп они уже практически не делают.
Ляпы делают все разной степени очевидности. Если над кодом работает несколько человек полезно иметь инструмент отслеживающий вот такие ляпы. Тот же PVS Studio находил в свое время массу багов в известных программных продуктах, таких как например Google Chrome. Вот кстати блог PVS Studio с отчетами о проверках: http://habrahabr.ru/company/pvs-studio/
-
>Но функция Format сама же интерпретирует свою строку, это не часть языка. интерпретирует то она интерпретирует, но от того не легче. пример:
Format('select study_name from studies where study_uid = %s', [StudyUID]);
иногда приходится менять тип StudyUID со string на integer или наоборот, приходится весь код шерстить, что бы поменять %s на %d и всё равно ошибки, бывает, проскакивают. не скажу, что часто - может раза 3-4 было, но всё равно неприятно. не уверен, правда, что автоматом можно это учесть - объявления переменных бывают разбросаны по модулям. не знаю - может ли твой анализатор глобально по проекту собирать список переменных. >Для начинающих - полезно. Для профи - вряд ли, потому что таких очевидных ляп они уже практически не делают. у себя в коде почти ничего не нашел. только блок with несколько раз подвел, автоматом нашлось (присвоение одинаковых переменных). в сторонних компонентах в нескольких местах нашлись проблемы. в коде других программистов - штуки три ошибки (exit не в том месте, несоответствие числа параметров format). Проект - около 800-та тысяч строк. Ошибок с десяток нашлось, польза для меня есть. Впрочем - даже если одна была бы - всё равно хорошо. Ну а идеальным программистам, конечно, такие программы незачем.
-
D2006 фарева!
Программа крайне полезная, но вот основная масса канвы для анализа у меня именно в упомянутой версии.
Рома, у тебя же был в начале не экспертный вариант, нельзя его как-то собрать ?
-
Буквально недавно напоролся на опечатку. В код случайно попал лишний слэш, как раз в формате. Вместо "some text %s some text" было "some text %/s some text". Причем - именно случайно вклинившийся слэш, сам ума не приложу, как он туда попал. То было бы здорово проверять не только количиство, но и сами параметры. Делфи автоматом не делает. Понятно - не часть языка, но от того не легче.
-
"количиство" читать - количество. сделали на форуме обязательную регистрацию, сделайте пожалуйста еще и редактор.
-
> Дмитрий Белькевич © (07.10.14 10:29) [25]
> иногда приходится менять тип StudyUID со string на integer > или наоборот, приходится весь код шерстить, что бы поменять > %s на %d и всё равно ошибки
Я бы вообще предпочел, чтобы integer в string конвертировалось автоматом и т.д. Вон в c# такой проблемы нету.
-
> Дмитрий Белькевич © (07.10.14 10:29) [25]
> у себя в коде почти ничего не нашел.
это потому что база у программы пока совсем маленькая. натрави на код что-то типа AQTime (там вроде кроме профилировщика тоже есть анализатор с 100500 критериями оценки кода) узнаешь о своем коде много нового, начиная от дублей которые можно вынести в функции и заканчивая явными ошибками, время которых еще просто не пришло.
-
> Юрий Зотов © (07.10.14 01:21) [10] > ИМХО. > > Для начинающих - полезно. Для профи - вряд ли, потому что > таких очевидных ляп они уже практически не делают.
Делают-делают :) В наших проектах нашел пару тройку ляпов, хотя команда у нас, сам знаешь, точно не новички ни разу :) Даже удивительно что раньше не выплывало.
-
>Я бы вообще предпочел, чтобы integer в string конвертировалось автоматом и т.д. Вон в c# такой проблемы нету.
что имеем.
>натрави на код что-то типа AQTime
интересно, гляну.
-
> Kerk © (07.10.14 10:24) [23] > D2006 наряду с D7 - одна их самых популярных версий до сих пор! :)
жаль, что другая из самых популярных не поддерживается )
-
> Игорь Шевченко © (07.10.14 10:35) [26] > Рома, у тебя же был в начале не экспертный вариант, нельзя > его как-то собрать ?
У меня он и сейчас есть, я его для отладки использую. Но он же неудобный.
-
Проверять типы переменных в Format в принципе можно, но не в ближайшем будущем. Анализатор пока не умеет такие сложные штуки делать :)
-
>натрави на код что-то типа AQTime Статических анализаторов всего четыре. Первый, Static Analysis, позволяет получить общую информацию о приложении (размер функций в байтах, их адреса в памяти) и информацию о конкретных функциях (количество циклов в функции, количество условных операторов и т.д.). Следующий, Sequence Diagram Link, анализирует последовательность выполнения функций в программном коде, и по результатам анализа строит наглядную диаграмму в Microsoft Visio или Microsoft Word. Следующий статический анализатор имеет название Unused VCL Units и предназначен для поиска неиспользуемых модулей в программах, созданных с применением Delphi или C++ Builder. Такой анализ позволит несколько уменьшить размер исполняемого файла, получающегося при использовании этих сред, если из исходного текста программы убрать упоминание лишних модулей. Ну и, наконец, четвертый инструмент статического анализа, Platform Compliance, позволяет убедиться в том, что приложение может быть запущено на определённых целевых платформах - например, с его помощью можно узнать, какие дополнительные DLL'ки для этого понадобятся. Увы, судя по описанию, нет в нем нормального анализатора. >Проверять типы переменных в Format в принципе можно, но не в ближайшем будущем. не то, что бы оно сильно нужно было :) хорошо даже то, что уже сделал, спасибо. еще парочка: http://www.campwoodsw.com/http://www.socksoftware.com/codehealer.phphttp://sourceforge.net/projects/dca/может пригодится.
-
> Дмитрий Белькевич © (07.10.14 14:44) [36]
> Увы, судя по описанию, нет в нем нормального анализатора.
А там случайно нет отличий между редакциями? Мне кажется я как то смотрел именно AQTime и там была куча всяких критериев анализа.
-
-
DVM © (07.10.14 15:14) [38]
Вот мне интересно, кто-нибудь из этого встроенного аудита хоть какую-то пользу имеет ? Кроме тучи цифири, в которой без стакана разобраться невозможно, я там ничего полезного не обнаружил. Возможно, плохо смотрел. Сабжевый анализатор гораздо проще и интуитивнее.
-
> Игорь Шевченко © (07.10.14 15:21) [39]
> Вот мне интересно, кто-нибудь из этого встроенного аудита > хоть какую-то пользу имеет ? Кроме тучи цифири, в которой > без стакана разобраться невозможно, я там ничего полезного > не обнаружил
Аналогично. Слишком там всего много и большая часть - бестолковая на практике. Его настраивать очень долго надо под себя, тогда может и будет полезен. Но нужно завидное терпение.
-
Да, я тоже подумал, что Kerk прочитал про PVS Studio на хабре (пиарятся они толково) и решил что-то типа такого запилить )
-
> Игорь Шевченко © (07.10.14 15:21) [39] > DVM © (07.10.14 15:14) [38] > > Вот мне интересно, кто-нибудь из этого встроенного аудита > хоть какую-то пользу имеет ?
Исходя из того что на нашем проекте тупо падает (примерно полтора ляма строк кода только на основе, без учета кода от плагинов и т.п.) пользы нет вообще. На более легком пробовал запустить - как ты и сказал: "тучи цифири, в которой без стакана разобраться невозможно"
-
Кстати вопрос в принципе по теме (парсинг и анализ кода) я в свое время писал анализатор проекта, который показывал бы понятную глазу диаграмму зависимостей классов. http://rouse.drkb.ru/other/uw.gifОн тогда был заточен под 2007, впрочем проект я забросил, а те люди, которым передал исходники так и не стали его развивать. Оть тут последнее о нем упоминание: http://www.delphimaster.net/view/1-1237789977/allВот щас на XE4 он конечно не работает, но вопрос: а есть ли аналоги такого плана? Мне нужно просто диаграму посмотреть дабы правильно все зарефакторить. ЗЫ: Если аналогов нет, а инструмент лично мне нужен, придется конечно его поднимать опять и пробовать перепилить на ХЕ4 взяв за основу парсер от Ромки
-
-
-
> примерно полтора ляма строк кода
и сколько по времени билд?
-
> Kerk © (07.10.14 19:38) [45] > Это не оно?
Неа. Ну в принципе как - оно конечно, но не фурычит оно так, как мне нужно, именно поэтому и писал свой инструмент под прошлый рефакторинг.
> MBo © (07.10.14 19:35) [44]
Спасибо, завтра гляну.
-
> ProstoTak © (07.10.14 20:08) [46] > и сколько по времени билд?
Дебаг в районе 45 секунд, релиз около 4 минут (билд, защита, снятие хэшей, цифровуха и т.п.)
-
> Kerk ©
А можно сделать portable версию? Что бы без setup/install?
-
[FixInsight Warning] untFrontolSvc.pas(104): W511 Object "SDE" created in TRY block Добавь проверку, что объект освобождается в Finally там конструкция SDE := nil;
try
SDE := TServiceOperation.Create;
...
finally
FreeAndNil(SDE);
end;
-
Cobalt © (08.10.14 10:19) [50]
Такой код желательно переписать на
SDE := TServiceOperation.Create; try ... finally SDE.Free; end;
-
код в [50] может иметь смысл, если несколько объектов создается
-
>код в [50] может иметь смысл, если несколько объектов создается
в параллельных потоках? или как?
всё равно лучше [51] делать
-
>Добавь проверку, что объект освобождается в Finally
здесь проблема не в том, что объект освобождается в файнали, а в том, что он создаётся в блоке try.
-
> [53] Дмитрий Белькевич © (08.10.14 10:44)
obj1 := TClass1.Create; ... objN := TClass1.Create; -> exception, obj1-obj[N-1] - утечка памяти try
finally objN.Free; ... obj1.Free; end;
-
junglecat © (08.10.14 10:39) [52]
С точки зрения компилятора любой код имеет право на жизнь. С точки зрения программиста один код проще читается, в нем легче разобраться и меньше мест для потенциальных ошибок. Другой код читается труднее, в нем дольше разбираться, ...
Для меня образцом хорошего кода служат исходные тексты VCL, до 1999 года. При их изучении я не сталкивался с одновременным созданием и освобождением нескольких объектов с необходимостью обнуления ссылок на них перед созданием.
Сразу возникает вопрос, а почему бы эту группу связанных объектов не объединить в один класс и создавать и уничтожать именно этот класс.
-
Бывает так, что этих классов всего 2-3 штуки и они смыслово между собой не связаны. Скажем, два словаря, Тстринглист, Тстрим и какой-нить FTP
-
Cobalt © (08.10.14 11:40) [57]
Мне кажется, что дизайном в этом случае что-то не так. Еще раз, посмотри в VCL там вполне массово используемый продукт.
Я к чему - если Рома делает программу, ищущую недостатки или потенциальные ошибки в работающем коде, то не стоит туда вводить правила, скажем так, расчитанные на поощрение такого рода приемов в разработке приложений. Точно так же можно сказать, что except end вполне себе допустимая конструкция, "я же знаю, что исключения возникнуть только определенного типа и я хочу их игнорировать".
-
> Для меня образцом хорошего кода служат исходные тексты VCL, > до 1999 года
а я бы не брал их за идеал в данном случае. Потому как это абстрактный фреймворк, не имеющий связи с какой-либо предметной областью. А в рамках предметной области могут быть разные казусы. В том числе и создание нескольких явно не связанных объектов в одном участке кода.
-
junglecat © (08.10.14 12:16) [59]
Он этим и хорош в качестве образца для правил подобного анализатора. Потому что анализатор тоже не завязан на предметную область.
В рамках предметной области я бы рекомендовал ставить в коде какой-нибудь мета-тег, чтобы анализатор на код не реагировал, например.
По аналогии с {$HINTS OFF} в компиляторе
-
Ром, сия штука удаляется (обновляется)?
-
> turbouser © (08.10.14 10:13) [49] > > > Kerk © > > А можно сделать portable версию? Что бы без setup/install?
Это как? Будешь вручную пакеты в IDE устанавливать? :)
> Dennis I. Komarov © (08.10.14 12:45) [61] > > Ром, сия штука удаляется (обновляется)?
Не понял связь между удалением и обновлением. Но удалить ее можно через диалог "Установки/удаления программ" Windows.
-
> Kerk © (08.10.14 12:47) [62]
Я не знаю, как ты ее в IDE запихиваешь, поэтому спросил)
-
> Dennis I. Komarov © (08.10.14 12:54) [63]
Никакой магии. В дельфовом диалоге Components->Install Packages ты можешь увидеть пакет.
-
> В дельфовом диалоге Components->Install Packages ты можешь > увидеть пакет.
наверное могу... но не вижу(
-
Ну тут одно из двух. Либо оно у тебя не установлено, либо плохо ищешь :)
-
> Kerk © (08.10.14 13:09) [66]
Ну черт знает... запустил setup -> c:\Program Files\FixInsight\ Запускаю IDE... Components->Install Packages
Что не так? Ребут нужен?
-
Dennis I. Komarov © (08.10.14 13:59) [67]
Сетап спрашивает, для какой версии Delphi установить. Он у тебя спрашивает ? :)
-
> Игорь Шевченко © (08.10.14 14:04) [68]
Да, XE5
-
> Dennis I. Komarov © (08.10.14 14:12) [69]
Ты конкретно в списке установленных пакетов найти не можешь или у тебя вообще в IDE ничего нового не появилось? Меню "Run FixInsight..." и всего такого тоже нет?
-
> Kerk © (08.10.14 12:47) [62]
> Это как? Будешь вручную пакеты в IDE устанавливать? :)
Ну, в общем да
-
> Меню "Run FixInsight..." и всего такого тоже нет?
нет
-
Скрины в почте
-
Ого. Так бы сразу и сказал. Ответил в почту. Предлагаю там продолжить)
> turbouser © (08.10.14 14:23) [71] > > > Kerk © (08.10.14 12:47) [62] > > Это как? Будешь вручную пакеты в IDE устанавливать? :) > > Ну, в общем да
Это можно легко сделать. Но смысл?
-
Отпишусь здесь. В принципе Ром ты это уже все от меня слышал, но пишу чтоб народ мог дооформить саму идею.
Итак: консоль нужна обязательно.
По пунктам: 1. любое нормальное ПО собирает билдсервер, проводящий кучу проверок при самом билде и принимающий решение на каждом этапе - можем ли мы собрать релиз или нет. 2. анализ кода, проводимый твоей утилитой, очень хорошо способствует нахождению непреднамеренных ошибок (очепяток). Кстати вчера тестируя твою бету выловил опасный глюк в коде от аутсорсера (в том модуле над которым ты смеялся... ага - он там опять внес свои правки :)
Что хотелось бы от консоли:
Конфигурилка параметров запуска. Самое простое что я вижу, пока цеплять настройки из внешнего СFG файла (люого формата INI или XML), бо писать обвес еще и на парсинг командной строки - просто потратишь время.
Вывод результата - он должен быть двухуровневый, краткий в виде кода завершения процесса, который покажет что есть проблемма. И расширенный, желательно формализованный в виде XML, по которому билдсервер уже сам сможет принять решение - бродолжать сборку или нет.
Третье: Обязательно введи такую вещь, как исключение по дефайнам. К примеру я точно знаю что код от строчки А до строчки Б - кривой, и я не хочу чтоб твой анализатор на нем спотыкался. Помимо этого обязательно введи глобальный дефайн на модуль целиком, чтоб можно было сказать - вот этот модуль вообще страшный: "Это писал ПРОГРАММИСТ - Это надо переписывать" © :)
-
Ну и обязательно конечно разберись с ошибками двойного присваивания на Add, а так-же перекрытия классового оператора In. Ждем апдейта.
-
ЗЫ: ну и отдельное респектище тебе Ромч, за то что твой анализатор ввел в наш обиход такое понятие, как "передернуть переменную" :) Показав нам вот такую глупость в коде аутсорсера :) procedure ItogRebuild;
begin
with fmSetupExportItog.GsSmetaItog do
begin
if ChapterNumber=0 then
begin ChapterNumber := 1;
ChapterNumber := 0;
end
else begin ChapterNumber := ChapterNumber - 1;
ChapterNumber := ChapterNumber + 1;
end;
end;
end;
-
windows 8.1 ругается на дистрибутив (smartscreen), не дает запустить. имеет смысл, отказаться пока что от exe обертки вокруг msi.
https://dl.dropboxusercontent.com/u/26403307/smartscreen.png
-
>Показав нам вот такую глупость в коде аутсорсера :) достойно http://govnokod.ru/:) хороший анализатор, кто бы что ни говорил. стоит дальше развивать, определенно.
-
>https://dl.dropboxusercontent.com/u/26403307/smartscreen.png
у меня нормально. 8.1.
-
на вот такую конструкцию в объявлении интерфейса
function D3D11CreateDevice(
Adapter: IDXGIAdapter;
DriverType: D3D_DRIVER_TYPE;
Software: HMODULE;
Flags: UINT;
pFeatureLevels: PD3D_FEATURE_LEVEL;
FeatureLevels: UINT;
SDKVersion: UINT;
out Device: ID3D11Device;
pFeatureLevel: PD3D_FEATURE_LEVEL;
out ImmediateContext: ID3D11DeviceContext):HRESULT; stdcall; external DLL_D3D11 delayed; ругнулось Fatal parser error
-
> объявлении интерфейса
точнее это не в объявлении интерфейса :-) просто внешняя системная API функция.
-
А почему винда считает, что msi безопаснее, чем exe? Я вообще подумал, что дело в отсутствии электронной подписи, но я от этого пока далёк.
InnoSetup не умеет вроде msi делать. Вот ведь нежданный геморрой.
-
> любое нормальное ПО собирает билдсервер
можно поспорить о том, что такое "нормальное ПО", но по факту билд сервер используется крайне редко в процентном соотношении от количества проектов, на которых работают множество компаний. Конечно, это не отменяет озвученных доработок.
-
> Kerk © (08.10.14 21:27) [83] > А почему винда считает, что msi безопаснее, чем exe?
Потому что MSI для нее родное. Впрочем, изучив чуть более чем полностью этот MSI (особливо состав кодов ошибок спонтанно возникающих у нашей двухсоттысячной аудитории клиентов) я пришел к выводу - что он нафиг не нужен. Второй год юзаем InnoSetup и довольны по полной :)
-
> ProstoTak © (08.10.14 21:27) [84] > > > любое нормальное ПО собирает билдсервер > > можно поспорить о том, что такое "нормальное ПО", но по > факту билд сервер используется крайне редко в процентном > соотношении от количества проектов
Ты вот это сейчас чисто пофлудить озвучил, или в качестве экспертной оценки?
-
Еще нюанс, не всегда интерфейсы с TLB импортируются с префиксом "I", особливо в WebDav, но у них у всех есть автогенерированные хидерники (спорный конечно нюанс, но) на которые можно в принципе ориентироваться при генерации варнинга мол интерфейс должен начинаться с "I"
-
Rouse_ © (08.10.14 19:18) [75]
> 1. любое нормальное ПО собирает билдсервер, проводящий кучу > проверок при самом билде и принимающий решение на каждом > этапе - можем ли мы собрать релиз или нет.
Если код компилируется, а тем более, без предупреждений, то релиз собрать можно.
Это если говорить о "любом нормальном ПО"
А если говорить о различного рода нюансах, принятых в той или иной группе разработчиков, то на все варианты писать обвески - работа длинная и неблагодарная.
-
-
> Если код компилируется, а тем более, без предупреждений, > то релиз собрать можно.
А нюансы они ж разные, кто-то к примеру SEH воткнул в код, который будет изыматься и переводиться в пикод VM - один случай (а проект-то соберется - без проблем) Другой со скриптом инсталятора перемудрил, что он выдал ворнинг на пустом месте. Третий, забыл подключить ресур содержащий публичные RSA ключи, и проект просто не сможет расшифровать данные. Воть этим всем и занимается билдсервак, страхуя нас от ошибок.
-
ЗЫ: на данный момент у нас на билдсервере на релизе 17 этапов сборки проекта. Ручками это все... ну заколебешся контролировать. Сколько общался с ребятами из других солидных контор (DrWeb/Guardant/Simantec/ReactOS) билдсерверы везде присутствуют (разные сборки но методика в принципе идентична).
-
> Rouse_ ©
class operator In пофиксил уже. В следующем релизе будет нормально. Ну и над утилитой командной строки я думаю. Не ожидал, что там много людей о ней будут спрашивать.
-
> Игорь Шевченко © (08.10.14 22:15) [88] > А если говорить о различного рода нюансах, принятых в той > или иной группе разработчиков, то на все варианты писать > обвески - работа длинная и неблагодарная.
Кстати вопрос. Возьмем простую схему.
Для релизного билда (обычного проекта без наворотов) нужно в принципе сделать такие вещи: 1. Слить исходники с мастер бранча SVN (или другой системы контроля версий) на машину, на которой будет собираться релиз. 2. Выставить правильную версию билда (параметры мажор/минор/релиз я даже не рассматриваю, считаем их по умолчению выставлеными). 3. Собрать релиз 4. Повесить на него подпись 5. Прогнать тесты на VirusTotal, если не прошли, гоу пункт 3 6. Собрать инсталятор 7. Собрать архив из всего что должно уйти пользователю 8. Проапдейтить архив на внешнем FTP 9. Апнуть метку о версии на сайте и в репозитории автообновления. 10. Пнуть мыло манагеру, чтоб запилил новость о выходе новой версии.
Вы это все ручками делаете?
-
> Kerk © (08.10.14 22:44) [92] > Ну и над утилитой командной строки я думаю. Не ожидал, что > там много людей о ней будут спрашивать.
Первые беты сразу мне пуляй, у нас как раз скоро релиз, поэтому консолька как раз будет в тему (ну и багрепорты с первых рук получишь).
-
Rouse_ © (08.10.14 22:49) [93]
Если не трудно, все то же самое на русском языке, пожалуйста.
-
> Игорь Шевченко © (08.10.14 23:47) [95] > Если не трудно, все то же самое на русском языке, пожалуйста.
Блин :)
-
> Rouse_ © (08.10.14 22:49) [93] Если не трудно, все то > же самое на русском языке, пожалуйста.
Не знаю только как "репозитории" перевести. Может вы подскажете? Тот же вопрос касаемо "реализ" ? Но слово уже попало в словари. Так что можно считать русским. Ниже перевод на Русский язык.
Кстати вопрос. Возьмем для примера обычного проекта без наворотов и его простой алгоритм подготовки реализной версии ПО.
Для реализной сборке, нужно сделать следующие действия: 1. Скачать исходники с главной ветки SVN (или другой системы контроля версий) на машину, на которой будет собираться версия ПО; 2. Выставить правильную версию сборки. Параметры "старшая","младшая", "модификация" я даже не рассматриваю. Считаем их по умолчанию выставленными; 3. Собрать модификацию ПО с параметром реализация; 4. Экземпляр программы подписать цифровой подписью; 5. Выполнить тестирование на VirusTotal. В случае отрицательного результата перейти к 3 пункту; 6. Собрать установщик; 7. Собрать архив из всего что должно быть отправлено пользователю 8. Обновить архив на внешнем сервере FTP; 9. Обновить сообщение о версии на сайте и в репозитории автообновления; 10. Отправить сообщение менеджеру, чтобы тот сообщил новость о выходе новой версии.
Вы это все ручками делаете?
-
Rouse_ © (08.10.14 22:49) [93]
> Кстати вопрос.
> Вы это все ручками делаете?
Кстати не до конца понимаю, какое отношение технология сборки, принятая в нашей компании (или в иной другой) имеет отношение к теме ветке. Я полагаю, что это не та тема для беспокойства Разумеется, у нас сборка автоматизирована.
Что касается целесообразности применения подобной программы на этапе сборки, то я по-прежнему придерживаюсь мнения, что она нецелесообразна. Точно так же, как в систему контроля версий должен попадать код, который компилируется без предупреждений, можно договориться, чтобы в репозиторий попадал код, который проходит проверки без сообщений.
-
Господа, мне нужны счастливые обладатели Delphi 2006, 2007 или 2009 для тестирования. Напишите мне, пожалуйста, в почту (в анкете) или оставьте тут свою. Заранее благодарю.
-
2007 могу оттестировать, 2006 - вроде где-то валялся дистрибутив, но мы давно с него спрыгнули, боюсь не смогу найти ключей активации. Да кстати сорь - сегодня твою консольку не затестировал, бо запарка была по полной, завтра буду проверять.
-
Ты с UTF-8 BOM префиксом точно все пофиксил? А то опять IDE ляжет наглухо, что не хотелось бы :)
-
Пофиксил, да. Тестировал на том твоем юните и с ним все в порядке. Ссылку тебе слать не буду, потому что она у тебя есть. Но скачай завтра лучше заново, может до тех пор еще что-нибудь пофикшу :)
-
Ну и ради меня не стоит 2006 ставить. Достаточно того, что есть :)
-
> Kerk © (23.10.14 20:20) [102] > Пофиксил, да. Тестировал на том твоем юните и с ним все > в порядке. Ссылку тебе слать не буду, потому что она у тебя > есть. Но скачай завтра лучше заново, может до тех пор еще > что-нибудь пофикшу :)
Кстати знаеш что подумал, я правда не уверен что такие файлы дельфя генерирует, но работать с ними она умеет. Ты енкодинг модуля без BOM префикса тестил?
А завтра проверю, но скорее уже не я а Женька, я только общие моменты, а вот как его встраивать в билдсервак, это только он сможет сказать кгде у тебя косяки.
-
Прочто чем это грозит, если ты не распознаешь UTF и будешь трактовать как ANSII, то сразу можешь влететь на символ "{" который будет частью UFT символа. Сам понимаешь - весь парсинг уплывет, а то еще и ошибку выдаст если закрывающего "}" не найдет.
-
Нет, если преамбулы нет (так вроде оно научно называется), то кодировка не распознается. Это у меня сделано средствами дельфового класса TEncoding, а он ориентируется на первые байты. Не уверен, что требуется что-то более сложное. Но посмотрим.
-
Вышла версия 2014.11 В ней есть: * Утилита командной строки * Поддержка версий 2006, 2007 и 2009 * Возможность иметь свои настройки для каждого проекта * Исправленные баги
-
-
На Delphi 7 не ставится. Пичалька...
-
> mike-d © (27.03.15 07:00) [109] > > На Delphi 7 не ставится. Пичалька...
К сожалению, так. Но утилита командной строки работает с любыми версиями Delphi. Правда, это уже не так удобно. Поискал баги в VCL :) Нашлась пара интересных мест. http://roman.yankovsky.me/?p=1748
-
>Kerk © (27.03.15 10:50) [110]
надо будет на работе попробовать твою тузлу, правда там дельфя 7
-
>virex(home) © (28.03.15 07:45) [111]
проверил консольной утилитой
просто вывод в консоль работает, а при отправке в файл - содержимое "обрывается"
пример: тузла --xml --project=c:\...\...dpr > 1.txt
в файле 1.txt не весь вывод тузлы
-
C102 Too many parameters in 'TAjaxEvent.Invoke'
TAjaxEvent = class(TInterfacedObject, IDispatch) ... function Invoke(DispID : Integer; const IID : TGUID; LocaleID : Integer; Flags : Word; var Params; VarResult : Pointer; ExcepInfo : Pointer; ArgErr : Pointer) : HRESULT; stdcall; ---
А есть ли там предупреждения типа :
- имя метода начинается с буквы "I" - если сложить коды символов в имени переменной xxx то получится число зверя 666? ну и т.д.
-
>кгшзх © (30.04.15 08:37) [113]
да кстати не помешало бы отключать некоторые проверки доп. опциями в консольной утилите
а так утилита полезная, вчера рефакторинг делал в древнем проекте куча ошибок создания объекта в try и уничтожения в finally
-
-
> Kerk
Еще бы fast fix добавить, где это возможно - полная конфета была бы. Понимаю, не просто. Ну на будущее - как вариант развития.
-
[FixInsight Warning] fmuVisualListWare.pas(453): W508 Variable is assigned twice successively
tmrFilter.Enabled := false; tmrFilter.Enabled := true;
-
> Kerk Кстати, обрати внимание на: http://pda.delphimaster.net/?id=1430333783&n=3Возможное добавление к списку подозрительных конструкций: некорректное использование вложенной функции. Диагностировать можно по описателю stdcall (хотя это и грубовато, пожалуй).
-
> Cobalt © (30.04.15 15:43) [117]
Похоже на умышленный сброс таймера. Вообще, подобные конструкции иногда используются для того, чтобы "дернуть" код внутри VCL (например, что-то пересоздать). Некрасиво, конечно, но если нормального способа не предусмотрено, то ничего другого не остается.
Но FixInsight сработал правильно, место подозрительное.
-
> Юрий Зотов © (30.04.15 13:56) [116] > > > Kerk > > Еще бы fast fix добавить, где это возможно - полная конфета > была бы. Понимаю, не просто. Ну на будущее - как вариант > развития.
Что-то такое иметь было бы очень здорово. Постепенно, надеюсь, все получится. Вообще, как можно плотнее интегрироваться с IDE - один главных приоритетов.
> Юрий Зотов © (30.04.15 20:58) [118]
Я бы на самом деле на любую передачу указателя на вложенную функцию ругался. Случаи, когда это оправдано придумать сложно, а вот проблем не оберешься.
> Юрий Зотов © (30.04.15 21:06) [119] > > Но FixInsight сработал правильно, место подозрительное.
Такие ситуация - моя большая боль. Одно дело действительно настоящие ложные срабатывания, с которыми я борюсь как могу. А другое - когда срабатывание верное, но программист эту ситуацию умышленно допустил. Это все-таки всего-лишь анализатор, а не искусственный интеллект, он не может такие тонкие вещи прочувствовать.
И по-моему в таком случае от предупреждения нет никакого вреда, человек просто посмотрит, убедится, что все в порядке и пойдет дальше.
А боль это для меня потому, что многие пользователи ждут от инструмента совершенно магического поведения и расстраиваются, что это не так. Имеют право, конечно.
-
> Kerk
> Это все-таки всего-лишь анализатор, а не искусственный интеллект, > он не может такие тонкие вещи прочувствовать.
Естественно. Да и не нужно ему ничего чувствовать. А вот ввести что-то типа опции ON/OFF было бы, наверное полезно. Примерно так:
В своем модуле определяешь две опции:
{$DEFINE FixInsightOn} {$DEFINE FixInsightOff}
И если юзер хочет локально отключить FixInsight, то пишет что-то вроде этого:
{$FixInsightOff} tmrFilter.Enabled := false; tmrFilter.Enabled := true; {$FixInsightOn}
Код неверный, но суть показывает.
-
То есть, речь идет о комментарии специального вида. Встретив открывающий комментарий, FixInside пропускает код до закрывающего комментария (а если его нет, то до конца модуля).
-
Kerk © (30.04.15 22:50) [120]
> Я бы на самом деле на любую передачу указателя на вложенную > функцию ругался. Случаи, когда это оправдано придумать сложно, > а вот проблем не оберешься.
итераторы в Collections в Turbo Vision. Я не понимаю, почему они так сделали, но факт остается фактом.
Если вложенные функции допустимы конструкцией языка, то почему бы и не передавать указатели на них ? :) Я не понимаю (за 20 с лишним лет программирования на паскале) конструкции repeat ... until и за все это время использовал ее считанное количество раз, но не ругаюсь, когда ее используют другие :)
-
>Я не понимаю (за 20 с лишним лет >программирования на паскале) конструкции >repeat ... unti
А вот это интересно.
Repeat тоже самое что while, только в первом случае тело цикла первый раз выполняется всегда, а потом уже проверяется условие, во втором случае сначала проверяется условие. В зависимости от задачи бывает удобно то так, то эдак. Что тут может быть непонятного?
-
Классика:
if FindFirst(FileName, faArchive,SearchRec) = 0 then repeat if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then begin ... end; until FindNext(SearchRec) <> 0;
Как это переписать так же лаконично через while?
-
Ну например как в си плюс в цикле for можно использовать ++i а можно i++ Бывает удобно так, бывает эдак.
Хочется послушать размышлений насчет непонимания.
-
> eldorad © (01.05.15 12:52) [126]
Похоже, Игорь имеет в виду не сам цикл, а условие выхода из него. Когда-то давно я тоже не сразу привык, что repeat заканчивается на true.
-
Дядя Юра, сказано достаточно четко:
Я не понимаю ... конструкции repeat ... until и за все это время использовал ее считанное количество раз
-
> Ну например как в си плюс в цикле for можно использовать > ++i а можно i++ > Бывает удобно так, бывает эдак.
C точки зрения производительности (в общем случае) - нужно писать ++i. Но если i - встроенный тип, то современные компиляторы соптимизимруют.
-
У нас тут в коде у нас нашлось такое:
Result := Result;
-
Вовч, это ерунда. Помнишь, когда у нас еще работал был такой Леха и его код? Оть это была реальная жесть, один тока перечислимый тип из полутора тыщ констант чего стоил :)
-
> Юрий Зотов © (01.05.15 09:14) [121] > И если юзер хочет локально отключить FixInsight
Так есть что-то похоже уже. Можно использовать директиву компилятора _FIXINSIGHT_.
[delphi] {$IFNDEF _FIXINSIGHT_} tmrFilter.Enabled := false; tmrFilter.Enabled := true; {$ENDIF} [/delphi]
Если директива _FIXINSIGHT_ установлена, значит идет анализ кода. И можно этим пользоваться, исключать какие-то куски.
> Игорь Шевченко © (01.05.15 10:47) [123] > Если вложенные функции допустимы конструкцией языка, то > почему бы и не передавать указатели на них ? :)
Допустимыми конструкциями языка является вообще много что. Например пустой except вполне допустим, и метод длиной 1000 строк тоже допустим, и даже Result := Result вполне допустимая конструкция :)
Но имхо, передача указателя на вложенную функцию - хороший способ выстрелить себе в ногу. В любом случае, даже если такая проверка будет, ее можно будет отключить в настройках.
По поводу отключения проверка, у меня есть забавная история.
При удалении FixInsight открывается окошко с просьбой рассказать почему человек его удаляет: что-то не понравилось, не работает и т.п. Большинство это окошко просто молча закрывает, но некоторые отвечают. Это полезно.
Так вот один из отзывов звучит примерно так: "у меня плохой код, я это и сам знаю, утилита мне не нужна" :)
> Юрий Зотов © (01.05.15 15:26) [127] > > > eldorad © (01.05.15 12:52) [126] > > Похоже, Игорь имеет в виду не сам цикл, а условие выхода > из него. Когда-то давно я тоже не сразу привык, что repeat > заканчивается на true.
Я тоже постоянно на этом спотыкаюсь. Так-то с точки зрения английского языка все понятно ("пока не..."), но непонятно почему для постусловия нельзя было использовать тот же while.
Типа, [delphi] begin Dec(I); end while (I > 0); [/delphi] Хотя сейчас смотрю на этот код и неестественно он как-то выглядит.
-
> непонятно почему для постусловия нельзя было использовать > тот же while
Как раз с точки зрения английского понятно. :) "В то время как" никак не вяжется с пост-условием.
-
> Оть это была реальная жесть, один тока перечислимый тип > из полутора тыщ констант чего стоил :)
А чё в прошедшем-то времени-то? Да и кот этот никуда не делся.
-
> Rouse_ © (01.05.15 21:21) [131] > > Вовч, это ерунда. Помнишь, когда у нас еще работал был такой > Леха и его код? > Оть это была реальная жесть, один тока перечислимый тип > из полутора тыщ констант чего стоил
Неужто кому-то было не лень писать столько констант? Или он автоматизировал сей процесс? :)
-
> Kerk © (01.05.15 21:29) [132] Если вместо общих begin-end использовать специальные ключевые слова, то все становится естественно. Например: repeat
...
while ... ;
-
> Когда-то давно я тоже не сразу привык, что repeat заканчивается на true.
В Паскале везде работает простая мнемоника: при истинном условии всегда проваливаемся ниже к следующему оператору, при ложном условии - последовательное выполнение операторов нарушается.
-
> C точки зрения производительности (в общем случае) - нужно > писать ++i
Жень, я про порядок выполнения операций.
В общем, ИШ что-то такое сказал, что гадать бессмысленно :) Или автор пояснит, или это навсегда останется тайной :)))
-
> Жень, я про порядок выполнения операций.
Э-э-э. В контексте цикла for какое это имеет значение? for (auto it = begin(container); it < end(container); it++)
...
for (auto it = begin(container); it < end(container); ++it) логически обе формы эквивалентны. А вот с точки зрения производительности разница есть.
-
Что-то там такое. В первом случае может быть вызван конструктор, присвоение во временную переменную, сравнение с ней, инкремент первой, возврат из операции инкрементированной переменной. Во втором работа с одним экземпляром.
Паскалевсикй цикл с постусловием требует каждый раз вспоминания его особенности.
-
Sha © (02.05.15 15:49) [137]
> В Паскале везде работает простая мнемоника: > при истинном условии всегда проваливаемся ниже к следующему > оператору, > при ложном условии - последовательное выполнение операторов > нарушается.
И для соответствия этой мнемонике существует два разных оператора проверки условия продолжения цикла, потому они в разных местах записи цикла находятся ?
-
> И для соответствия этой мнемонике существует два разных > оператора проверки условия продолжения цикла, потому они > в разных местах записи цикла находятся ?
Ну вроде бы/как бы ДА. Если сначала нужно проверить некое условие, а потом что-то делать в зависимости от результата проверки, то while. Но если нужно обязательно что-то сделать хоть один раз, то почему бы и не repeat?
-
> Игорь Шевченко © (03.05.15 00:33) [141]
Мнемоника помогает запомнить, что и как. Она подбирается так, чтобы соответствовать чему-либо, а не наоборот.
-
Было бы удобно еще иметь в Delphi конструкцию вроде while-else, то есть цикл и отдельная ветка для случаев, когда он ни разу не выполнился.
Вроде
while i > 0 do Dec(I) else ShowMessage('I <= 0');
-
> [144] Kerk © (03.05.15 20:21)
Имхо, Оккама знал об этом.
-
Согласен с Kerk
-
несогласен с eldorad )
-
И строковый case. :o)
-
Согласен с дядей Юрой. Впрочем конструкция множественного else if не занимает больше места.
-
Для case компилятор мог бы какие-нибудь оптимизации применять.
-
Строковый case с регулярками
-
> Юрий Зотов © (04.05.15 09:28) [148] > > И строковый case.
Ну да. А то "женщины уже в баскетбол играют!" (с) То бишь я хотел сказать, что в Лазарусе уже есть такой case. :)
-
С Format-ом есть баг. Ругается на
Result := Format('uif_%.*x', [8, I]);
Хотя количество аргументов именно то, которое должно быть - два.
-
и индесацию параметров тоже не понимает:
Lines.Add(Format(#9#9'<%s>%d</%0:s>', [xme_FilePos, FilePos]));
-
> q1w2e
У тебя похоже старая версия. Обновись.
-
Да, так и есть. После обновления ушло.
Но что-то я не разобрался как обучить утилиту командной строки разбору условной компиляции. Подозреваю, что как-то это можно сделать .ficfg-файл.
Где-то можно об этом почитать?
-
>Как это переписать так же лаконично через while?
k := FindFirst(RootPath + 'Html\Report*.html', faReadOnly, SearchRec); while k = 0 do begin ShowMessage(SearchRec.Name); k := FindNext(SearchRec); end;
?
-
>Некрасиво, конечно, но если нормального способа не предусмотрено, то ничего другого не остается.
Я у себя делал специальный таймер TThreadTimer - работающий в параллельном потоке и вызывающий код в параллельном потоке, добавил методы Start, Stop и Restart. Почему что-то такое не добавить в VCL/FMX? Неудобно же как есть.
-
> q1w2e © (19.05.15 18:00) [156] > > Да, так и есть. После обновления ушло. > > Но что-то я не разобрался как обучить утилиту командной > строки разбору условной компиляции. Подозреваю, что как- > то это можно сделать .ficfg-файл. > > Где-то можно об этом почитать?
Директивы компиляции в командной строке можно указывать с помощью параметра --defines А написано про это в документации :)
-
> Дмитрий Белькевич © (20.05.15 12:36) [158] > > >Некрасиво, конечно, но если нормального способа не предусмотрено, то ничего другого не остается. > > Я у себя делал специальный таймер TThreadTimer - работающий > в параллельном потоке и вызывающий код в параллельном потоке, > добавил методы Start, Stop и Restart. Почему что-то такое > не добавить в VCL/FMX? Неудобно же как есть. Мне кажется, не стоит нагружать Embarcadero вещами, которые может сделать каждый программист. Они со своими-то не справляются. А им это ещё поддерживать для разных платформ...
-
> Kerk © (23.05.15 13:42) [159] > Директивы компиляции в командной строке можно указывать > с помощью параметра --defines > А написано про это в документации :)
Ну конечно, я это пробовал. Легче не стало. Директивы компиляции по какой-то причине у меня игнорируются, происходит парсинг всего текста модуля. Вот коротенький пример для иллюстрации:
unit Test;
deprecated;
interface
implementation
end.
Содержимое Definitions.inc:
-
Покажи что в командной строке пишешь. А инклуды пока не поддерживаются, к сожалению.
-
Вообще-то ничего писать, по идее, не требуется в случае анализа проекта TEST_1.DPR, так как, во-первых, символ имени проекта определяется самим компилятором, и во-вторых, он присутствует в настроечных файлах проекта TEST_1.DOF и TEST_1.CFG. Однако, эксперимента ради я могу указать и впрямую этот символ в параметрах командной строки:
FixInsightCL.exe --project=TEST_1.DPR --defines=TEST_1.DPR
Если, как Вы пишите, включения не поддерживаются, то все равно работать, видимо, не будет.
-
При работе с командной строкой можно ли как-то ограничить множество выполняемых проверок, например, перечислив их в какой-нибудь секции настроечного файла (.ficfg ?)? Где об этом почитать?
-
Было бы здорово разделить W504 на отдельно пропущенный inherited в конструкторе и деструкторе. Дело в том, что часто предупреждение в конструкторах ложное, так как имеется несколько перегруженных конструктуров, конструктор предка зовется лишь в одном, а остальные зовут этот первый. Например:
type
TValue = class
constructor Create; overload;
constructor Create(const AValue: Integer); overload;
constructor Create(const AValue: string); overload;
end;
С деструкторами ситуация получше - там практически каждое срабатывание по делу, так как необходимость перегрузки деструкторов крайне редка.
-
> q1w2e © (26.05.15 15:59) [164] > > При работе с командной строкой можно ли как-то ограничить > множество выполняемых проверок, например, перечислив их > в какой-нибудь секции настроечного файла (.ficfg ?)? Где > об этом почитать?
Можно. В IDE в диалоге настроек настраиваешь все как хочешь. В результате рядом с проектом появляется тот самый файл .ficfg. При работе через командную строку по умолчанию будут взяты настройки из файла, который лежит рядом с проектом, но ты можешь указать путь к другому файлу настроек с помощью параметра --settings.
-
> q1w2e © (01.06.15 16:18) [165] > > Было бы здорово разделить W504 на отдельно пропущенный inherited > в конструкторе и деструкторе. Дело в том, что часто предупреждение > в конструкторах ложное, так как имеется несколько перегруженных > конструктуров, конструктор предка зовется лишь в одном, > а остальные зовут этот первый.
Это уже сделано в следующей версии, которая пока не вышла. Думаю, в июне она появится на сайте.
-
К сожалению, работаю в delphi 5
-
Если еще интересуют идеи по отлову багов, то решусь предложить такой частый баг копипаста
if Assigned(P) then
Exit;
P.DoSomething;
ну или симметричный:
if P = nil then
P.DoSomething;
Можно попробовать отловить такие обезниливания указателей хотя бы в простейших случаях.
-
Вот так файл .ficfg выглядит для текущей версии (2015.04) http://pastebin.com/CNa89vdnСохрани куда-нибудь. Отредактируй значения руками, там вроде очевидно что как.
-
Спасибо. С cfg- все ясно. 1. Ошибка W521 иногда шумит:
function GenerateTempFileName(const Dir: string): string;
var
I: Integer;
begin
for I := 0 to 65535 do
begin
Result := AddBk(Dir) + Format('~tmp%d.dbf', [I]);
if not FileExists(Result) then
Exit;
end;
end;
2. Хороша была бы подсказка о неиспользованных параметрах, передаваемых в процедуру, но только при условии, что можно ее включать/выключать раздельно: - для вложенных процедур; - для процедур и функций глобальных для модуля (область видимости implementation); - для процедур и функций глобальных для программы (область видимости interface); - для конструкторов / деструкторов; - для виртуальных и динамических методов; - для методов-обработчиков событий объектов VCL; - для методов-обработчиков событий Windows; - для методов объектов с видимостью published; - для остальных методов.
-
Можно еще предложения? Если да, то было бы здорово ловить getеter-ы и setter-ы свойств, которые опрокидывают программу в рекурсию.
procedure TMyClass.SetMyProperty(const Value: TMyType);
begin
if MyProperty <> Value then
MyProperty := Value;
end;
-
Незаметно подкралась новая версия. 2015.08. Сделана полноценная поддержка директивы $INCLUDE. Анализируются теперь не только файлы напрямую включенные в проект, но и используемые файлы из search path (отключаемо). Плюс пара новых правил. Вот такое, например. W526 Pointer to a nested method procedure TMyClass.DoWork;
procedure NestedMethod(List: TObjectList); var I: Integer; begin for I := 0 to List.Count - 1 do Foo(Self, List[I]); end;
begin SetCallback(@NestedMethod); // <------ end; Скачивать все там же :) http://sourceoddity.com/fixinsight/download.html
-
На правах предложений: Меня очень порадовало в Intellij Idea следующее предупреждение: "'scrollLeft' should probably not be assigned to 'top'" на код: var top = document.scrollLeft;
-
> Kerk © (25.08.15 12:31) [173]
Предложение: добавить в анализатор отслеживание ситуаций, когда адрес приводится к 4-байтовому целому. Полезно при переносе 32 бит кода в 64.
-
DVM © (25.08.15 13:30) [175]
> Полезно при переносе 32 бит кода в 64.
А что, регулярный процесс ? Просто интересно
-
> Игорь Шевченко © (25.08.15 16:16) [176]
> А что, регулярный процесс ? Просто интересно
Ну мне частенько такое встречалось (в последнее время правда реже, все что надо уже перенесено на 64 бит).
-
-
> Игорь Шевченко © (25.08.15 16:16) [176] > А что, регулярный процесс ? Просто интересно
Конечно регулярный, более того скажу, нам ручками приходится перепарсивать исходники от DevExpress с целью поиска, поправили ли они очередной пак ошибок, которые мы высылали или нет. Поэтому в любом коде, где есть сторонние классы имх нужно делать такую проверку.
-
> Kerk © (25.08.15 12:31) [173]
static постфикс у Nested процедур/функций обрабатываешь?
-
Это что такое?
-
> Kerk © (25.08.15 18:18) [181] > Это что такое?
Self отключается. Кстати ты почаще в аську выходи бо к примеру несколько дней мне нужна твоя помощь, а я не знаю как до тебя проще достучаться :)
-
Не, такое пока не учитывается.
Я всегда есть в скайпе roman_yankovsky Или джаббере roman@yankovsky.me Плюс почта конечно же
Сейчас попробую аську включить. Но там я редко.
-
> Kerk © (25.08.15 19:28) [183] > Не, такое пока не учитывается. > > Я всегда есть в скайпе roman_yankovsky > Или джаббере roman@yankovsky.me > Плюс почта конечно же > > Сейчас попробую аську включить. Но там я редко.
не, аську не надо, если в скайпе - завтра подключусь.
-
> Kerk © (30.04.15 13:24) [115] > > > virex(home) © (30.04.15 09:47) [114] > > > > >кгшзх © (30.04.15 08:37) [113] > > > > да кстати > > не помешало бы отключать некоторые проверки доп. опциями > > > в консольной утилите > > Это можно делать и это упомянуто в документации. > Тут я рассказываю подробнее как это сделать http://fixinsight. > userecho.com/topic/686863-command-line-client-define-rules- > per-parameter/ With the FixInsight trial version you may run any analysis, as in the full version, but some limitations apply: the trial reports no more than five messages per unit, and the option to exclude a list of units from analysis is disabled.теперь понятно почему в консоли не работает скачал новую версию, а тут такое
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
> virex(home) © (26.11.15 08:11) [185]
Ну так это всегда так было :)
-
порадовал вывод консольной утилиты File: c:\..\.......pas
Fatal parser error (17, 1) ошибка в 17 строке оказалось в uses было две запятые возможно удаляли "лишние" библиотеки какой-нибудь утилитой и получилось чтото вроде uses StrUtils,Windows,,Classes...
-
А как оно компилировалось? :)
-
> А как оно компилировалось? :)
никак
это было в одном из проектов, в настоящее время не использущийся модуль
з.ы. вообще это ПО которое я "поддерживаю" работает примерно с 2002 года, уже несколько лет его пытаются заменить на что-то другое этакий "мастдай", как delphi которая вот вот прекратит свое существование была попытка перенести всю функциональность в SAP, теперь думают об 1С но столько человекочасов вложенных в это ПО, столько логики нереально мигрировать в другие программные решения быстро и уж темболее бесплатно поэтому пока так
-
-
> Kerk © (27.11.15 17:54) [193] > > Новая серия сериала
Была у меня как-то мысля попробовать ради собственного интереса сделать что-то на FMX. Но как-то сразу интерес пропал. :(
-
Ну там не так все плохо, как может показаться. У нас есть одно приложение на FMX. Полет вполне нормальный.
-
Да, сейчас - это уже не то, что было в XE2, качество лучше.
-
> Eraser © (28.11.15 20:25) [196] > > Да, сейчас - это уже не то, что было в XE2, качество лучше. > >
Я пробовал в ХЕ5. Качество было очень сырое.
-
и не XE5 ) там достаточно взглянуть на список исправленных багов от каждой новой версии, каждый раз удивляюсь, как оно вообще раньше работало. на данный момент детские болезни они почти побороли.
> Kerk © (28.11.15 18:19) [195]
вот, кстати, давно хотел спросить, не собираются ли делать ARC версию компилятора под Mac OS? Сейчас получается, что это и не VCL и не FMX в полной мере, стиль кода ARC там использовать нельзя, или я что-то путаю?
-
Ничего, честно говоря, не слышал про Mac OS. Но я бы не ждал в ближайшее время каких-то кардинальных изменений в компиляторах.
Мне вообще этот ARC не нравится. Просто потому, что поломали переносимость кода между платформами. Было бы лучше везде одинаково работать. И строки индексируемые с нуля такая же глупость.
-
> Eraser © (29.11.15 04:32) [198] > > и не XE5 ) > там достаточно взглянуть на список исправленных багов от > каждой новой версии, каждый раз удивляюсь, как оно вообще > раньше работало. на данный момент детские болезни они почти > побороли. >
А не детские болезни когда лечить начнут?
-
-
Kerk © (01.12.15 15:53) [201]
"Navigator will show you a window with everything in your current unit"
А если юнит на пару тысяч строк ?
-
Он показывает окно с полным списком всего, что есть в модуле. Ты начинаешь набирать имя идентификатора или его фрагмент и оно автоматически на ходу фильтрует список. В итоге тебе остается выбрать из нескольких вариантов (а может и всего один останется), щелкнуть и перейти к нему в коде.
То есть буквально все сводится к CTRL+G -> набор куска идентификатора -> ENTER.
Там есть бесплатный триал. Если интересно, установи поиграться, штука интересная.
-
-
Kerk © (01.12.15 16:46) [203]
Мне не интересно, я не ищу через Ctrl+F, F3, F3, F3, мне достаточно просто посмотреть на интерфейсную часть, она вполне обозримая (я про свой код, разумеется, в чужом - может и полезный плагин, но покупать для себя - смысла не вижу)
-
Ну не интересно, так не интересно. Есть люди, кому нравится. Мне в том числе. Тут уж на вкус и цвет...
-
-
-
-
-
спасибо :)
-
> То есть буквально все сводится к CTRL+G -> набор куска идентификатора > -> ENTER.
А глобальный поиск есть?
А в стиле Inellij: например, набираешь "ali", находит "ArrayList"
-
> DayGaykin © (08.06.16 12:20) [212]
Насколько я знаю, только в пределах юнита.
-
Как же дельфи отстает )) И правда, в idea этот функционал встроен на базовом уровне для всех поддерживаемых языков...
-
>А если юнит на пару тысяч строк ?
какой юнит. Idea ищет по всему проекту, а можно и по всем используемым фреймворкам, и это работает. Я представляю иерархию классов и плохо представляю иерархию юниотов. Глупо звучит для дельфи и реальность для современных сред, вопрос возможности ориентирования во всем этом.
-
> DayGaykin © (08.06.16 12:20) [212] > > А в стиле Inellij: например, набираешь "ali", находит "ArrayList"
Неужели такой поиск так уж очень нужен?
-
> Германн © (09.06.16 00:42) [216] > > > DayGaykin © (08.06.16 12:20) [212] > > > > А в стиле Inellij: например, набираешь "ali", находит > "ArrayList" > > Неужели такой поиск так уж очень нужен?
Да. Очень удобно. В автокомплите особенно.
-
> DayGaykin © (09.06.16 01:01) [217] > > > > Германн © (09.06.16 00:42) [216] > > > > > DayGaykin © (08.06.16 12:20) [212] > > > > > > А в стиле Inellij: например, набираешь "ali", находит > > "ArrayList" > > > > Неужели такой поиск так уж очень нужен? > > Да. Очень удобно. В автокомплите особенно. >
Ну тогда он очевидно должен искать идентификаторы с учетом регистра. Иначе он может найти столько совпадений, что замучаешься листать сей список. Тогда для чего сей поиск нужен? В большинстве случаев так формируются имена типов. А зачем их искать?
-
> Иначе он может найти столько совпадений, что замучаешься > листать сей список.
это теория. А на практике остается пару вариантов, причем твой вариант обычно вверху, если поиск грамотный.
Ты же ищешь в гугле буквально тремя словами то, что тебе нужно, а там информационная база куда больше, чем какой-то IT проект. Так что всё это отлично работает, хотя и непривычно "старичкам".
-
а еще из непривычного, что в IDEA нет понятия сохранения как такового. Отлично отучает постоянно жать CTRL+S, CTRL+SHIFT+S :))
-
-
Круто. Поздравляю!
-
> Kerk © (20.06.16 12:18) [221]
Рома, поздравляю! Это действительно большой шаг. А бесплатная версия где-нибудь осталась?
-
Нет. Не правильно задал вопрос. Нужно так - Какая-нибудь бесплатная версия будет?
-
Рано или поздно будет. Давно об этом думаю :)
-
>Германн © (21.06.16 02:53) [224] > Нет. Не правильно задал вопрос. > Нужно так - Какая-нибудь бесплатная версия будет?
консольная
-
> virex(home) © (22.06.16 05:59) [226]
наоборот. консоль больше интересна корпоративщикам.
-
>Eraser © (22.06.16 06:01) [227] > > > virex(home) © (22.06.16 05:59) [226] > > наоборот. консоль больше интересна корпоративщикам.
у меня д7 меня и консольная устроит
-
Удалено модератором Примечание: Создание пустых сообщений
|