Почему этот решатель Sudoku работает хорошо при составлении с Clang или MSVC, но сбой с GCC?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему этот решатель Sudoku работает хорошо при составлении с Clang или MSVC, но сбой с GCC?

Сообщение Anonymous »

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»