2014-12-05 5 views
0

У меня есть ~ 15'000 строк C/C++-программа и где-то в ней - простой массив используется вне границ (его догадка), причина «неопределенного поведения» «Случается (ну, нет, мой cdrom не открывается случайным образом), но память кучи изменяется где-то в коде! некоторая определенная целая память просто переходит в нецелесообразные случайные исключения памяти, где она не должна произойти, и если я удаляю или изменяю что-либо, исключения происходят в другом месте, странном и прерывистом ... Итак, мне нужно заменить 100 массивов на что угодно, что бы проверить границы должным образом. И что-то потребует минимальных изменений.Ближайшее возможное решение для замены массивов на что-то, что могло бы проверить границы C++

Могу ли я создать класс, который имитирует поведение массивов, но проверяет границы, чтобы я мог легко менять все массивы? или какое решение в этом случае вы бы предложили? Я новичок в C++, любые примеры для меня - золото.

Я использую Windows 7, говоря простой массив я имею в виду:

int data[400]; 
data[20] = 4; // its fine 
data[-13] = 9; // opens cdrom, or formats hard drive, or works till your windows gets updated 
+0

Можете ли вы потушить часть своего кода, чтобы мы могли видеть? – bobtheboy

+0

['std :: array'] (http://en.cppreference.com/w/cpp/container/array) –

+0

Это может быть довольно сложно отладить. Я предлагаю использовать valgrind или эквивалентный инструмент, который может дать вам больше информации о недопустимом доступе к памяти. – SirDarius

ответ

0

Неожиданное изменение динамической памяти может быть из-за нарушения границ массива.

Это также может быть связано с разыменованием оборванных указателей. По моему опыту, это еще более вероятно.

Across 15000 строк кода, самый быстрый способ, которым Вы могли бы решить эту тайну будет тратить время, чтобы выяснить, как использовать инструмент, как valgrind.

Так как вы говорите, что вы своего рода новый в C++, следует иметь в виду, что standard library's template containers (например, пределы проверки, в состоянии std::array), range-based for loops и smart pointers далеко ходить, чтобы предотвратить обе проблемы я упоминаю.

+0

что я сделал: взял std: array, изменил его, чтобы проверить границы по умолчанию с помощью оператора [] и изменил все массивы, чтобы инициализировать мой новый класс массива. после проверки всего, я отключу проверку границ по умолчанию везде или только там, где важна оптимизация процессора. нашел 2 массива, которые выходят за пределы, но основной сбой был причиной использования указателя на неправильно инициализированные данные. – Tomas

0

Простейшая вещь, которую вы могли бы попробовать это связать с библиотекой отладки таНос. Никаких изменений кода, и он, вероятно, поймает перерасход в массивах, распределенных кучами. Если не ловит, то, вероятно, это что-то плохое в стеке

В Linux наиболее часто используемые электрический забор, мне очень помог

Есть порты этой библиотеки к Windows,

http://sourceforge.net/projects/duma/

https://code.google.com/p/electric-fence-win32/

Смежные вопросы