Қатысушы:Дана Ақуал/Нөлдік терминатор

Уикипедия — ашық энциклопедиясынан алынған мәлімет
Навигацияға өту Іздеуге өту


Нөлдік терминатор немесе C-жол немесе ASCIIZ жол — компьютерлік бағдарламалауда нөлдік соңы бар жол - бұл символдарды қамтитын және нөлдік символмен ('\0', деп аталатын NUL в ASCII) аяқталатын массив түрінде сақталатын символдық жол. Балама атаулар C және ASCIIZ бағдарламалау тіліне қатысты c жолы болып табылады (C ASCII-ден ерекшеленетін кодтауды пайдалана алады).

C жолының ұзындығы-нөлдік байтты іздеу (Бірінші) арқылы табу. Бұл баяу болуы мүмкін, себебі O(N) (сызықтық уақыт) талап етіледі.

Шығу тарихы[өңдеу | қайнарын өңдеу]

Нөлдік аяқталған жолдар командасы PDP-11 ассемблері арқылы жасалған .ASCIZ директивасы және MACRO-10 ASCIZ директивасы негізінде құралған. Олар Си бағдарламалау тілінің дамуына себеп болды, бірақ жиі басқа жолдар түрлері қолданылды.

C әзірленген кезде, жады өте шектеулі болды, сондықтан жол ұзындығын сақтау үшін тек бір байт үстеме шығындарды пайдалану тиімді болды. Сол кездегі жалғыз танымал балама, әдетте " Паскаль жолы "деп аталатын. Жолдың ұзындығын сақтау үшін жетекші байтты пайдаланды. Бұл жолда NUL болуға мүмкіндік бар және ұзындығын іздеу үшін тек бір жадқа (O(1) (тұрақты) уақыт) кіру үшін қажет етеді, бірақ жолдың ұзындығын 255 таңбаға дейін шектейді (8 биттік байттарды пайдаланатын машинада). C-дизайнер Деннис Ричи жолдың ұзындығын шектеуді болдырмау үшін BCPL - да орнатылған нөлдік аяқтау шартын ұстануға шешім қабылдады, өйткені, шотты ұстап тұру оның тәжірибесі бойынша, терминаторды пайдаланудан гөрі ыңғайсыз болып табылады[1].

Бұл процессор командаларын жинаудың дизайнына біраз әсер етті. Zilog Z80 және DEC VAX сияқты 1970 және 1980 жылдардағы кейбір процессорлар ұзындық префиксі бар жолдарды өңдеуге арналған арнайы нұсқауларға ие болды. Алайда, нөлдік соңы бар жол қарқынмен терілген сайын, процессорлардың әзірлеушілері оны назарға ала бастады, мысалы - IBM шешімінде 1992 жылы ES/9000 520 "Logical String Assist" нұсқауларын қосу.

Сипаттама[өңдеу | қайнарын өңдеу]

11 байт нөлдік өлшеміндегі жол буферінде (жол сақтау үшін бөлінген жад аумағы) Windows-1251 кодтамасындағы "жол" терминденген жолы былайша берілуі мүмкін:

C T P O K A NUL F % NUL 4
0xD1 0xD2 0xD0 0xCE 0xCA 0xC0 0x00 0x46 0x25 0x00 0x34

Бұл мысалда 11 байттың жады аймағы көрсетілген, бірақ шын мәнінде жол тек 7 байт алады. Нөлдік символдан кейінгі таңбалар (8 - 11 байт) қоқыс деп аталады-бұл алдыңғы жолдардан немесе басқа да жад қолданулардан буферде қалуы мүмкін деректер. Олардың арасында нөлдік таңбалар болуы мүмкін.

Бір байттық кодтау (ASCII) қолданғанда, N таңбадан жолды көрсету үшін талап етілетін жад көлемі N + 1 байтқа тең. Символдарды кодтау үшін Юникод қолданылған жағдайда, жолдың ұзындығы пайдаланылатын Юникод көрінісіне байланысты (мысалы, UCS-2 үшін 2N + 2 байт).

Мұндай жолдар Си және басқа да бағдарламалау тілдерінде стандарт болып табылады. Олар көптеген операциялық жүйелердегі стандартты функцияларға жол аргументтерін беру үшін пайдаланылғандықтан, нуль-терминирленген жолдармен жұмыс істеу үшін операциялар Паскалда және басқа тілдерде пайда болды.

Жұмыс шектеулері[өңдеу | қайнарын өңдеу]

Іске асырудың қарапайымдылығына қарамастан, бұл көрініс қателіктерге және өнімділікке байланысты проблемаларға ұшырады[2].

