непонятно, почему тогда вы пропагандируете функциональные языки. ведь единственное их преимущество в том, что правильность чисто функциональной программы можно доказать математически.
valgrind это отлично, но лучше не допускать ошибок, чем лихо их исправлять. к тому же, как вы верно заметили ниже, он не найдет ошибок, которых не было в этом запускеПервым делом после компиляции (и предшествующего статического чекинга ибо никакой компилятор этого не заменит) я запускаю программу по отлову динамических ошибок памяти. Она называется valgrind. Очень рекомендую всем, кто ей никогда не пользовался. valgrind мне покажет все проблемы с динамической памятью, которые возникли при выполнении программы. Я их правлю.
ну, это просто не смешно. если у вас есть 1000 условий, приводящих к завершению программы, то сколько раз ее надо запустить, чтобы таким методом пройти дальше всех этих условий и проверить что-то после них ?Следующий этап.
vg показал мне все ошибки с ДП которые были при выполнении. Но он не покажет те ошибки которые могут возникнуть. Для того, чтобы он показал нам их мы делаем вот такой трюк. Блок кода (или весь файл) который мы хотим исследовать на потенциальные ошибки ДП мы заключаем в следующие скобки:
#define if(x) if(if_handler(x, __func__,__FILE__,__LINE__))
...
#undef if
Что делает if_handler? Да что угодно. Например если мы дадим return (rand()%2) || x; то получим тестирование методом Монте-Карло. Более практичным является методика, когда эта функция перебирает или генерирует нужные тестовые последовательности, нужные для гарантированного покрытия всего множества возможных ветвлений. Алгоритм давать надеюсь не надо. :- )
После этого гоняем прогу под valgrindom с разными последовательностями, а пока она так гоняется, топчем клаву здесь на форуме. Это пока жители Виллабаджо пишут юнит-тесты и изучают RAII.
я уж не говорю о таком маразме, как во что превратится
int abs ( int a ) {
if(a<0) return -a;
return a;
}
или о том, что это не работает с условиями в выражениях, без оператора if. т.е. return is_error()?false:more_work();
вам придется переопределять не только маллок, но и все остальные функции, возвращающие код ошибки. т.е. практически все функции в программе, не использующей исключенияМетод с переопределением if на самом деле не найдет всех ошибок памяти. Для полного перебора надо еще переопредлять malloc - на тот случай если где-то он (или функция которая его вызывает) вернет 0 и проверки этого if-ом нет в коде. Делается по похожей схеме, но уже не макросами, что создает намного больше проблем, но тоже решается.
видимо, имелось в виду не "на с++", а "в программе, использующей исключения". это не так, вам все равно надо перекомпилировать все, включая библиотеки, так что можно вставить аналогичные макросы в места, бросающие исключения. и работать это будет правильннееЧто не может такая схема? Быть реализованной на С++. И не только из-за переусложненного синтаксиса, но еще из-за того, что глюки и исключения, которые возникают в данном блоке кода размазаны по всей программе, а в моем примере в С - все проверки сконцентрированы внутри блока, который мы проверяем.
это просто антипример получилсяВот собственно и обещанный пример...
Социальные закладки