Перейти к содержимому
Форумы SkyCentre Прыжки с парашютом
Igor

Программное западло - прораммисты трут здесь

Recommended Posts

Теперь я уже несколько отошел и могу говорить не только матом :) А что было, что было... Дано: программа грузит статикой чужую DLL и вызывает от туда функцию, которая помимо прочего коннектится к MS SQL. Запускаю программу, при вызове функции приходит ошибка от MS SQL, что невозможно идентифицировать SSL соединение. Сольно удивившись, начинаю смотреть исходники. Там никакого намека на SSL нет, в интерфейсе DLL тоже никакого намека на защищенное соединение нет. Написал тестовую программу: все работает. Убрал все лишнее, сделал одинаковыми настройки компиляции и линковки: все работает. Окончательно озверев, взял Olly Debuger и полез в DLL. Вижу, что внутри, действительно, стоит флаг защищенного соединения, но вот при загрузке он не выставлен. Что же оказалось. Особо умные разработчики DLL прописали ей фиксированный адрес загрузки, расчитанный на стек стандартного размера, а в моей программе (причины не важны) я выставил у компилятора увеличенный стек. В результате стек накладывался на буфер DLL и при использовании кучи туда заносилось значение, как раз совпадающее с режимом установки SSL соединения. Нарочно не придумаешь :) Если бы мне дали задание написать стандартную атаку с переполнением буфера с подобным эффектом, я бы ну очень долго думал. А тут самостоятельно и безо всякой инициативы... :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

игорь, при всем уважении, ты чего-то не докопал.

не может стек, пусть даже увеличенного размера сам по себе залезть в кучу. (мы о винде говорим?)

скорее всего там что-то связано с перелокацией

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
игорь, при всем уважении, ты чего-то не докопал.

не может стек, пусть даже увеличенного размера сам по себе залезть в кучу. (мы о винде говорим?)

Windows XP Pro, SP2

скорее всего там что-то связано с перелокацией

Именно с ней! Я же написал, что все пошло из-за того, что у DLL был прописан фиксированный адрес загрузки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Программируйте на Java :P

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Программируйте на Java :P

Ну ее нафиг эту песочницу :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
А тут самостоятельно и безо всякой инициативы... smile.gif

бывают умельцы...

вот такой код недавно знакомые увидели и похвастали

if(fld==null)

fld=new boolean[fld.length][fld[0].length];

говорят, он еще и работает...

:)

Программируйте на Java  :P

ааа!! садист :blink:

что тебе Igor плохого сделал? :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну про баяны типа

#define true rand()%2

уже все забыли...

Росскажу историю в тему...

было это довольно давно... пришел к нам бразильский код. Сказать гнилой - ничего не сказать... К слову код на j2me :D нужно было спортировать под пару дывайсов... Количество матов, высказаных в адрес разрабов этого уже и не припомнить - вероятней всего разрядности инта не хватит. С горем пополам сделали самое ужасное Nokia s40g1... на очереди детский лепет SE К700... запускаем... null pointer в потоке с прорисовкой... вроде ничего особенного... только после пары часов копания - никто не может выяснить кто кидает эксепшн... вобщем через 2 дня матов, пива, и прочих стимуляторов мозговой деятельности, когда мозги полностью отключились, кто-то спрашивает "А что у нас валилось" пол конторы валит к телу, а у него всё работает... Далее диалог:

-что сделал???

-ничего

-мл@, что сделал???

-да чесно ничего

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

потом таки разгребли: чувак выводил на экран некую инфу(и это при том, что поток в котором отрисовка - валиться) и всё работало, как только из paint'а убирали все drawString - валилось. От чего такая фигня никто не понял, все сошлись на гипотезе, что сониэрику(а точнее его ява машине) не понравилось, что для того, что-б что-то нарисовать нужно пролопатить порядка 50классов, но когда он находит, что рисовать в родном методе - остальное ему пофиг и он его обрабатывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ну про баяны типа

#define true rand()%2

