Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 11.02.2015
Сообщений: 1

Мистическая ошибка или баг компилятора?

02.10.2011, 23:26. Показов 1070. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа (шахматная), написанная на C++. Больше года все работало корректно, но неожиданно появилась мистическая ошибка. Есть вероятность, что именно компилятор С++ в 2005-й студии сгенерировал что-то неправильно, в результате чего ошибка и появилась. Я дизассемблировал код, и посмотрел что происходит после выполнения каждой ассемблерной инструкции, что в регистрах, что в памяти и т.д. Если есть хорошие специалисты по ассемблеру, помогите выяснить, есть ли здесь баг в ассемблерных инструкциях.

Значит, ситуация такая. Есть строки
(aa,bb,cc — это переменные __int64, находятся не в стеке данной функции, а в хипе — это
поля объекта этого класса, у которого и вызвана данная функция. Изначально этого кода
не было, я создал переменные aa,bb,cc для удобства тестирования. Потому не надо
удивляться, что они имеют такое странное название далее, transformer->arrayK —
это выделенный и проинициализированный ранее массив из 10-ти __int64 (в хипе),
coordinatesK — это выделенный и проинициализированный ранее массив из 7-ми __int64
(в стеке данной функции))

C++
1
2
3
4
5
aa = transformer->arrayK[ 2 ]; // после этого aa == 18
bb = coordinatesK[0]; // после этого bb == 2
coordinatesK[0] = transformer->arrayK[ coordinatesK[0] ];
                              // после этого в coordinatesK[0] находится мусор, а должно быть 18
сс = coordinatesK[0]; // в сс тоже мусор. Написал для удобства.
Это шахматная программа.
Одна программа работает ошибочно, вторая, в другой директории — правильно.
(точнее, это одна и та же программа, т.е. один и тот же экзешник, запущенный из двух мест)
Пишу то, что выводят обе программы, а если что-то различается, тогда то, что программа,
которая работает правильно, выводит — пишу в скобах {}

Вот во что дизассемблируются эти 4 строки ------------>
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
; aa = transformer->arrayK[ 2 ]; --------->
 
mov ecx, dword ptr[eax+15BCCFCh] ; // после выполнения eax==39452704, ecx==34548656
                                                 ; // {а в корректной программе ecx==34548648}
mov edi, dword ptr[ecx+10h] ; // после выполнения edi==34602872
                                       ; // {а в корректной программе edi==34602856}
mov ebp, dword ptr[edi+10h] ; // после выполнения ebp==18
mov dword ptr[eax+18CFA40h], ebp ; //
mov edi, dword ptr[edi+14h] ; // до выполнения edi==34602872, после выполнения edi==0
                                       ; // {а в корректной программе edi==34602856 и потом 0}
mov dword ptr[eax+18CFA44h], edi ; // после выполения переменная aa==18
 
 
 
 
; bb = coordinatesK[0]; --------->
 
mov dword ptr[eax+18CFA48h], esi  ; // esi==2
mov dword ptr[eax+18CFA4Ch], edx ; // eax==39452704, edx==0,
mov dword ptr[esp+2Ch], ecx         ; // esp==3011684, ecx==34548656, после вып-я перем.bb==2
                                                ; // {а в корр. программе ecx==34548648, после вып-я
                                                ; // перем. bb тоже ==2}
 
 
 
; coordinatesK[0] = transformer->arrayK[ coordinatesK[0] ]; --------->
 
mov ecx, dword ptr[ecx+10h]        ; // до выполнения ecx==34548656, после вып-я ecx==34602872
                                               ; // {в корректной ecx==34548648, после вып-я 34602856}
mov edi, dword ptr[ecx+esi*8]      ; // esi==2, после выполения edi==18
mov ebp, dword ptr[ecx+edi*8+4] ; // после вып-я ebp==3198832 !! {а в корректной ebp==0}
mov dword ptr[esp+7Ch], ebx      ; // ebx==24, esp==3011684
mov dword ptr[esp+74h], edi       ; // edi==18
mov dword ptr[esp+78h], ebp      ; // ebp==3198832 !! (из-за него в coordinatesK[0] уже мусор)
                                              ; // {а в корректной программе ebp==0}
 
 
; сс = coordinatesK[0]; --------->
 
mov dword ptr[eax+185A6C8h], edi   ; // eax==39452704, edi==18, ebp==3198832
mov dword ptr[eax+185A6CCh], ebp ; // до выполнения этой инструкции переменная cc==18, а после
                                                 ; // выполнения сс==13738878825398290, а в корректной программе
                                                 ; // {выше ebp==0, и после выполнения обоих строк cc==18}
здесь можно скачать скриншоты —


Если кто спец по ассемблеру, скажите — какой будет вердикт — это баг компилятора,
или что-то другое?

Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.10.2011, 23:26
Ответы с готовыми решениями:

Ошибка компилятора
Доброе время суток. Недавно начал изучать ассемблер. Дошел до главы о создании цикла. Проблема появилась такая: при компиляции написанного...

[DOSBox] Компилятор не находит исходник
Создаю первую программу на Assembler. В чем ошибка?

std::regex : баг на сайте или баг компилятора?
http://en.cppreference.com/w/cpp/regex/regex_match этот код выкидывает throw... Добавлено через 35 секунд компилятор gcc 4.8

3
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
03.10.2011, 16:42
mov ebp, dword ptr[ecx+edi*8+4] // после вып-я ebp==3198832 !! {а в корректной ebp==0}
В этой строке судя по всему вместо edi должно быть esi.
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
03.10.2011, 16:55
Если программа не работает с диском, то работоспособность не должна зависеть от папки, из которой запущена программа!

Следовательно, проблемы в самой программе!
0
0 / 0 / 0
Регистрация: 11.02.2015
Сообщений: 1
03.10.2011, 16:55
В этой строке судя по всему вместо edi должно быть esi.
Да, на другом форуме уже выяснили, что это самый натуральный баг компилятора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.10.2011, 16:55
Помогаю со студенческими работами здесь

Баг компилятора или я дурак?
До:https://www.cyberforum.ru/attachment.php?attachmentid=840160&stc=1&d=1496427343 ...

Баг компилятора или я чего-то не понимаю?
Столкнулся с некоректной работой мк ATmego328P, хотя в C-шном коде ошибок не видно. В таких случаях обычно смотрю дизассемблированный код...

Баг компилятора? Или я чего то не догоняю?
Компилил в 2008 студии. Вопрос: ПОЧЕМУ ЭТОТ КОД КОМПИЛИРУЕТСЯ? class Bee { private: template<class Foo2> ...

баг компилятора, или беда с типами данных?
привет) есть задача, где нужно проверить, равна ли сумма чисел единице... проще простого не правда ли, но вот что у меня получаеться: ...

Вложенные CMap или CArray-объекты. Ошибка компилятора или неправильная работа.
Имеется: struct OPER { CString name; //название CString symbol; //обозначение };


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru