Back to site

Бяспечны STL

1. Юрыдычным мовай

Гэтыя матэрыялы грунтавацца на стандартнай бібліятэкі шаблонаў (STL) код, які

Copyright (C) 1994 кампаніі Hewlett-Packard

Гэты матэрыял прадастаўляецца ў адпаведнасці з наступнымі паведамлення дазволу.

Дазвол на выкарыстанне, капіраванне, змяненне, распаўсюджванне і продаж дадзенага праграмнага забеспячэння і яго дакументацыі для любых мэт Сапраўдным прадастаўляецца бясплатна, пры ўмове, што пазначаны вышэй апавяшчэнне аб аўтарскіх правах будзе прысутнічаць ва ўсіх копіях, і што як тое, што апавяшчэнне аб аўтарскіх правах і дадзенае дазвол будзе з'яўляцца ў суправаджальнай дакументацыі. Кампанія Hewlett-Packard не робіць ніякіх заяў аб прыдатнасці дадзенага праграмнага забеспячэння для любых мэт. Ён прадастаўляецца "як ёсць" без відавочных або пэўныя гарантый.

Бяспечны STL ўдасканалення

(C) Horstmann Design Software Карпарацыя 1995 года. Усе правы абаронены.

Вы можаце свабодна выкарыстоўваць, капіраваць, мадыфікаваць і распаўсюджваць гэтыя Бяспечны STL паляпшэнняў і дакументацыі для любых мэт, пры ўмове (1) вы бераце ніякай платы за распаўсюд гэтых абароненых аўтарскім правам матэрыялаў і (2) Вы ўключаць як апавяшчэнне аб аўтарскіх правах і апавяшчэнне аб дазволе ад Hewlett -Packard Company, і гэта апавяшчэнне аб аўтарскіх правах і апавяшчэнне аб дазволе. Horstmann Software Design карпарацыі спецыяльна адмаўляецца, што гэтыя матэрыялы маглі б зрабіць што-небудзь карыснае на ўсіх. Калі яны працуюць для вас і не знішчыць усё, вам пашанцавала. Існуе не бясплатную тэхнічную падтрымку для гэтых матэрыялаў.

2. Фон

STL, Standard Template Library, спраектаваныя Аляксандрам Сцяпанавым і Менгу Лі, якая павінна стаць часткай стандарту ANSI/ISO C + + Standard. Рэакцыя на STL была змешанай. Некаторыя праграмісты апладыраваць сваёй элегантнасцю і сілай, іншыя знаходзяць недахопы з інтэрфейсам, наймення, падтрымка шматструменнага або бяспекі. Хоць STL не можа быць дасканалым бібліятэкі класаў кантэйнер, ён нікуды не дзенецца. Я распрацаваў гэты невялікі, але карысны падвышэнне зрабіць STL бяспечней ў выкарыстанні. Бяспечны STL ловіць шмат тыповых памылак праграмавання STL падчас выканання (і некалькі падчас кампіляцыі).

3. Што яна робіць

Пры кампіляцыі і кампаноўкі кода з бяспечным STL, итераторы інструментальнай быць правераныя, калі яны выкарыстоўваюцца. Ёсць чатыры віды праверак.

  1. Калі итератор разыменовывается, ён павінен быць правільным (г.зн. належаць кантэйнер, а не пасля канца).
  2. Калі итератор павялічваецца, яно павінна быць у сіле да прырост і сапраўдны або пасля канца пасля прыросту. Калі итератор памяншаецца, ён павінен быць правільным або пасля канца да декремента і сілу пасля декремента.
  3. Для вылічэння рознасці двух итераторов або параўнаць два итератора з <, <=,>,> =, итераторы павінен паказваць на той жа кантэйнер.
  4. Калі кантэйнер можна атрымаць праз итератор (як c.erase (я)), то итератор павінен на самай справе кропка ўнутры кантэйнера.

Акрамя таго, кантэйнерныя аперацыі (такія, як прызначэнне, устаўкі, выдалення і г.д.) абнавіць усе итераторы прыкладаецца да кантэйнера.

Калі выяўлена памылка, то сцвярджэнне адмовы ўзнікае. (Гл. раздзел 6, каб убачыць, як змяніць гэта паводзіны.)

Вядома, праверка і абнаўленне итераторы займае шмат часу. Для версій кода, вы, напэўна, хацелі, каб вярнуцца да Неабмежаваны версію STL.

Інтэрфейс бяспечнага STL мэтанакіравана левай ж, што і рэгулярныя STL. Было б нялёгка дадаць адкрытыя функцыі-сябры для итераторов, якія правяраюць іх стан, але я лічу, што лепш не ствараць яшчэ адну нестандартную бібліятэку шаблонаў.

Бяспечны STL працуе лепш, чым адладчык або BoundsChecker для шэрагу прычын. Калі ваш код памірае з-за памылкі паказальнік, што з'яўляецца вынікам памылкі выкарыстання STL, адладчык будзе перапынак глыбока ў нетрах STL код, які, як правіла, менш, чым асвятляць. Калі ваш код трапляе ў бясконцы цыкл з-за памылкі выкарыстання STL, BoundsChecker не будзе на самой справе скардзіцца. Некаторыя памылкі STL выкарыстанне прычынай неадпаведнасці ў тонкіх структурах STL дадзеныя, якія не прывядуць да неадкладнага правал. Глядзіце прыклады ў раздзеле 4 для атрымання дадатковай інфармацыі.

4. Некаторыя тыповыя памылкі, якія Бяспечны STL ўловаў

5. Як яго выкарыстоўваць

Атрымаць поўную версію рэгулярных STL па FTP з butler.hpl.hp.com. Пакладзеце ўсе звычайныя файлы STL ў дырэкторыю, напрыклад/STL. Спампаваць SAFESTL.ZIP, націснуўшы тут. Разархівуе і пакладзеце. Ч файлы

   algobase.h
   vector.h
   deque.h
   list.h
   tree.h

ў асобны каталог, напрыклад/safestl. Затым пакладзеце гэты каталог у шляху пошуку ў каталогу, да каталога, які змяшчае рэгулярнае STL. Напрыклад,

   bcc -I/safestl;/stl whatnot.cpp

Тады кампіляцыі і кампаноўкі вашага дадатку.

Заўвага: Вы павінны аднавіць прымяненне цэлага. Вы не можаце мець змешаны аб'ектных файлаў, якія падзяляюць STL кантэйнераў і итераторов, некаторыя складзеныя з рэгулярнымі і іншыя з бяспечнага загалоўкі. Я разумею, што можа быць немагчымым, калі некаторыя з вашых код кампілюецца ў бібліятэках якіх інтэрфейс спасылкі кантэйнера STL або итератор.

Як толькі ваша заяўка адладжаная, проста выдаліце ??/safestl з ўключаць шлях і аднаўлення дадатку.

Вы заўважыце, што бяспечны STL спараджае вялікая колькасць папярэджанняў. На жаль, мала што я магу зрабіць аб тым, што без змены арыгінальнага крыніцы STL шырока. Некаторыя папярэджання прыйшоў з Int/без знака не адпавядае - яны таксама сустракаюцца ў рэгулярных STL. Іншыя формы "функцый са уласцівасцю X не можа быць пашыраны убудаваны". Я не хачу, убудаваны пашырана, але ў мяне няма выбару - кампілятар Borland не падтрымлівае шаблоны вызначэнні функцыі-члены укладзеных класаў. Калі код Бяспечны STL становіцца папулярным, я магу перапісаць яго для ліквідацыі найбольш папярэджання, але адхіляюцца далей ад рэгулярных код STL.

6. Змяненне апрацоўкі памылак

Калі памылка STL выкарыстанне выяўлены, зацвярджэнне адмовы спрацоўвае, выкарыстоўваючы стандартныя сцвярджаць макраса. Гэта працуе, і гэта з'яўляецца партатыўным.

Чаму я не магу кінуць выключэнне пры выяўленні адмовы? Гэта змяніла б інтэрфейс класаў STL, якія я не хацеў рабіць. Калі б аперацыі кінутыя выключэння на правал, то вы можаце напісаць код, лавіць іх. Гэты код ўжо не працуе, калі вы вярнуцца да рэгулярных STL.

Аднак, ёсць адзін вялікі недахоп выкарыстання сцвярджаць. Адладчык не дасць вам трасіроўкі стэка на момант збою, таму вы не можаце ўбачыць, што частка вашага кода выклікала праблемы. (Файл і нумар радка, паведамляе сцвярджаюць у загалоўку Бяспечны STL). Калі адладчык можа прывесці да паломкі аб выключэнні кідка (як Turbo Debugger), вы можаце праглядаць стэк і знайсці парушальніка кода. Жорсткай, але эфектыўны спосаб складаецца ў сваю чаргу, зацвярджэнне адмову ў выключэнні. Да ўключэння бяспечнага STL загалоўкі,

   #define assert(X) if (!(X)) throw #X;

Пасля Бяспечны загалоўкі STL, указанне яго зноў.

7. Падтрымліваюцца платформы

Я праверыў большасць прыкладаў з сайта HP STL, якія збіраюць з рэгулярнымі STL (некаторыя патрабуюць пэўнага вытворцы пашырэння), выкарыстоўваючы як Borland 4,53 і 7,2 Symantec кампілятараў. Калі ваш кампілятар падтрымлівае размеркаванне HP STL але дроселі па бяспечным STL, калі ласка, дайце мне ведаць (гл. раздзел 8). Калі вы зрабілі версію Бяспечны STL вашага кампілятара, і хацеў бы зрабіць яго даступным для грамадскасці, я быў бы шчаслівы, каб уключыць яго ў гэты пакет, пры ўмове, вядома, што ваш мадыфікацыі свабодна распаўсюджваецца.

8. Справаздача пра памылку

Справаздача пра памылку і прапановы па паляпшэнні вітаюцца. Калі ласка, накіроўвайце іх на cay@horstmann.com.

Калі ласка, не ПРАПАНУЕ ДЛЯ Handholding. Калі вы не можаце скампіляваць ўзор праграмы FTP сайце HP з рэгулярнай і бяспечнай STL, ці вы не ведаеце, як наладзіць файлы і кампілятар, то я не магу і не паспрабаваць выправіць гэта за вас.

Я асабліва зацікаўлены ў

Перад адпраўкай паведамлення пра памылку, калі ласка, праверце, калі ваша памылка была выпраўленая ўжо. Самая апошняя версія гэтага кода даступная на World Wide Web: http://www.horstmann.com/safestl.html

Popular Links
Published (Last edited): May 3 , source: http://www.horstmann.com/safestl.html