уже все забыли...

Не забыли, но это сознательно организованное западло, а здесь речь о том, что все получилось само сабой :)

Кстати. Вот еще одна засада. Как-то втроем мы отлаживали пару дней код любителя STL вообще (ничего не имею против, сам ее люблю) и auto_ptr в частности (а вот за это ...). Код постоянно вылетал с исключениями нулевого указателя. Знающие, наверное, уже все поняли :) Так вот там было 8 уровней передачи указателей, и на каком-то уровне человек не уследил, что исходный auto_ptr уже стал равен нулю. В результате он передавал его дальше, и дальше, и дальше... Пока в конце концов этот бедный нулевой указатель не оказывался совершенно в другой части программы, где его давали на вход конструктору std::wstring, который благополучно вылетал с исключением, потому что конструктор строк в STL нулевые указатели не принимает :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Купил недавно книгу "С++ для чайников" и понял, что надо было брать "С++ для идиотов"

(с)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Программируйте на Java  :P

Ну ее нафиг эту песочницу :)

ааа!! садист

что тебе Igor плохого сделал?

Вообще-то на эту "песочницу" спрос всё растёт и растёт, практически сколько уже себя помню. Поэтому я уже давно забыл C++ и все вышеописанные в топике проблемы :lol: Возможно, вы не интересовались новостями о развитии Java-технологий лет эдак 6-7 и не очень представляете себе возможности и современные области применения? :P

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По компам бродят с давних пор

Фортран, Ассемблер и Алгол

В системах РАФОС, МОС и Примус.

Hо монстров этих я боюсь,

Ведь я ленивый -- это минус.

Я стал писать на С++.

И мне, поверьте, очень жаль,

Тех, кто использует Паскаль.

Такой программер прост, как график синус,

Он вместо пива хлещет джюс,

Он приземленный -- это минус,

А я пишу на С++.

Однажды в дальних этипах (* FTP )

Hа буржуинских серверах

Я видел странную картину:

Лежит там странный карапуз,

Его зовут С--,

Hо лучше все же С++.

Мне говорят, что я дурак --

Программы я пишу не так.

"Попробуй софт писать под Линукс!"

Hо я пишу под полуось,

Без наворотов -- это минус,

Hо так устроен С++.

Hо вот прошли мои года,

Прощусь я с компом навсегда,

Kогда копыта я откину.

Я своим творчеством горжусь...

Я уже умер? Это минус.

Hо я писал на С++.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В последнее время часто стали появляться вопросы: Как выбрать шаманский бубен программиста? Каким должен быть бубен? Специально для того, чтобы ответить на эти вопросы и развеять ряд накопившихся мифов и заблуждений вокруг данной темы, я пишу эту статью.

В разных источниках можно встретить массу рекомендаций. Например, что радиус бубна должен быть равным радиусу кривизны рук программиста [1] или, что бубен должен быть сделан из кожи "девственного юзера" [2] или, что цвет бубна должен совпадать с цветом обоев на компьютере и т.п. Е-р-у-н-д-а! Глупые суеверия и невежество! Неважно какого цвета, размера и из какого материала изготовлен бубен. Важно лишь то какие рунические письмена нанесены на бубен.

Какие же руны должны быть на бубне?

Ответ прост. Это должны быть фрагменты кода реальных, а главное, работающих программ. Желательно, чтобы фрагменты были взяты из разных программ и написаны на разных языках программирования.

На каких же языках должны быть руны на бубне? А это зависит в первую очередь от того на каком языке написана заклинаемая программа. Если Ваша программа написана на C++, то на Вашем бубне обязательно должна быть руна на C++, если программа на Java, то должна быть руна на Java и т.д. Если Ваша программа написана на нескольких языках, то Ваша задача усложняется, т.к. Вам потребуется бубен с рунами каждого из используемых языков. Можно ли использовать несколько бубнов вместо одного? Да, но только если они совместимы между собой [3]. Запомните, что бубен без руны используемого Вами языка программирования для Вас бесполезен. Однажды я встретил бубен с рунами на Коболе и ассемблере IBM 360. Дествительно редкая вещь! Но для современного программиста совершенно бесполезная.

