LINUX.ORG.RU

Зобми c++

 , nszombieenabled


0

5

В objc есть удобная штука — включение параметра nszombieenabled при сборке (или это параметр рантайм? не знаю), когда объекты при «освобождении» никуда не освобождаются, а остаются в памяти. Если такому объекту поступает любое сообщение-вызов, программа сразу же падает с красивым стектрейсом и говорит, что произошло и кто виноват.

Есть ли что-нибудь похожее для C++?

★★★★★

Последнее исправление: note173 (всего исправлений: 1)

Есть ли что-нибудь похожее для C++?

weak/shared указатели, которые позволяют тебе никогда не сесть в подобную лужу.

red_eyed_peguin
()

попробуй valgrind, он более общую задачу решает

dt1 ★★
()
Ответ на: комментарий от red_eyed_peguin

У всех бывают ошибки, особенно на с++.

note173 ★★★★★
() автор топика
Ответ на: комментарий от gogi

Далеко не всегда работа с «висящим» указателем сразу же приведет к ошибке, а когда приведет — может упасть в совсем другом месте.

Можно еще использовать malloc в отладочном режиме, с контрольными суммами и границами, но это все еще слишком низкоуровнево.

note173 ★★★★★
() автор топика
Ответ на: комментарий от note173

Можно еще использовать malloc в отладочном режиме, с контрольными суммами и границами, но это все еще слишком низкоуровнево

Тогда бери valgrind, как посоветовали выше. Такие глупые ошибки он замечательно отлавливает.

red_eyed_peguin
()

это работает в рантайме, хорош для отладки

Boy_from_Jungle ★★★★
()

на C++ это можно написать самому

Harald ★★★★★
()
#include <cstdio>
#include <cstring>

struct A
{
	virtual void a() {}

	void operator delete(void* p)
	{
		memset( p, 0, sizeof( A ) );
	}
};

int main()
{
	A* a = new A;
	delete a;

	int test = *((int*) a);
	printf( "OK\n" );

	a->a();
}

только методы делать надо виртуальными и пропарсить реальный размер vtable

vaino
()
Ответ на: комментарий от red_eyed_peguin

Что простите? Даже на Scala/Clojure код пишется быстрее и веселее. И поддерживать его намного легче чем на этом убожестве.

anonymous
()
Ответ на: комментарий от vaino

Я бы пожалуй лучше помечал эти участки памяти как участки, которые необходимо удалить и отдавал бы их в pool, который бы периодически в отдельном треде бы их чистил. Вполне себе сборщик мусора.

Gorthauer ★★★★★
()
Ответ на: комментарий от anonymous

пишите на чем хотите, не надо засорять тему

vaino
()
Ответ на: комментарий от KblCb

А что такое libSegFault.so и где можно про него поглядеть?

библиотека из состава glibc, перехватывает SIGSEGV и выдает информацию - стек, регистры и т.п.

vaino
()

или лучше так, чтоб не засорять классы:

#include <cstdio>
#include <cstring>

void operator delete(void* p)
{
	if( p )
		memset( p, 0, sizeof(void*) );
}

struct A
{
	virtual void a() {}
	int m = 1;
};

int main()
{
	A* a = new A;
	delete a;

	printf( "%d\n", a->m );
	a->a();
}

// добавлена проверка на NULL

vaino
()

Так ты и так скорее всего получишь segmentation fault при обращении к уничтоженным данным через обычный указатель. Ну а так верно говорят - используй weak/shared pointer'ы.

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Так ты и так скорее всего получишь segmentation fault при обращении к уничтоженным данным через обычный указатель.

#include <cstdio>
#include <cstring>

struct A
{
	void a() { m = 1; }
	int m;
};

int main()
{
	A* a = new A;
	delete a;

	a->a();
	printf( "%d\n", a->m );
	printf( "WTF?\n" );
}
vaino
()
Ответ на: комментарий от vaino

хм, странно, ведь должно же ей нул присобачить, или я чего-то не понимаю (

Boy_from_Jungle ★★★★
()

В objc есть удобная штука — включение параметра nszombieenabled при сборке (или это параметр рантайм? не знаю), когда объекты при «освобождении» никуда не освобождаются, а остаются в памяти. Если такому объекту поступает любое сообщение-вызов, программа сразу же падает с красивым стектрейсом и говорит, что произошло и кто виноват.

Я так понимаю, objc интерпретруемый язык?

Есть ли что-нибудь похожее для C++?

Для этого тебе надо будет каким-то хитрым образом пометить освобождённую память как недоступную, чтобы glibc падал и писал бэктрейсы.

O02eg ★★★★★
()
Ответ на: комментарий от O02eg

Для этого тебе надо будет каким-то хитрым образом пометить освобождённую память как недоступную

что не гарантирует того, что malloc тебе в следующий раз не предложит ее же

чтобы glibc падал

glibc падать тут вообще не обязан, помочь упасть программе могут реализации вроде dmalloc, но под линукс я такого не видел

vaino
()
Ответ на: комментарий от O02eg

ObjC — компилируемый язык и даже если мне память не изменяет статически-типизированный. Просто у него «большой, ярко выраженный рантайм».

KblCb ★★★★★
()
Ответ на: комментарий от O02eg

Я так понимаю, objc интерпретруемый язык?

Это обычный Си, объекты хитро завернуты в структуры, но все методы — исключительно виртуальные и полное отражение (можно классы на ходу достраивать, вызывать метод по имени, вообще нет проверки на тип объекта, который принимает сообщение).

Упомянутый флаг при удалении объекта (там ручной счет ссылок, так что при обнулении счетчика) оставляет его в памяти и на каждое сообщение поднимает исключение.

note173 ★★★★★
() автор топика
Ответ на: комментарий от vaino

чтоб получить «красивый стектрейс» надо слинковаться с libSegFault.so

С линкованием к чему-то, особенно глубоко системному, сложности. Целевая среда — андроид, арм, там даже при нормальных условиях трассировки очень непонятные. libSegFault с этим совместим?

note173 ★★★★★
() автор топика
Ответ на: комментарий от note173

libSegFault с этим совместим?

он часть glibc, так что не факт, но в принципе там совсем немного кода, если что можно, глядя на него, накидать аналог у себя, тем более, если хочется все это сохранять в логи

vaino
()
Ответ на: комментарий от PolarFox

В андроиде не glibc.

если б я не знал, я б не писал - «не факт», libSegFault там сбоку и использует, например, backtrace, который есть и в bionic

vaino
()
Ответ на: комментарий от note173

слушай у тебя нет проблем с эклипсом?
у меня такая хрень что не может найти наймспейсы, хотя пути прописаны
Весь инет испасан этой багой но решения у меня нет(

Boy_from_Jungle ★★★★
()
19 июня 2012 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.