Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Null Pointer Assignment 
:(
    Опции темы
xvr
Дата 27.9.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата

но только на старом tcc
С этого и надо было начинать - tcc компилирует под ДОС а у него (у ДОСа) нет понятия 'недоступной памяти', т.е. писать можно куда угодно, в том числе и в нулевые адреса, т.е. через NULL указатель. (ДОС после этого скорее всего сломается, а может и нет)

В tcc был сделан специальный хак для отлова таких записей (причем только в small модели), начало области данных (те самые нулевые адреса для коротких указателей) было зарезервированно и заполненно специальными данными (не помню какими), после окончания программы startup проверял, что эта область не изменилась, и если это оказывалось не так, то выводилось то самое сообщение про 'NULL pointer assignment'

Отловить собственно МОМЕНТ присваивания автоматически увы не получится, только вручную по шагам.

PM MAIL   Вверх
nickless
Дата 27.9.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Короче, я сегодня добрый smile 

Цитата(apook @  27.9.2007,  11:31 Найти цитируемый пост)
Пример без ошибок и предупреждений компелируется на Borland Turbo C++ 3.x

В топку такой компилятор...

Цитата(apook @  27.9.2007,  11:49 Найти цитируемый пост)
Что здесь написано

Переменные, объявлённые в for, не видны за её(его) пределами.

apook, код не только не соответствует стандарту, в нём еще просто много ошибок.
Если подправить синтакс, программа вываливается с Segfault-ом (ака Access Violation), что в твоём древнем компиляторе наверно называется "Null Pointer Assignment" smile 
Ловится это очень просто, например в gdb так:
Код
g++ -Wall -Wextra -pedantic -pipe -g main.cpp -o main
gdb ./main
(gdb) run
Starting program: /tmp/main

Program received signal SIGSEGV, Segmentation fault.
0xb7d966b4 in strcpy () from /lib/libc.so.6
(gdb) backtrace
#0  0xb7d966b4 in strcpy () from /lib/libc.so.6
#1  0x0804868c in main () at main.cpp:42

Со дебагером под дос разбирайся сам...

Проблемы тут были в перепутаных DATSZ и _OODSZ (красивые названия кстати ...по принципу "чтобы никто не догадался", сам придумал? smile ), вот в таких конструкциях 
Код
(char *)word[ i ]
 итд.

Вот исправленый код:
Код
#include<cstdio>
#include<cstring>

const int DATSZ     = 10;
const int _OODSZ    = 5;

struct DAT
{
    char **g_ood, **p_ood, **f_ood;
    int *sensor;
};

int main()
{
    char word[ ]="abcdefgij";
    DAT *acc;
    acc=new DAT[ DATSZ ];

    for( int i=0; i<DATSZ; i++ )
    {
        acc[ i ].g_ood=new char*[ _OODSZ ];
        acc[ i ].p_ood=new char*[ _OODSZ ];
        acc[ i ].f_ood=new char*[ _OODSZ ];
    }
    for( int j=0; j<DATSZ; j++ )
    {
        acc[ j ].sensor=new int[ DATSZ-j ];
    }
    for( int i=0; i<DATSZ; i++ )
    {
        for( int j=0; j<_OODSZ; j++ )
        {
            acc[ i ].g_ood[ j ]=new char[ 10 ];
            acc[ i ].p_ood[ j ]=new char[ 10 ];
        }
    }

    for( int i=0; i<DATSZ; i++ )
    {
        for(int j=0; j<_OODSZ; j++ )
        {
            strcpy( acc[ i ].g_ood[ j ], &word[ i ] );
            strcpy( acc[ i ].p_ood[ j ], &word[ i ] );
        }
    }

    for( int i=0; i<DATSZ; i++ )
    {
        for(int j=0; j<_OODSZ; j++ )
        {
            delete [] acc[ i ].g_ood[ j ];
            delete [] acc[ i ].p_ood[ j ];
        }
        delete [] acc[ i ].g_ood;
        delete [] acc[ i ].p_ood;
        delete [] acc[ i ].f_ood;
        delete [] acc[ i ].sensor;
    }
    printf("%p\n", (char*)word[3]);    // посмотри, что тут выводится ;)
    delete [] acc;
    return 0;
}



--------------------
user posted image

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
PM MAIL   Вверх
Ln78
Дата 27.9.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15




Цитата(apook @  27.9.2007,  07:29 Найти цитируемый пост)
Да просто время жизни обьектов по разному расссматривается старым и более новым компилятором  


Цитата(apook @  27.9.2007,  12:49 Найти цитируемый пост)
Цитата(Daevaorn @  27.9.2007,  12:38 )
name lookup of ‘i’ changed for new ISO ‘for’ scoping

 Что здесь написано грамотей


Вроде как scope переводилось как "область видимости", "область действия", а "время жизни" - это, скорее, lifetime.

apook, опять хулиганишь? smile  
PM MAIL   Вверх
Daevaorn
Дата 27.9.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Ln78 @  27.9.2007,  15:18 Найти цитируемый пост)
Вроде как scope переводилось как "область видимости", "область действия", а "время жизни" - это, скорее, lifetime.