Выбирая бубен, остерегайтесь подделок

Сейчас можно встретить множество бубнов с кричащими именами: 20 в одном, 40 в одном и даже 100 языков в одном бубне. Но если внимательно присмотреться к таким 'творениям', то видно, что все фрагменты кода приведенные там есть ничто иное, как программа 'Hello World!', продублированная на разных языках. Такой бубен Вам ничем не поможет. Разве только при создании программы уровня 'Hello World!'.

Предположим Вы выбрали бубен и приготовились к танцу. Хорошенько подумайте о том какой именно танец Вы собираетесь воспроизвести. Помните, что не любой танец подойдёт для Вашей программы. Танец изгнания духа Меморилика [4] совершенно бесполезен для программы написанной на Java, точно так же бесполезен танец задабривания виртуальной машины Java для программы на С++ [5].

И напоследок я хочу развенчать устоявшийся миф о том, что танцы с бубном способны изгнать баги из программы. Несусветная глупость! Однако очень живучая и кочующая из поколения в поколение. Суть танца с бубном есть обращение к Великому Духу Первопрограммера и его сыну Первопрограмме, а также отречение от Первородного Бага. Правильно исполненный танец с правильным бубном будет услышан Великими Духами и они даруют Вашему детищу своё Благословение и Защиту от багов. Таким образом Вы не избавитесь от багов, но они на время перестанут проявляться. А вот на какое время они перестанут проявляться зависит от мастерства танцора. Я различаю

4 уровня мастерства владения бубном

1-й уровень

Программист умеет заклинать конкретный экземпляр программы на конкретном компьютере на короткий срок.

2-й уровень

Программист умеет создавать собственный бубен.

3-й уровень

Программист умеет заклинать множество экземпляров программы на множестве удалённых компьютеров на длительный срок.

4-й уровень

Программист умеет обходиться без шаманского бубна.

И наконец, мой последний совет.

Допустим Вы купили бубен и совершили удачный танец - программа во время сдачи работала как надо. Не торопитесь почивать на лаврах. Сядьте и попробуйте разобраться, почему Ваш код работал не так как надо [6]. Если же это невозможно, то у Вас есть два варианта: пересмотреть свою жизненную позицию и заняться чем-то другим [7] либо валить нафиг из этой шарашки, в которой создание программного продукта без плясок с бубном невозможно.

Искренне Ваш,

Гура Кодович Бажев

Примечания

1. Определение радиуса кривизны рук программиста и эмпирическая формула вычисления радиуса хорошо описаны в знаменитой книге Федора Буста "Мифический человеко-бубен".

2. "Девственный юзер" - ныне почти вымерший вид пользователя, не испорченного графическим пользовательским интерфейсом.

3. Совместимость бубнов между собой выходит за рамки данной статьи и будет расмотрена автором в отдельной статье.

4. Меморилик - злое мифическое существо по мнению дотнетчиков проживающее в каждой программе на C++. ( (с) WolfHound )

5. Обучиться танцами с бубном Вы можете с помощью моих книг: "50 эффективных танцев c бубном" и "Ещё 35 более эффективных танцев с бубном".

6. А тебя Петя это касается в первую очередь. Ты думаешь я писал эту статью ради твоего развлечения?! Мне уже порядком надоел 'The instruction at "0x00405414" referenced memory at...' в твоём модуле. Сейчас после сдачи есть немного спокойного времени. Так вот сядь, разберись и покончи с этой ошибкой раз и навсегда!

7. Нет, Петя, я не шучу.

Поделиться сообщением


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

Как только ты возьмешься писать что-нибудь серьезное и не GUI-ориентированное одновременно, так ты сразу почувствуешь всю мощь и возможности Java :)

Поэтому я уже давно забыл C++ и все вышеописанные в топике проблемы  :lol:

