|
|||
Уязвимостисемейства Си. ⇐ ПредыдущаяСтр 5 из 5 По тексту сказанному выше можно предположить что это самая идеальная и практичная программа, ноМногие элементы Си потенциально опасны, а последствия неправильного использования этих элементов зачастую непредсказуемы. Керниган говорит: «Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво». В связи со сравнительно низким уровнем языка многие случаи неправильного использования опасных элементов не обнаруживаются и не могут быть обнаружены ни при компиляции, ни во время исполнения. Это часто приводит к непредсказуемому поведению программы. Иногда в результате неграмотного использования элементов языка появляются уязвимости в системе безопасности. Необходимо заметить, что использования многих таких элементов можно избежать. Примером ошибки является обращение к несуществующему элементу массива. Несмотря на то, что Си непосредственно поддерживает статические массивы, он не имеет средств проверки индексов массивов (проверки границ). Например, возможна запись в шестой элемент массива из пяти элементов, что, естественно, приведёт к непредсказуемым результатам. Частный случай такой ошибки называется ошибкой переполнения буфера. Ошибки такого рода приводят к большинству проблем с безопасностью. Другим потенциальным источником опасных ситуаций служит механизм указателей. Указатель может ссылаться на любой объект в памяти, включая и исполняемый код программы, и неправильное использование указателей может порождать непредсказуемые эффекты и приводить к катастрофичным последствиям. К примеру, указатель может быть неинициализированным или, в результате неверных арифметических операций над указателем, указывать в произвольное место памяти; на некоторых платформах работа с таким указателем может вызвать аппаратную остановку программы, на незащищённых же платформах это может привести к порче произвольных данных в памяти, причём эта порча может проявиться в самые произвольные моменты времени и намного позже момента порчи. Также область динамической памяти, на которую ссылается указатель, может быть освобождена (и даже выделена после этого под другой объект) — такие указатели называются «висячими». Или, наоборот, после манипуляций с указателями на область динамической памяти может не остаться ссылок, и тогда эта область, называемая «мусором» (garbage), никогда не будет освобождена, что может приводить к «утечкам памяти» в программе. В других языках подобные проблемы пытаются решить введением более ограниченных ссылочных типов. Проблемой является также то, что автоматически и динамически создаваемые объекты не инициализируются и они могут содержать значения, оставшиеся в памяти от ранее удалённых объектов. Такое значение полностью непредсказуемо, оно меняется от одной машины к другой, от запуска к запуску, от вызова функции к вызову. Если программа использует такое значение, то результат будет непредсказуемым и не обязательно проявится сразу. Современные компиляторы пытаются диагностировать эту проблему некоторым анализом исходного кода, хотя в общем случае статическим анализом это решить нельзя.
Вывод: Скорее всего, вам придётся выбирать язык для изучения исходя из того, какие проблемы вы хотите решить. Или вам предложат тот или иной вариант в компании, где вы работаете. Не менее важным критерием может быть и «актуальность» того или иного языка. Несомненно, круто быть одним из первых освоивших новый язык программирования, о котором говорят на каждом
int operator+ (int value) { return number + value; } #include< stdio. h> /* Стандартный заголовочный файл ввода-вывода */ #include< iostream> /* Библиотека (стандарт) */ #include< locale. h> /* Русификатор */ #include < windows. h> /* Русификатор */ using namespace std;
int main(intargc, char* argv[]) { setlocale(LC_CTYPE, " Russian" ); double plus, minus, pow, div; // объявлениепеременныхчереззапятую double a1; // отдельное объявление переменной a1 double a2; // отдельное объявление переменной a2 cout< < " Введите первое число: "; cin> > a1; cout< < " Введите второе число: "; cin> > a2; plus = a1 + a2; // операция сложения minus = a1 - a2; // операция вычитания pow = a1 * a2; // операция умножения div = a1 / a2; // операция деления cout< < a1 < < " +" < < a2 < < " =" < < plus < < endl; cout< < a1 < < " -" < < a2 < < " =" < < minus < < endl; cout< < a1 < < " *" < < a2 < < " =" < < pow < < endl; cout< < a1 < < " /" < < a2 < < " =" < < div < < endl; system(" pause" ); return 0; } // Простаядробь 2/3 simple_fractionfr(2, 3); double sum = fr + 10; // сумма double diff = fr - 10; // разность double factor = fr * 10; // произведение double div = fr / 10; // частное
Список используемой литературы
1. https: //habrahabr. ru/post/304034/ 2. https: //ru. wikipedia. org/wiki/C%2B%2B 3. http: //cppstudio. com/ 4. http: //progopedia. ru/language/c-plus-plus/
|
|||
|