всё так и как, только вот как это относится к NPA не ясно. видимо и автору тоже.
рассматривать какую-то проблему на изначально не верном коде не правильно.
PM MAIL WWW   Вверх
apook
Дата 27.9.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23




Цитата(nickless @  27.9.2007,  13:59 Найти цитируемый пост)
Проблемы тут были в перепутаных DATSZ и _OODSZ 
 Молодец! Так к чему-же это привело,

создан массив из 10 структур, в них двумерные массивы по "пять в одном", запускаем пять циклов и в каждом выделяем память для "десяти в одном", то есть по пять лишних для каждой структуры... Это не прокатывает с новым компилятором, а старый это проделывает. Надпись Null Pointer Assignment появляется при выходе из программы если сделать удаление правильно т.е не трогая лишние, так что-же тогдап получается такое в данном случае Null Pointer, пустой указатель или не существующий указатель? должно быть что не существующий в данном случае

Цитата(xvr @  27.9.2007,  13:54 Найти цитируемый пост)
после окончания программы startup проверял, что эта область не изменилась, и если это оказывалось не так, то выводилось то самое сообщение про 'NULL pointer assignment'


???

Кстати может вылести по поводу любого указателя напр FILE *f и не обязательно смысл одинаков, одинаково во всех случаях только то что причина указатель 





--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
xvr
Дата 28.9.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(apook @ 27.9.2007,  15:02)

Цитата(xvr @  27.9.2007,  13:54 Найти цитируемый пост)
после окончания программы startup проверял, что эта область не изменилась, и если это оказывалось не так, то выводилось то самое сообщение про 'NULL pointer assignment'


???

Кстати может вылести по поводу любого указателя напр FILE *f и не обязательно смысл одинаков, одинаково во всех случаях только то что причина указатель

Уточнил, там (с нуля) лежит надпись 'Borland C++ - Copyright 1991 Borland Intl.', и после завершения main производится подсчет ее контрольной суммы (просто сумма всех байтов), если она не совпала с ожидаемой - NULL pointer assignment

Что касается 'любого указателя, например FILE*', то NULL указатель это не какой то специальный указатель, а вообще ЛЮБОЙ указатель, значение которого равно NULL (или 0, что однои тоже)

И совсем не обязательно самому записывать что-то по такому указателю, это может сделать и библиотека компилятора, если использовать ее сервисы неправильно, например достаточно сделать 2 раза delete (или free) одного и того же указателя, при первом delete будет возвращена память в менеджер памяти (указанный блок памяти будет подвязан к списку свободных), при втором delete он будет подвязан еще раз, что приведет к искажению указателей из ДРУГИХ блоков на него, после чего вся куча оказывается разрушеной и последующие обращения к менеджеру памяти скорее всего вызовут записи по этим разрушенным поинтерам, которые вполне могут оказаться и нулевыми.

С FILE* то же самое, библиотека может разрушить внутренние структуры если 2 раза вызвать fclose например.
PM MAIL   Вверх
akizelokro
Дата 28.9.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



http://www.faqs.org/faqs/msdos-programmer-...section-25.html

А в чем вообще проблема-то?


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
apook
Дата 28.9.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Цитата

А в чем вообще проблема-то?

Проблема вобщем в том что пишешь пишешь программу все идет правильно и когда строк кода стало много и включенных файлов тоже, вдруг откуда ни возьмись ......
Код

//Ну да тут все ясно вопрос можно считать решенным хотя для меня это не так



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.