Мегаобучалка Главная | О нас | Обратная связь


Не используйте недействительные объекты и небезопасные функции



2016-01-26 381 Обсуждений (0)
Не используйте недействительные объекты и небезопасные функции 0.00 из 5.00 0 оценок




 

 

Резюме

 

Вы же не используете просроченные лекарства? И недействительные объекты, и "антикварные", но небезопасные функции способны навредить здоровью ваших программ.

 

Обсуждение

 

Имеется три основные категории недействительных объектов.

Уничтоженные объекты. Типичными примерами таких объектов являются автоматические объекты, вышедшие из области видимости, и удаленные динамические объекты. После того как вы вызвали деструктор объекта, его время жизни истекло, и любые действия с ним небезопасны и приводят к непредсказуемым последствиям.

Семантически недействительные объекты. Типичные примеры включают "висячие" указатели на удаленные объекты (например, указатель p после выполнения delete p;) и недействительные итераторы (например, vector<T>::iterator i после вставки в начало контейнера, к которому обращается итератор). Заметим, что висячие указатели и недействительные итераторы концептуально идентичны, и последние часто непосредственно содержат первые. Обычно небезопасно и непредсказуемо делать что-либо с такими указателями и итераторами, за исключением присваивания другого корректного значения недействительному объекту (например, p = new Object; или i = v.begin();).

Объекты, которые никогда не были действительными. Примеры включают объекты, "полученные" путем преобразования указателя с использованием reinterpret_cast (см. рекомендацию 92) или при обращении за пределы границ массива.

Никогда не забывайте о времени жизни объекта и его корректности. Не разыменовывайте недействительные итераторы и указатели. Не делайте никаких предположений о том, что делает и чего не делает оператор delete; освобожденная память — это освобожденная память, и обращений к ней не должно быть ни при каких условиях. Не пытайтесь играться со временем жизни объекта путем вызова деструктора вручную (например, obj.~T()) с последующим вызовом размещающего new (см. рекомендацию 55).

Не используйте небезопасное наследство С: strcpy, strncpy, sprintf или прочие функции, которые выполняют запись в буфер без проверки выхода за его пределы. Функция strcpy не выполняет проверки границ буфера, а функция [C99] strncpy выполняет проверку, но не добавляет нулевой символ при выходе на границу. Обе эти функции — потенциальный источник неприятностей. Используйте современные, более безопасные и гибкие структуры и функции, такие, которые имеются в стандартной библиотеке С++ (см. рекомендацию 77). Они не всегда совершенно безопасны (в основном это связано с вопросами эффективности), но существенно меньше подвержены ошибкам и позволяют создавать гораздо более безопасный код.

 

Ссылки

 

[C99] • [Sutter00] §1 • [Sutter04] §2-3

 

Не рассматривайте массивы полиморфно

 

 

Резюме

 

Полиморфная работа с массивами — большая ошибка. К сожалению, обычно компилятор никак на нее не реагирует. Не попадайтесь в эту ловушку!

 

Обсуждение

 

Указатели служат одновременно для двух целей: в качестве малого размера идентификаторов объектов и в качестве итераторов для массивов (они могут обходить массивы объектов с использованием арифметики указателей). В качестве идентификаторов имеет смысл рассматривать указатель на Derived как указатель на Base. Однако как только мы переходим ко второй цели, такая замена не работает, поскольку массив объектов Derived — совсем не то же, что и массив объектов Base. Чтобы проиллюстрировать сказанное, заметим, что и мышь, и слон — оба млекопитающие, но это не значит, что колонна из ста слонов будет по длине такой же, что и колонна из ста мышей.

Размер имеет значение. При замене указателя на Derived указателем на Base компилятор точно знает, как следует подкорректировать (при необходимости) указатель, поскольку у него есть достаточное количество информации об обоих классах. Однако при выполнении арифметических операций над указателем p на Base компилятор вычисляет p[n] как *(p+n*sizeof(Base)), таким образом полагаясь на то, что объекты, находящиеся в памяти, — это объекты типа Base, а не некоторого производного типа, который может иметь другой размер. Представляете, какая ерунда может получиться при работе с массивом объектов Derived, если вы преобразуете указатель на начало этого массива в указатель типа Base* (что компилятор вполне допускает), а затем примените арифметические операции к этому указателю (что компилятор также пропустит, не моргнув глазом)!