У меня основная область программирования - обработка звука и видео в реальном времени. Там только эту тормозную и глюкавую песочницу и применять :)

Возможно, вы не интересовались новостями о развитии Java-технологий лет эдак 6-7 и не очень представляете себе возможности и современные области применения?  :P

Я представляю. Все сводится к тому, что взяли идею виртуальной машины из Форт и перестроили ее в C++ подобного монстра. В результате:

  • Потеряли все возможности Форт.
  • Потеряли возможность использования шитого кода из Форт, из-за чего программы стали на редкость тормозными.
  • Резко уменьшили возможности C++ во имя удобства неквалифицированных программистов.
  • При этом все равно не усидели в рамках песочницы и поэтому потеряли безопасноть :)
И кому оно такое нужно? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Как только ты возьмешься писать что-нибудь серьезное и не GUI-ориентированное одновременно, так ты сразу почувствуешь всю мощь и возможности Java

Я только такое в основном и пишу ;)

У меня основная область программирования - обработка звука и видео в реальном времени. Там только эту тормозную и глюкавую песочницу и применять

А у меня - создание серверного ПО, обслуживающего тысячи пользователей. При этом с требованиями к надёжности (например, платёжная онлайн-система, работающая с кредитками).

Там только эту тормозную

программы стали на редкость тормозными.

    * При этом все равно не усидели в рамках песочницы и поэтому потеряли безопасноть

Данные таки семилетней давности :P

И кому оно такое нужно?

Многим. И за это неплохо платят ;)

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Резко уменьшили возможности C++

А они просто не нужны. Я когда-то неплохо знал С++, он даже был моим любимым языком. Так что в голове еще остались смутные воспоминания о множественном наследовании, перегрузке операторов и.т.д. Ну так вот - ностальгии не возникает :D

во имя удобства неквалифицированных программистов.

Ну, тут я промолчу ;) А вообще, в Java конечно хватает своих граблей, на которые могут наступить неквалифицированные программисты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

groza

Они не любят кошек просто потому, что не умеют их готовить :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Igor

Сейчас никто не пишет бизнесориентированные приложения на C++. Это либо Java с J2EE либо .NET (Исключение SAP, но на то есть свои веские причины).

Единственное где позиции C++ сильны, и вряд ли это когда-нибуть измениться, это Graphische Datenverarbeitung и обработка сигналов.

Написание сложных расспределенныx систем сегодня на c++ это трата большиx денег и колоссального количества времени. Xотя такое и встречается как в России так и в Германии.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
А у меня - создание серверного ПО, обслуживающего тысячи пользователей. При этом с требованиями к надёжности (например, платёжная онлайн-система, работающая с кредитками).

Но требования по скорости не слишком серьезные? Миллисекунды ведь никто не считает? 1 миллисекунда туда, одна сюда роли не играет? А у нас играет. А требования к надежности у нас не меньше. Представляешь, сколько стоит, например, непроигранная из-за скопытившейся программы в prime-time 2-минутная реклама...

Данные таки семилетней давности  :P

Нет. Данные самые современные. Просто за эти годы железо резко ускорилось, что позволило поддерживать на более-менее приемлимом уровне даже таких монстров :)

И кому оно такое нужно?

Многим. И за это неплохо платят ;)

Платят - это здорово :) Кто бы спорил, что однако не говорит о эффективности :) Java -раскрученный бренд, слышали о нем многие, вот и заказывают :) Мы сейчас по маркетинговым соображениям не указываем, что у нас есть много кода на Форте, т.к. уже сталкивались с ситуацией: "Форт? А что это такое? А-а-а... Этот древний язык программирования... Да что сейчас вообще на нем можно создать? Мы лучше купим современные системы на C#". Даже упоминания о C++ стали постепенно убирать, т.к. он уже стал ассоциироваться у заказчиков со стариной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Но требования по скорости не слишком серьезные? Миллисекунды ведь никто не считает? 1 миллисекунда туда, одна сюда роли не играет? А у нас играет. А требования к надежности у нас не меньше. Представляешь, сколько стоит, например, непроигранная из-за скопытившейся программы в prime-time 2-минутная реклама...

