Debugger GNU (GDB) выявил неожиданную проблему в моей программе, где std :: vector CAN_PLACE содержит незаконное значение, в частности, 1431655795 (что переводится на 0x55555555 в Hexadecimal). Это испорченное значение приводит к сбою программы в строке 113. Ситуация особенно загадочной, поскольку проблема не проявляется, когда код собирается с использованием Clang или Microsoft Visual C ++ (MSVC). Тем не менее, проблема последовательно возникает при использовании коллекции компилятора GNU (GCC) во всех тестируемых параметрах компиляции, включая различные уровни оптимизации (-O0, -o1 , -o2 , -o3 ), символы отладки (-g), и даже со строгими предупреждениями-Wall, -wextra ).
После дальнейшего расследования я подозреваю, что проблема может быть связана с неопределенным поведением (UB) в коде, который GCC обрабатывает иначе, чем Clang или MSVC. Значение 0x55555555 часто связано с неонициализированной памятью или повреждением памяти в средах отладки, поскольку это повторяющийся шаблон, который некоторые отладчики памяти (такие как Valgrind или дезинфицирующие средства) используют для маркировки освобожденной или неонициализированной памяти. Это говорит о том, что вектор CAN_PLACE может быть доступен до надлежащей инициализации или что переполнение буфера или без использования-без использования.-fsanitize=address) и неопределенный-fsanitize=undefined) под gcc для обнаружения повреждения памяти или неопределенного поведения.
отладка с помощью GDB : установление точек перерыва перед сбоем и осмотр состояния can_place в различных моментах, чтобы определить, когда незаконное значение введено. Вывод между GCC и Clang для определения любых оптимизаций или причуд генерации кода, которые могут объяснить расхождение. Если RESRIZE () или push_back () операции выполняются правильно. std :: vector имеет более строгие предположения о выравнивании или оптимизации, которые обнажают скрытые ошибки в коде. Например, если программа опирается на арифметическую или небезопасную линию указателя, GCC может генерировать код, который ведет себя по -разному при оптимизации. Другая возможность состоит в том, что механизмы распределения или обработки исключений GCC плохо взаимодействуют с логикой программы.#include
#include
#include
#include
#include
#include
using MAP_Ty=std::array;
void input(MAP_Ty &map, std::istream &is=std::cin) {
for (int i=0; i map[j];
}
}
}
void print(const MAP_Ty &map) {
for (int i=0; i
Подробнее здесь: https://stackoverflow.com/questions/795 ... -crash-wit