Такие неприятности представляют собой результат взаимодействия двух концепций — заменимости указателей на производный класс указателями на базовый класс, и унаследованной от С арифметикой указателей, которая считает указатели мономорфными и использует при вычислениях только статическую информацию.

Для хранения массива полиморфных объектов вам нужен массив (а еще лучше — контейнер; см. рекомендацию 77) указателей на базовый класс (например, обычных указателей или, что еще лучше, интеллектуальных указателей shared_ptr; см. рекомендацию 79). Тогда каждый указатель массива указывает на полиморфный объект, скорее всего, объект в динамически выделенной памяти. (Если вы хотите обеспечить интерфейс контейнера полиморфных объектов, вам надо инкапсулировать весь массив и предоставить соответствующий полиморфный интерфейс для выполнения итераций.)

Кстати, одна из причин, по которой в интерфейсах следует предпочитать ссылки указателям, заключается в том, чтобы было совершенно очевидно, что речь идет только об одном объекте, а не о массиве объектов.

 

Ссылки

 

[C++TR104] • [Dewhurst03] §33, §89 • [Sutter00] §36 • [Meyers96] §3

 

 

Список литературы

 

Примечание: для удобства читателей весь список литературы доступен по адресу http://www.gotw.ca/publications/c++cs/bibliography.htm

Ссылки, выделенные полужирным шрифтом (например, [Abrahams96] ), представляют собой гиперссылки в приведенной выше странице.

[Abelson96] Abelson H. and Sussman G. J. Structure and Interpretation of Computer Programs (2nd Edition) (MIT Press, 1996).

[Abrahams96] Abrahams D. Exception Safety in STLport. STLport website, 1996.

[Abrahams01a] Abrahams D. Exception Safety in Generic Components, in Jazayeri M., Loos R., Musser D. (eds.), Generic Programming: International Seminar on Generic Programming, Dagstuhl Castle, Germany, April/May 1998, Selected Papers. Lecture Notes in Computer Science 1766 (Springer, 2001).

[Abrahams01b] Abrahams D. Error and Exception Handling. [Boost] website, 2001.

[Alexandrescu00a] Alexandrescu A. Traits: The else-if-then of Types. С++ Report , 12(4), April 2000.

[Alexandrescu00b] Alexandrescu A. Traits on Steroids. С++ Report , 12(6), June 2000.

[Alexandrescu00c] Alexandrescu A. and Marginean P. Change the Way You Write Exception-Safe Code — Forever. C/C++ Users Journal , 18(12), December 2000.

[Alexandrescu01] Alexandrescu A. Modern С++ Design. Addison-Wesley, 2001.

Перевод: Александреску А. Современное проектирование на С++. Серия С++ In-Depth , т.3. — М.: Издательский дом "Вильямс", 2002.

[Alexandrescu01a] Alexandrescu A. A Policy-Based basic_string Implementation. C/C++ Users Journal , 19(6), June 2001.

[Alexandrescu02a] Alexandrescu A. Multithreading and the С++ Type System. InformIT website, February 2002.

[Alexandrescu02b] Alexandrescu A. "Discriminated Unions (I)," "... (II)," and "... (III)". C/C++ Users Journal , 20(4,6,8), April/June/August 2002.

[Alexandrescu03a] Alexandrescu A. Move Constructors. C/C++ Users Journal , 21(2), February 2003.

[Alexandrescu03b] Alexandrescu A. Assertions. C/C++ Users Journal , 21(4), April 2003.

[Alexandrescu03c] Alexandrescu A. and Marginean P. Enforcements. C/C++ Users Journal , 21(6), June 2003.

[Alexandrescu03d] Alexandrescu A. and Held D. Smart Pointers Reloaded. C/C++ Users Journal , 21(10), October 2003.

[Alexandrescu04] Alexandrescu A. Lock-Free Data Structures. C/C++ Users Journal , 22(10), October 2004.

[Allison98] Allison С. С & С++ Code Capsules. Prentice Hall, 1998.

[Austern99] Austern M. H. Generic Programming and the STL. Addison-Wesley, 1999.

[Barton94] Barton J. and Nackman L. Scientific and Engineering С++. Addison-Wesley, 1994.

[Bentley00] Bentley J. Programming Pearls (2nd Edition). Addison-Wesley, 2000.

Перевод: Бентли Дж. Жемчужины программирования. Второе издание. — СПб.: Питер, 2002.

[BetterSCM] Web-узел Better SCM Initiative.

[Boost] С++ Boost.

[BoostLRG] Boost Library Requirements and Guidelines. (Web-узел Boost).

[Brooks95] Brooks F. The Mythical Man-Month. Addison-Wesley, 1975; reprinted with corrections in 1995.

[Butenhof97] Butenhof D. Programming with POSIX Threads. Addison-Wesley, 1997.

[Cargill92] Cargill T. С++ Programming Style. Addison-Wesley, 1992.

[C90] ISO/IEC 9899:1990(E), Programming Languages — C (ISO C90 and ANSI C89 Standard).

[C99] ISO/IEC 9899:1999(E), Programming Languages — C (revised ISO and ANSI C99 Standard).

[C++98] ISO/IEC 14882:1998(E), Programming Languages — С++ (ISO and ANSI С++ Standard).

[C++03] ISO/IEC 14882:2003(E), Programming Languages — С++ (updated ISO and ANSI С++ Standard including the contents of [C++98] plus errata corrections).

[C++TR104 ] ISO/IEC JTC1/SC22/WG21/N1711. (Draft) Technical Report on Standard Library Extensions (ISO С++ committee working document, November 2004). Близкий к окончанию черновик с расширениями стандартной библиотеки С++, включая shared_ptr.

[Cline99] Cline М., Lomow G., and Girou M. С++ FAQs (2nd Edition). Addison-Wesley, 1999.

[Constantine95] Constantine L. Constantine on Peopleware. Yourdon Press, 1995.

[Coplien92] Coplien J. Advanced С++ Programming Styles and Idioms. Addison-Wesley, 1992.

[Cormen01] Cormen T., Leiserson C., Rivest R., Stein C. Introduction to Algorithms (2nd Edition). MIT Press, 2001.

Перевод: Кормен T., Лейзерсон Ч., Ривест Р., Стейн К. Введение в алгоритмы. 2-е изд. — М.: Издательский дом "Вильямс" (в печати)

[CVS] Web-узел CVS.

[Cowan01] Cowan С., Barringer М., Beattie S., and Kroah-Hartman G. FormatGuard: Automatic Protection From printf Format String Vulnerabilities. Proceedings of the 2001 USENIX Security Symposium , August 2001, Washington, D.C.

[Dewhurst03] Dewhurst S. С++ Gotchas. Addison-Wesley, 2003.

[Dinkumware-Safe ] Dinkumware Unabridged Library documentation (Web-узел Dinkumware).

[Ellis90] Ellis M. and Stroustrup B. The Annotated С++ Reference Manual. Addison-Wesley, 1990.

Перевод: Эллис M., Страуструп Б. Справочное руководство по языку программирования С++ с комментариями. — М.: Мир, 1992.

[Gamma95] Gamma E., Helm R., Johnson R., and Vlissides J. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995.

Перевод: Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. — СПб.: Питер, 2001.

[GnuMake] Gnu make (Web-узел Gnu).

[GotW] Sutter H. Guru of the Week column.

[Henney00] Henney K. С++ Patterns: Executing Around Sequences (EuroPLoP 2000 proceedings).

[Henney01] Henney K. С++ Patterns: Reference Accounting (EuroPLoP 2001 proceedings).

[Henney02a] Henney K. Stringing Things Along. Application Development Advisor , July-August 2002.

[Henney02b] Henney K. The Next Best String. Application Development Advisor , October 2002.

[Henricson97] Henricson M. and Nyquist E. Industrial Strength С++. Prentice Hall, 1997.

[Horstmann95] Horstmann C. S. Safe STL. , 1995.

[Josuttis99] Josuttis N. The С++ Standard Library. Addison-Wesley, 1999.

Перевод: Джосьютис Н. С++. Стандартная библиотека. — СПб.: Питер (в печати).

[Keffer95] Keffer T. Rogue Wave С++ Design, Implementation, and Style Guide. Rogue Wave Software, 1995.

[Kernighan99] Kernighan B. and Pike R. The Practice of Programming. Addison-Wesley, 1999.

[Knuth89] Knuth D. The Errors of TeX. Software — Practice & Experience , 19(7), July 1989.

[Knuth97a] Knuth D. The Art of Computer Programming, Volume I: Fundamental Algorithms, 3rd Edition. Addison-Wesley, 1997.

Перевод: Кнут Д. Искусство программирования, том 1. Основные алгоритмы, 3-е изд. — М.: Издательский дом "Вильямс", 2000.

[Knuth97b] Knuth D. The Art of Computer Programming, Volume 2: Seminumerical Algorithms, 3rd Edition. Addison-Wesley, 1997.

Перевод: Кнут Д. Искусство программирования, том 2. Получисленные алгоритмы, 3-е изд. — М.: Издательский дом "Вильямс", 2000.

[Knuth98] Knuth D. The Art of Computer Programming, Volume 3: Sorting and Searching, 2nd Edition. Addison-Wesley, 1998.

Перевод: Кнут Д. Искусство программирования, том 3. Сортировка и поиск, 2-е изд. — М.: Издательский дом "Вильямс", 2000.

[Koenig97] Koenig A. and Moo В. Ruminations on С++. Addison-Wesley, 1997.

[Lakos96] Lakos J. Large-Scale С++ Software Design. Addison-Wesley, 1996.

[Liskov88] Liskov B. Data Abstraction and Hierarchy. SIGPLAN Notices , 23(5), May 1988.

[Martin96a] Martin R. C. The Dependency Inversion Principle. С++ Report , 8(5), May 1996.

[Martin96b] Martin R. C. Granularity. С++ Report , 8(9), October 1996.

[Martin96c] Martin R. C. The Open-Closed Principle. С++ Report , 8(1), January 1996.

[Martin98] Martin R. C., Riehle D., Buschmann F. (eds.). Pattern Languages of Program Design 3. Addison-Wesley, 1998.

[Martin00] Martin R. C. Abstract Classes and Pure Virtual Functions in Martin R. C. (ed.), More С++ Gems . Cambridge University Press, 2000.

[McConnell93] McConnell S. Code Complete. Microsoft Press, 1993.

[Metrowerks] Metrowerks.

[Meyer00] Meyer B. Object-Oriented Software Construction, 2nd Edition. Prentice Hall, 2000.

[Meyers96] Meyers S. More Effective С++. Addison-Wesley, 1996.

Перевод: Мейерс С. Наиболее эффективное использование С++. 35 новых рекомендаций по улучшению ваших программ и проектов. — М.: ДМК Пресс, 2000.

[Meyers97] Meyers S. Effective С++, 2nd Edition. Addison-Wesley, 1997.

Перевод: Мейерс С. Эффективное использование С++. 50 рекомендаций по улучшению ваших программ и проектов. — М.: ДМК Пресс, 2000.

[Meyers00] Meyers S. How Non-Member Functions Improve Encapsulation. C/C++ Users Journal , 18(2), February 2000.

[Meyers01] Meyers S. Effective STL. Addison-Wesley, 2001.

Перевод: Мейерс С. Эффективное использование STL. — СПб.: Питер, 2002.

[Meyers04] Meyers S. and Alexandrescu A. С++ and the Perils of Double-Checked Locking, Part 1 and …Part 2. Dr. Dobb's Journal , 29(7,8), July and August 2004.

[Milewski01] Milewski B. С++ In Action. Addison-Wesley, 2001.

[Miller56] Miller G. A. The Magical Number Seven, Plus or Minus Two: Some Limits on Our Capacity for Processing Information. The Psychological Review , 1956, vol. 63.

[MozillaCRFAQ] Frequently Asked Questions About mozilla.org's Code Review Process (Web-узел Mozilla).

[Murray93] Murray R. С++ Strategies and Tactics. Addison-Wesley, 1993.

[Musser01] Musser D. R., Derge G. J., and Saini A. STL Tutorial and Reference Guide, 2nd Edition. Addison-Wesley, 2001.

[Parnas02] Parnas D. The Secret History of Information Hiding. Software Pioneers: Contributions To Sofware Engineering , Springer-Verlag, New York, 2002.

[Peters99] Peters T. The Zen of Python. Comp.lang.python, June 1999.