NUL әрекетінің тоқтатылуы тарихи тұрғыдан қауіпсіздік проблемалары пайда болды. Басқа әдіс тестілеу кезінде жиі байқалмаған, себебі NUL сол жад бұрынғы пайдаланудан кездейсоқ болды[3]. Ұзындық іздеу қымбат болғандықтан, көптеген бағдарламалар, егер ол тым ұзын болса, буфердің артық толуын тудырып, тіркелген өлшемдегі буферге жолды көшіру алдында өзін жоғалтпады.

NUL сақтаудың мүмкін еместігі жол деректері мен екілік деректердің әр түрлі болуын және әр түрлі функциялармен өңделуін талап етеді. Бұл қате функцияны пайдаланғанда артық код пен қателерге әкелуі мүмкін.

Ұзындығын өлшеу жылдамдығының мәселелері, әдетте, оны кез келген жағдайда O(n) болып табылатын басқа операциямен біріктіріп, азайтуға болады, мысалы strlcpy . Алайда, бұл әрқашан интуитивті түсінікті API әкелмейді.

Кодтау мәселелері[өңдеу | қайнарын өңдеу]

Нөлдік терминатор нөлдік байтты (0x00) пайдаланбауын талап етеді, сондықтан барлық мүмкін болатын ASCII немесе UTF-8 жолдарын сақтау мүмкін емес [4][5]. Дегенмен, әдетте ASCII немесе UTF-8 ішкі жиыны-NUL символынан басқа әрбір таңба нөлдік аяқталатын жолдарда сақталады. Кейбір жүйелер NUL символын екі нөлдік емес байт (0xC0, 0x80) ретінде кодтайтын "түрлендірілген UTF-8" пайдаланады және осылайша барлық ықтимал жолдарды сақтауға мүмкіндік береді. Бұл UTF-8 стандартында рұқсат етілмеген, себебі бұл тым ұзын кодтау, және бұл қауіпсіздік қаупі ретінде қарастырылады. Оның орнына жолдың соңы ретінде UTF-8-де пайдаланылмайтын 0xFE немесе 0xFF сияқты басқа байт пайдаланылуы мүмкін.

UTF-16 2-байтты бүтін санды қолданады және кез келген байт нөлге тең болуы мүмкін (ал шын мәнінде әрбір екінші байт ASCII мәтінін ұсынған кезде осындай болып табылады), ол нөлдік соңы бар байтты жолда сақталуы мүмкін емес. Алайда, кейбір тілдер 16 биттік UTF-16 символдарынан тұрады, ол 16 биттік NUL символымен аяқталады. (Тағы да, бірыңғай нөлдік кодтық бірлік ретінде кодталатын NUL символы сақталмайтын жалғыз таңба болып табылады. UTF-16 нөлдің балама кодтамасы жоқ).

Мүмкін жақсартулар[өңдеу | қайнарын өңдеу]

Қателерге аз ұшырайтын жолдардың өңдеуін жасауға көп әрекет жасалды. Стратегиялардың бірі strdup және strlcpy сияқты қауіпсіз функцияларды қосу болып табылады, сонымен қатар gets сияқты қауіпсіз функцияларды пайдалануды айыптайды. Басқа жолы-тек қауіпсіз шақыруларды орындау үшін C жолдарының айналасында объектілі-бағытталған қабықты қосу. Дегенмен, қауіпсіз емес функцияларды кез келген жағдайда шақыруға болады.

Қазіргі заманғы кітапханалардың көпшілігі 32-биттік немесе одан да көп ұзындық мәні бар құрылыммен жолдарды ауыстырады (ұзындық префиксі бар жолдар үшін бұрын-соңды көп саналған), және жиі басқа көрсеткішті, сілтемелер есептегішін және тіпті NUL қосады., бұл хэш-кесте аз жад қолданылады). Мысалдар c++ std стандартты кітапханасын қамтиды: string, Qt QString, MFC CString және C-based core Foundation CFString жүзеге асыру.

Сілтемелер[өңдеу | қайнарын өңдеу]

  1. Dennis M. Ritchie (1993). [The development of the C language]. Proc. 2nd History of Programming Languages Conf.
  2. Rain Forest Puppy (9 September 1999). "Perl CGI problems". Phrack Magazine. artofhacking.com. 9 (55): 7. Retrieved 3 January 2016.
  3. https://security.stackexchange.com/questions/48187/null-byte-injection-on-php
  4. "UTF-8, a transformation format of ISO 10646". Retrieved 19 September 2013.
  5. "Unicode/UTF-8-character table". Retrieved 13 September 2013.