Игорь, я тебя сильно расстрою, при большом количестве Объектов Java и .Net будут быстрее чем С++. Почитай C't, там была большая статья на эту тему.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Сейчас никто не пишет бизнесориентированные приложения на C++. Это либо Java с J2EE либо .NET (Исключение SAP, но на то есть свои веские причины).

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

Единственное где позиции C++ сильны, и вряд ли это когда-нибуть измениться, это Graphische Datenverarbeitung и обработка сигналов.

Ты бы по русски написал, что имеются в виду системы реального времени :)

Написание сложных расспределенныx систем сегодня на c++ это трата большиx денег и колоссального количества времени. Xотя такое и встречается как в России так и в Германии.

Для типовых задач, действительно, так оно и есть. Но если тебе нужны малые требования к железу, то ни Java, ни .NET не подойдут.

Игорь, я тебя сильно расстрою, при большом количестве Объектов Java и .Net будут быстрее чем С++. Почитай C't, там была большая статья на эту тему.

Читал, не смешно :) В качестве доказательства предлагаю тебе показать мне графический движок (как раз большое количество объектов) на Java, который быстрее аналогичного на C++ :) Исчо раз: тормознутось Java (по сравнению C++) объясняется невозможностью применения шитого кода. Вот когда будет создан компилятор из C-подобных языков в прямой шитый код (это сколько же времени потребуется на создание такого чуда), вот тогда ситуация с быстродействием может поменяться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Похоже начинается очередная Holy War :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Ты бы по русски написал, что имеются в виду системы реального времени smile.gif

Мы поняли друг друга.

Для типовых задач, действительно, так оно и есть. Но если тебе нужны малые требования к железу, то ни Java, ни .NET не подойдут.

Согласен в принципе.

В качестве доказательства предлагаю тебе показать мне графический движок (как раз большое количество объектов) на Java, который быстрее аналогичного на C++

Тут даже возражать не буду, такого нету, и я не думаю что будет.

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

Я тебе не совсем понял, ты говоришь про компилятор который преобразовывал java и .net код не в байткод для виртуальной машины, а в прямой машинный?

Похоже начинается очередная Holy War

У меня тоже такое чувство ;) Так что не будем спорить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Я тебе не совсем понял, ты говоришь про компилятор который преобразовывал java и .net код не в байткод для виртуальной машины, а в прямой машинный?

Не совсем. Тут вообще-то нужно примеры на ассемблере приводить, иначе будет непонятно. Грубо говоря, имеется в виду развернутый код виртуальной машины с уже встроенными константами, типовыми операциями и т.д. и при этом оптимизированный с использованием стандартных вариантов типа выноса из цикла и т.п. На Форт такое достаточно легко достигается т.к. он исполняется под стековой виртуальной машиной, которую легко оптимизировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Я тебе не совсем понял, ты говоришь про компилятор который преобразовывал java и .net код не в байткод для виртуальной машины, а в прямой машинный?

Не совсем. Тут вообще-то нужно примеры на ассемблере приводить, иначе будет непонятно. Грубо говоря, имеется в виду развернутый код виртуальной машины с уже встроенными константами, типовыми операциями и т.д. и при этом оптимизированный с использованием стандартных вариантов типа выноса из цикла и т.п. На Форт такое достаточно легко достигается т.к. он исполняется под стековой виртуальной машиной, которую легко оптимизировать.

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

оптимизация в стековой машине - даже не задумывался о таком :)) слышал что есть прошивки программируемой логики под форт-процессор (о практических применениях не слышал..)

очень любопытно: где сейчас применяется Форт? т.е. на каких типах задач, насколько он распространен (для решения "своих" задач), извесны ли примеры разработки новых систем или это поддержка старых систем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

бгг..

два немца о чем-то спорят

смешные :lol:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...