Хелпикс

Главная

Контакты

Случайная статья





Уязвимостисемейства Си.



     По тексту сказанному выше можно предположить что это самая идеальная и практичная программа, ноМногие элементы Си потенциально опасны, а последствия неправильного использования этих элементов зачастую непредсказуемы. Керниган говорит: «Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво». В связи со сравнительно низким уровнем языка многие случаи неправильного использования опасных элементов не обнаруживаются и не могут быть обнаружены ни при компиляции, ни во время исполнения. Это часто приводит к непредсказуемому поведению программы. Иногда в результате неграмотного использования элементов языка появляются уязвимости в системе безопасности. Необходимо заметить, что использования многих таких элементов можно избежать.

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

     Другим потенциальным источником опасных ситуаций служит механизм указателей. Указатель может ссылаться на любой объект в памяти, включая и исполняемый код программы, и неправильное использование указателей может порождать непредсказуемые эффекты и приводить к катастрофичным последствиям. К примеру, указатель может быть неинициализированным или, в результате неверных арифметических операций над указателем, указывать в произвольное место памяти; на некоторых платформах работа с таким указателем может вызвать аппаратную остановку программы, на незащищённых же платформах это может привести к порче произвольных данных в памяти, причём эта порча может проявиться в самые произвольные моменты времени и намного позже момента порчи. Также область динамической памяти, на которую ссылается указатель, может быть освобождена (и даже выделена после этого под другой объект) — такие указатели называются «висячими». Или, наоборот, после манипуляций с указателями на область динамической памяти может не остаться ссылок, и тогда эта область, называемая «мусором» (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/



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.