תו ה-Null

תו ה-Null (או תו ריק, מסומן גם NUL, באנגלית: null character, ידוע גם כ-null terminator, או null byte) הוא תו בקרה בעל הערך אפס. התו קיים במערכות תווים רבות, כמו ISO/IEC 646 (או ASCII), קוד C0 לתווי בקרה, מערכת Universal Coded Character Set (או יוניקוד) ו-EBCDIC. פעמים רבות הוא מקוצר לסימון NUL (או NULL, אם כי סימון זה משמש לעיתים כסימון למצביע האפס, שמהותו שונה). משמעותו המקורית של תו זה הייתה כמו NOP ‏(no-operation) – כאשר התו נשלח להתקן חומרה כמו מדפסת או מסוף מחשב, סימן הדבר שאין לעשות כל פעולה (אם כי, במסופי מחשב מסוימים, הוצג התו בצורה שגויה כרווח). כאשר טלפרינטרים אלקטרו-מכניים החלו לשמש כמכשירי פלט למחשבים, נעשה שימוש בתווי null, מספר תווים או תו בודד, כקלט למחשב שמתווסף בסוף כל שורה מודפסת, על מנת לאפשר למכשיר זמן לחזור לנקודת ראשית ההדפסה לפני הדפסת השורה הבאה. על גבי סרט מנוקב, ייצוג התו הוא ללא חורים כלל, כך שגליל חדש שמיועד לשימוש כסרט מנוקב, המגיע לא מנוקב כלל, מלא תחילה בתווים ריקים, וטקסט חדש "יוכנס" במרווח השמור לשם כך בין התווים הריקים, על ידי ניקוב תווים חדשים על הסרט, מעל לתווים הריקים. כיום לתו זה חשיבות רבה בשפות תכנות עיליות כמו C והשפות המבוססות עליה, ובייצוגי מידע רבים, כיוון שהוא משמש כתו מסיים (terminator), לסימון סוף מחרוזת (ומכאן המינוח null-terminated string). ייצוג זה מאפשר למחרוזת להיות בכל אורך שהיא נדרשת, עם תקורה (overhead) של בית אחד בלבד. ייצוג חלופי, השומר את אורך המחרוזת לצדה, מצריך להגביל את אורכה עד ל-255 תווים, או להגדיל את התקורה הנדרשת מעבר לבית בודד. התו הריק מיוצג לרוב באמצעות רצף המילוט (escape sequence)‏ ‎\0 בליטרלים (string literals) או קבועי תו בקוד. בשפות תכנות רבות (כמו C, שהציגה לראשונה סימון זה), רצף תווים זה לא מסמן בהכרח רצף מילוט נפרד, אלא זהו רצף מילוט אוקטלי עם ספרה אוקטלית בודדת - 0; אסור שלאחר הייצוג ‎\0 תופיע אחת הספרות בין 0 ל-7, אחרת הוא יפורש כהתחלה של רצף מילוט אוקטלי ארוך יותר. ייצוגי מילוט נוספים שבהם משתמשים בשפות שונות הם ‎\x00,‏ ‎\z‏ או ‎\u0000. בקידוד URL, התו הריק יוצג ב-URL באמצעות קידוד-האחוז (percent code)‏ %00‎. היכולת לייצג את התו ולכותבו, אין משמעה תמיד כי התוכנית תדע לפרשו בצורה נכונה וכחלק מגוף הקלט. תוכניות רבות יפרשו קלט המכיל בתוכו את התו הריק, ככזה שמסתיים באותה נקודה שבה מופיע תו זה, למשל בשל חוסר התייחסות לאורכו של הקלט המתקבל אליהן, בעת עיבודו. על כן, היכולת להקליד תו זה בקלט זדוני, יכולה ליצור חולשה של null byte injection ("הזרקת בית ריק"), שיכולה לגרום לפרצות אבטחה בתוכנה. בנוטציית קארט (או "נוטציית גג"; caret notation), שהיא אחת מהאופציות לסימון תווי בקרה, התו הריק מיוצג כך: ^@‎. בחלק מהמקלדות, ניתן להקליד את התו הריק על ידי החזקת מקש ה-Ctrl ולחיצה על @ (בפריסות מקלדת אמריקאיות, לרוב לחיצה על Ctrl+2 בלבד תוסיף את התו, כאשר אין צורך ללחוץ גם על מקש ה-⇧ Shift לצורך קבלת התו @). בקטעי תיעוד קוד, נהוג פעמים רבות לייצג את התו הריק באמצעות סימבול בודד הכולל את האותיות "NUL". ביוניקוד, ישנו תו מקביל לייצוג ויזואלי של התו הריק, הנקרא "symbol for null", וערכו U+2400 (␀), שאין לבלבלו עם התו הריק עצמו, שערכו ביוניקוד U+0000. בכל מערכות התווים המודרניות, ערכו של התו הריק הוא אפס. ברוב הקידודים, הוא מתורגם ליחידת קידוד בודדת בעלת הערך אפס. למשל, במערכת התווים UTF-8, ייצוגו בית בודד מאופס. עם זאת, בתקן UTF-8 משופר (Modified UTF-8), התו הריק מקודד באמצעות שני בתים: 0xC0, 0x80. קידוד זה מאפשר לבית המאופס, שכעת לא משמש לאף תו תקני, להיות באופן בלעדי שמור כמסיים מחרוזת. מצביע האפס Null Byte Injection,‏ WASC Threat Classification תָּו רֵיק במילון טכנולוגיית המידע: ארגון נתונים (תשס"ג), באתר האקדמיה ללשון העברית "Unicode Character 'NULL' (U+0000)". נבדק ב-2020-03-08. "A string is a contiguous sequence of characters terminated by and including the first null character" — ANSI/ISO 9899:1990 (the ANSI C standard), section 7.1.1 Kernighan and Ritchie, C, p. 38 Null Byte Injection, WASC Threat Classification