[Piwowarski82] Piwowarski P. A Nesting Level Complexity Measure. ACM SIGPLAN Notices , 9/1982.

[Saks99] Saks D. Thinking Deeply, Thinking Deeper, and Thinking Even Deeper. C/C++ Users Journal , 17(4,5,6), April, May, and June 1999.

[Schmidt01] Schmidt D., Stal M., Rohnert H., Buschmann F. Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects. Wiley, 2001.

[SeamonkeyCR] Seamonkey Code Reviewer's Guide (Web-узел Mozilla).

[Sedgewick98] Sedgewick R. Algorithms in С++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching, 3rd Edition. Addison-Wesley, 1998.

[STLport-Debug] Fomitchev B. STLport: Debug Mode (Web-узел STLport).

[Stroustrup94] Stroustrup B. The Design and Evolution of С++. Addison-Wesley, 1994.

Перевод: Страуструп Б. Дизайн и эволюция языка С++. — М.: ДМК Пресс, 2000. [Stroustrup00] Stroustrup В. The С++ Programming Language (Special 3rd Edition). Addison-Wesley, 2000.

Перевод: Страуструп Б. Язык программирования С++. Специальное издание. — М.: Бином, 2001.

[Sutter99] Sutter H. ACID Programming. Guru of the Week #61.

[Sutter00] Sutter H. Exceptional С++. Addison-Wesley, 2000.

Перевод: Саттер Г. Решение сложных задач на С++. Серия С++ In-Depth, т.4. — М.: Издательский дом "Вильямс", 2002.

[Sutter02] Sutter H. More Exceptional С++. Addison-Wesley, 2002.

Перевод: Саттер Г. Решение сложных задач на С++. Серия С++ In-Depth, т.4. — М.: Издательский дом "Вильямс", 2002.

[Sutter03] Sutter H. Generalizing Observer. C/C++ Users Journal , 21(9), September 2003.

[Sutter04] Sutter H. Exceptional С++ Style. Addison-Wesley, 2004.

Перевод: Саттер Г. Новые сложные задачи на С++. — М.: Издательский дом "Вильямс" (в печати).

[Sutter04a] Sutter H. Function Types. C/C++ Users Journal , 22(7), July 2004.

[Sutter04b] Sutter H. When and How To Use Exceptions. C/C++ Users Journal , 22(8), August 2004.

[Sutter04c] Sutter H. Just Enough' Thread Safety. C/C++ Users Journal , 22(9), September 2004.

[Sutter04d] Sutter H. How to Provide (or Avoid) Points of Customization in Templates. C/C++ Users Journal , 22(11), November 2004.

[SuttHysl01] Sutter H. and Hyslop J. Hungarian wartHogs. C/C++ Users Journal , 19(11), November 2001.

[SuttHysl02] Sutter H. and Hyslop J. A Midsummer Night's Madness. C/C++ Users Journal , 20(8), August 2002.

[SuttHysl03] Sutter H. and Hyslop J. Sharing Causes Contention. C/C++ Users Journal , 21(4),

April 2003.

[SuttHysl04a] Sutter H. and Hyslop J. Getting Abstractions. C/C++ Users Journal , 22(6), June 2004.

[SuttHysl04b] Sutter H. and Hyslop J. Collecting Shared Objects. C/C++ Users Journal , 22(8), August 2004.

[Taligent94] Taligent's Guide to Designing Programs. Addison-Wesley, 1994.

[Tsai01] Tsai T. and Singh N. Libsafe 2.0: Detection of Format String Vulnerability Exploits. Avaya Labs, March 2001.

[Vandevoorde03] Vandevoorde D. and Josuttis N. С++ Templates. Addison-Wesley, 2003.

Перевод: Вандевурд Д., Джосаттис Н. Шаблоны С++. Справочник разработчика. — М.: Издательский дом "Вильямс", 2003.

[Webber03] Webber А. В. Modern Programming Languages: A Practical Introduction. Franklin, Beedle & Associates. 2003.

 

Резюме из резюме

 

 

Вопросы организации и стратегии

 



2016-01-26 381 Обсуждений (0)
Не используйте недействительные объекты и небезопасные функции 0.00 из 5.00 0 оценок









Обсуждение в статье: Не используйте недействительные объекты и небезопасные функции

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (381)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.013 сек.)