![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Научите отлавливать Null Pointer Assignment, если дебаггер то какой, где скачать и прям на пальцах ...
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
такая ошибка приводит к краху системы сразу, это заметно запуск под любым вменяемым дебагером - компиляторы Borland C++ Builder, MS Visual Studio, MinGW(gdb), ну и gdb под линух к таковым относятся - позволяет в момент краха посмотреть стек вызовов функций и даже инструкцию, на которой программа убилась. |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Что-за шутки
но только на старом tcc -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Null pointer - это указатель, значение которого нулл, то есть на большинстве системах - 0. При попытке обращения по нулевому указателю система падает. если ты перезаписал свою же память в месте, где хранится служебная инфа, то на это надеятся нельзя если у него отладчик вменяемый - не проблема. А вообще, бросали бы вы мучать эти трупы... |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Просто надо было сделать приложение под ДОС, да и опять же хочется разобраться, ведь сие означает что эта ошибка возникает и при компилировании более свежим компиляторм, тока он сам ее отлавливает скорее всего что-то типа зборщика мусора
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
сборщика мусора в компилируемых языках нет, для него нужна среда исполнения. никто ничего сам не отлавливает. Отладчик тебе помогает её отловить. |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Исполняемый файл и ОС среда исполнения кода
Да просто время жизни обьектов по разному расссматривается старым и более новым компилятором вот и причина.... Это сообщение отредактировал(а) apook - 27.9.2007, 07:41 -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
В корне неверное утверждение. За сборку мусора нужно платить, а компилятор без понятия, где ты готов платить, а где нет. А если готов платить всегда, то тебе в наших (сионистов) рядах не место. Кроме того, я вижу, что ты путаешь null-pointer и указатель на уже удаленный объект... это две такие большие разницы... С первым тебе проблем нет - падаем, как уже было сказано, на первом запуске. Со вторым... самый лучший способ - не делать таких ошибок... -------------------- ... |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Пример конечно не очень, придумать можно было и поинтересней, но все-же задача найти и обьяснить причину Null Pointer Assignment? Пример без ошибок и предупреждений компелируется на Borland Turbo C++ 3.x Готовый файл прицепляю на всякий случай! Далее задача откомпелировать это на более свежем компиляторе на Borland C++ Builder( но я думаю и на других) и Daevaorn узнает разницу времени жизни переменных на старых и новых компиляторах(хотя в данном случае причина не в этом) Это сообщение отредактировал(а) apook - 27.9.2007, 12:36 Присоединённый файл ( Кол-во скачиваний: 2 )
MAIN.zip 2,83 Kb-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
apook, этот код не компилируется по причине
|
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Что здесь написано грамотей
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
время жизни регламентируется стандартом. Потом, в таких случая приводят минимально возможный код демострирующий ситуацию. В твоем недокоде разбираться желания нет, да он и не "компилябельный" по причине не соответсвия стандарту. |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Не соответствия новому стандарту По вопросу сказать нечего, зачем поститься? -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Сказать я вижу нечего тебе. На мой вопрос ты не ответил, а дал какой-то мутный код которые не хочет собираться. Это по твоему конструктивная беседа? Да ещё и на какие-то нелепые наезды начинаешь, вместо того чтобы предметно обсудить тему. Стандарт один. Понятия "новый и старый" стандарт сейчас нет. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В tcc был сделан специальный хак для отлова таких записей (причем только в small модели), начало области данных (те самые нулевые адреса для коротких указателей) было зарезервированно и заполненно специальными данными (не помню какими), после окончания программы startup проверял, что эта область не изменилась, и если это оказывалось не так, то выводилось то самое сообщение про 'NULL pointer assignment' Отловить собственно МОМЕНТ присваивания автоматически увы не получится, только вручную по шагам. |
|||
|
||||
| nickless |
|
||||||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Короче, я сегодня добрый
В топку такой компилятор... Переменные, объявлённые в for, не видны за её(его) пределами. apook, код не только не соответствует стандарту, в нём еще просто много ошибок. Если подправить синтакс, программа вываливается с Segfault-ом (ака Access Violation), что в твоём древнем компиляторе наверно называется "Null Pointer Assignment" Ловится это очень просто, например в gdb так:
Со дебагером под дос разбирайся сам... Проблемы тут были в перепутаных DATSZ и _OODSZ (красивые названия кстати ...по принципу "чтобы никто не догадался", сам придумал?
Вот исправленый код:
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||||||
|
|||||||||
| Ln78 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
Вроде как scope переводилось как "область видимости", "область действия", а "время жизни" - это, скорее, lifetime. apook, опять хулиганишь? |
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
всё так и как, только вот как это относится к NPA не ясно. видимо и автору тоже. рассматривать какую-то проблему на изначально не верном коде не правильно. |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Молодец! Так к чему-же это привело, создан массив из 10 структур, в них двумерные массивы по "пять в одном", запускаем пять циклов и в каждом выделяем память для "десяти в одном", то есть по пять лишних для каждой структуры... Это не прокатывает с новым компилятором, а старый это проделывает. Надпись Null Pointer Assignment появляется при выходе из программы если сделать удаление правильно т.е не трогая лишние, так что-же тогдап получается такое в данном случае Null Pointer, пустой указатель или не существующий указатель? должно быть что не существующий в данном случае
??? Кстати может вылести по поводу любого указателя напр FILE *f и не обязательно смысл одинаков, одинаково во всех случаях только то что причина указатель -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Уточнил, там (с нуля) лежит надпись 'Borland C++ - Copyright 1991 Borland Intl.', и после завершения main производится подсчет ее контрольной суммы (просто сумма всех байтов), если она не совпала с ожидаемой - NULL pointer assignment Что касается 'любого указателя, например FILE*', то NULL указатель это не какой то специальный указатель, а вообще ЛЮБОЙ указатель, значение которого равно NULL (или 0, что однои тоже) И совсем не обязательно самому записывать что-то по такому указателю, это может сделать и библиотека компилятора, если использовать ее сервисы неправильно, например достаточно сделать 2 раза delete (или free) одного и того же указателя, при первом delete будет возвращена память в менеджер памяти (указанный блок памяти будет подвязан к списку свободных), при втором delete он будет подвязан еще раз, что приведет к искажению указателей из ДРУГИХ блоков на него, после чего вся куча оказывается разрушеной и последующие обращения к менеджеру памяти скорее всего вызовут записи по этим разрушенным поинтерам, которые вполне могут оказаться и нулевыми. С FILE* то же самое, библиотека может разрушить внутренние структуры если 2 раза вызвать fclose например. |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
-------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| apook |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Проблема вобщем в том что пишешь пишешь программу все идет правильно и когда строк кода стало много и включенных файлов тоже, вдруг откуда ни возьмись ......
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |