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
Почему этот решатель Sudoku работает хорошо при составлении с Clang или MSVC, но сбой с GCC? ⇐ C++
Программы на C++. Форум разработчиков
1744451355
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 для обнаружения повреждения памяти или неопределенного поведения.
[b] отладка с помощью GDB [/b]: установление точек перерыва перед сбоем и осмотр состояния 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[i][j];
}
}
}
void print(const MAP_Ty &map) {
for (int i=0; i
Подробнее здесь: [url]https://stackoverflow.com/questions/79570264/why-this-sudoku-solver-works-well-when-compiled-with-clang-or-msvc-but-crash-wit[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия