-
не используйте экзотические и
недокументированные возможности языка
программирования : Вы не уверены в том, как они
реализуются на самом деле
-
оформляйте исходный текст ясно и
четко, используйте необходимые комментарии
-
используйте скобки для явного
указания порядка операций : компилятор может
оптимизировать выполнение выражений и начать,
скажем, сложение F(1)+F(2)+F(3) со второго знака
"+", тем самым вызвав сначала функцию F от 2,
затем от 3, а только затем от 1 если в функции
изменяются какие-либо глобальные переменные это
может привести к непредсказумым последствиям
-
при всех удобных случаях используйте
передачу параметров функции в качестве
аргументов, а не в глобальных переменных
-
используйте структурное
программирование : разбивайте сложные блоки
кода на процедуры с ясной структурой и легко
контролируемым набором параметров
-
никогда не программируйте
недокументированные возможнности :
технология "reverse engineering"
дизассемблирование и обратная компиляция"
на сегодняшний день достигла огромных
результатов, особенно в отношении
высокоуровневых языков программирования
-
закрывайте файлы сразу же по
окончании работы с ними, а если Вы записываете
важную информацию в течение долгого времени
периодически вызывайте функции сброса файлового
буфера на дисковый накопитель
-
проверяйте свободное место на диске
перед записью в файл : некоторые операционные
выдают ошибки при записи на переполненный диск
нестандартным образом, результат этого может
быть плачевным
-
блокируйте файлы и наборы данных,
если Вы обращаетесь к ним по записи из нескольких
параллельно работающих процессов или программ
-
старайтесь как можно сильнее
сократить время записи в совместно используемые
файлы, а, следовательно, и время их блокирования
-
не будьте заранее уверенными, что
программа запущена из той директории, где
расположен ее исполнимый файл, одной из первых
команд после запуска программы явно смените
каталог на желаемый
-
при работе с внешними и сетевыми
устройствами и дисками стройте циклы ожидания
таким образом, чтобы из них был возможен выход по
истечении определенного периода ожидания ответа
тайм-аута
-
очень тщательно разрабатывайте схему
синхронизации паралелльно работающих с одними и
теми же данными процессов
-
тщательно проверяйте алгоритмы на
синдром "мертвой петли" это ситуация,
когда процесс A, начав изменять объект 1 и
заблокировав его в связи с этим, ожидает снятия
блокирования с объекта 2, в то время как процесс B,
в то же самое время начавший изменять объект 2 и
заблокировав его, ожидает снятия блокировки с
объекта 1 подобная проблема при такой схеме
синхронизации теоретически неразрешима,
единственный выход из нее рассматривать
объекты 1 и 2 как единое целое с возможностью
только совместной блокировки
-
аккуратно выделяйте и очищайте
объекты в динамической памяти
-
при необходимости используйте
криптографию
-
никогда не передавайте пароль
открытым текстом
-
используйте криптостойкие алгоритмы
шифрования и хеширования
-
вычищайте блоки оперативной памяти
после того как информация (пароли, ключи,
конфиденциальные данные), находившаяся в них,
стала ненужной
-
всегда проверяйте длины строк и
массивов перед началом работы с ними
-
встрайвайте в Ваши системы
требование регистрации каждого оператора с
уникальным паролем и записью как можно большего
количества информации о сеансе в лог-файл,
недоступный для изменения операторам
-
тщательно тестируйте Ваши
приложения, в том числе на больших и неправильных
входных данных