Немає нічого гіршого, ніж помилка, яка приходить з нізвідки і не відповідає жодному шляху виконання коду. Якщо ви опинилися в такій ситуації, то, швидше за все, це пов’язано з записом в неініціалізовану пам’ять, також відомим як запис за випадковою адресою (wild write). Причина таких помилок криється в неініціалізованому вказівнику, який випадково вказує на правильну ділянку пам’яті. Зазвичай це трапляється з вказівниками на стек або, інакше кажучи, з локальними змінними. Оскільки стек постійно змінюється під час виконання програми, ніщо не може сказати вам, куди вказує неініціалізований вказівник, саме тому він може здаватися випадковим.
Коли налагоджувальників просять допомогти вирішити цю підступну проблему, вони завжди мають справу з абсолютно розгубленими програмістами, які стверджують, що перепробували буквально всі способи її виявлення. Оскільки вони вже зробили “все”, вони відчайдушно хочуть знати, що налагоджувальники будуть чаклувати. Ті відповідають, що збираються застосувати запатентований і зареєстрований Чарівний спосіб налагодження неініціалізованої пам’яті за технікою ніндзя (MNUMDT). Всі дивляться на це і ворушаться в кріслах в очікуванні дива, особливо коли налагоджувальник згадує, що MNUMDT спрацює, тільки якщо йому допоможуть два найменш досвідчених розробника з групи.
Послуга тестування сайту доступний для того, щоб переконатися, що сайт електронної комерції працює за призначенням. Це використовується для перевірки вмісту веб-сторінки, щоб переконатися, що вона є привабливою для відвідувачів.
У цей момент до налагоджувальника підходять двоє молодших програмістів, всіляко показуючи, що мають намір гідно нести свій тягар, і налагоджувальник описує їм MNUMDT:
- кожному з нас доручено працювати з третиною коду;
- кожен повинен уважно прочитати кожен рядок коду, шукаючи всі оголошення вказівників;
- якщо ми знаходимо неініціалізоване оголошення покажчика, ми ініціалізуємо його значенням NULL;
- при виявленні кожного виклику виділення пам’яті, не для класів, після нього ми додаємо виклик memset або ZeroMemory для обнулення пам’яті;
- після звільнення будь-якої пам’яті ми знову присвоюємо покажчику нульове значення;
- при знаходженні виклику memset або операції копіювання рядка нам потрібно перевірити, що кожна операція коректно підраховує розмір блоку пам’яті;
- кожна змінна члена класу повинна бути ініціалізована в конструкторі (-ах).
Вислухавши правила МНУМДТ, хлопці готові вибігти з кімнати, але лідер не дає їм цього зробити. Якщо ви вважаєте, що це грубе насильство, ви абсолютно праві: так воно і є.










0 коментарів