Что за странная ошибка?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Что за странная ошибка?

Сообщение Mikle » 12.09.2022 (Пн) 14:02

Впервые с таким столкнулся:
Есть небольшой проект, при попытке компиляции в Native Code получаю такое сообщение об ошибке:
D:\Work\Games\Retro\Game\modPers.bas(166) : fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'e:\work\utc2\src\P2\x86\MDmisc.c', line 2245)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information

В файле modPers.bas 166 строка есть, но она пустая.
Диск E: есть, но там нет папки Work, эта папке находится (и была до сих пор) на диске D:.
В P-Code компилируется успешно, из среды тоже запускается без проблем.
После попытки скомпилировать в Native Code в папке проекта появляется файл modPers.OBJ нулевого размера.
Другие проекты компилируются успешно.
При чём тут вообще C++? Проект на голом VB6.
На всякий случай прикладываю проект, это небольшая ретро игрушка. На анимацию внимания не обращайте - я пока до неё не добрался.
Вложения
RetroGame.zip
(68.4 Кб) Скачиваний: 52

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что за странная ошибка?

Сообщение Хакер » 12.09.2022 (Пн) 17:49

Mikle писал(а):При чём тут вообще C++? Проект на голом VB6.

При том, что скрещивая EB и Ruby для получения среды разработки, разработчики VB столкнулись с необходимостью генерации EXE-файлов. Поскольку EB предполагаел генерацию и выполнение только P-кода, выход из положения нашли такой: взяли компилятор C/C++, который архитектурно представлял собой две половинки — фронтенд, который текстовый исходник разбирал и транслировал в высокоуровневое абстрактное представление (не привязанное к ОС или железной архитектуре/платформе), и бэкенд, который из высокоуровневого абстрактного представления (не привязанного ни к языку программирования, ни к платформе) генерировал машинный код под конкретную аппаратную архитектуру — и выдернули из него машинныйкод-генерирующий бэкенд и оформили в виде C2.EXE который положили в набор файлом VB, а в EB добавили логику по генерации IL-данных для бэкенда.

Так что VB для генерации Native-кода использует C2.EXE, являющийся слегка модифицированным бэкендом C2.DLL, являющегося частью компилятора Microsoft C/C++ и разработанного в рамках разработки C/C++, а не в рамках разработки VB/EB/Ruby.

Так что это ошибка в C2-бэкенде, а не в самом VB.


Проблемный проект ещё не смотрел :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Что за странная ошибка?

Сообщение Mikle » 12.09.2022 (Пн) 19:40

Да, я читал твои статьи, в том числе и эту.
Странно, что этот "слегка модифицированный" компилятор ищет какой-то *.c файл по несуществующему пути, выводит текстовые сообщения с предложением читать Technical Support по плюсам, чего компилятор VB явно делать не должен. При модификации сообщения могли и почистить.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что за странная ошибка?

Сообщение Хакер » 13.09.2022 (Вт) 4:04

Mikle писал(а):Да, я читал твои статьи, в том числе и эту.
Странно, что этот "слегка модифицированный" компилятор ищет какой-то *.c файл по несуществующему пути, выводит текстовые сообщения с предложением читать Technical Support по плюсам, чего компилятор VB явно делать не должен. При модификации сообщения могли и почистить.


Он не ищет *.c-файл по несуществующему пути, он показывает место в собственных исходниках, откуда была сгенерирована ошибка.

e:\work\utc2\src\P2\x86\MDmisc.c, — это не несуществующий файл, который он ищет. Это один из файлов, образующих исходники компилятора Microsoft C/C++, существовавший на машине человека (компилировавшего компилятор Microsoft C/C++) на момент сборки компилятора, а потому жестко вшитый в бинарник как раз для этих целей (вывод сообщений о ошибках).

Это просто результат работы сишного волшебного макроа __FILE__ и __LINE__, который заменяется на имя текущего файла и номер текущий строки, где бы в сишном коде оно не встретилось.

То есть там, в файле e:\work\utc2\src\P2\x86\MDmisc.c в окрестности строки 2245 есть что-то такое:
Код: Выделить всё
if(procedure->SizeOfAllLocalVars < 0)
{
    DieWithFatalError(1001, __FILE__, __LINE__);
}


То есть как VB-шные Err.Source и Erl(), только всегда по делу, а не как в VB.

Mikle писал(а):с предложением читать Technical Support по плюсам

Не читать, а выбрать в Visual C++ команду Technical Support:
vcpp_techsup.png
vcpp_techsup.png (9.33 Кб) Просмотров: 1181

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

чего компилятор VB явно делать не должен. При модификации сообщения могли и почистить.

Уверен, что команде, разрабатывающей VB, доступ к исходникам компилятора C/C++ даже не давали. Для них просто C2.DLL, являющийся бэкенд-модулем для CL.EXE переделали в C2.EXE и выдали в виде «чёрного ящика», которому нужно скармливать IL-файлы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что за странная ошибка?

Сообщение Хакер » 13.09.2022 (Вт) 8:32

Хакер писал(а):Так что это ошибка в C2-бэкенде, а не в самом VB.

Вообще, может быть ошибка всё-таки в самом VB: возможно он генерирет неправильное IL-представление модуля.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Что за странная ошибка?

Сообщение Mikle » 13.09.2022 (Вт) 9:04

Фантастика.
Я закомментировал эти строки:
Код: Выделить всё
  Select Case pmMode
    Case pmFly
'      PersSpdY = (PersSpdY + 0.002) * 0.998
'      PersSpdX = PersSpdX * 0.995
'      If PersSpdY > 0 And (TestFloor(pLX, pDY, sL) Or TestFloor(pRX, pDY, sR)) Then
'        Spd = Sgn(sL + sR)
'        PersSpdY = 0
'        PersY = pDY
'        ChangeMode pmRun
'      ElseIf Abs(PersX - (pCX + 0.5)) < 0.1 Then
'        If Map(pCX, pCY) = 5 Then
'          PersX = pCX + 0.5
'          PersSpdX = 0
'          PersSpdY = 0
'          ChangeMode pmRope
'        ElseIf Map(pCX, pCY) = 7 Then
'          PersX = pCX + 0.5
'          PersSpdX = 0
'          ChangeMode pmSlide
'        End If
'      End If

    Case pmRun
      If TestFloor(pLX, pDY, sL) Or TestFloor(pRX, pDY, sR) Then
        Spd = Sgn(sL + sR)
'        PersSpdX = (PersSpdX + PersFX * 0.006 + Spd * 0.002) * 0.8
        If fJump Then
'          PersSpdX = PersFX * 0.03
'          PersSpdY = -0.075
'          PersY = PersY - 0.8
'          ChangeMode pmFly
        ElseIf PersFY > 0 And Abs(PersX - (pCX + 0.5)) < 0.1 Then
'          If Map(pCX, pDY) = 4 Then
'            PersX = pCX + 0.5
'            PersY = PersY + 0.1
'            PersSpdX = 0
'            PersSpdY = 0
'            ChangeMode pmRope
'          ElseIf Map(pCX, pDY) = 2 Then
'            PersX = pCX + 0.5
'            PersY = PersY + 0.1
'            PersSpdX = 0
'            PersSpdY = 0
'            ChangeMode pmLadder
'          End If
        ElseIf PersFY < 0 And Abs(PersX - (pCX + 0.5)) < 0.1 Then
'          If Map(pCX, pCY) = 3 Then
'            PersX = pCX + 0.5
'            PersY = PersY - 0.1
'            PersSpdX = 0
'            PersSpdY = 0
'            ChangeMode pmLadder
'          End If
        End If
      Else
'        ChangeMode pmFly
      End If

Проект компилируется.
Если внутри Case pmRun снять комментарий со строки:
Код: Выделить всё
        PersSpdX = (PersSpdX + PersFX * 0.006 + Spd * 0.002) * 0.8

Уже не компилируется!
Раскомментировать там же строки:
Код: Выделить всё
          PersSpdX = PersFX * 0.03
          PersSpdY = -0.075
          PersY = PersY - 0.8
          ChangeMode pmFly

Тоже не компилируется!
Это же просто математика, элементарная, особенно, первый случай, в нём только переменные и константы.
Сорри, привёл первый фрагмент кода из другой версии, сейчас исправил, симптомы те же.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что за странная ошибка?

Сообщение Хакер » 13.09.2022 (Вт) 9:46

Отдельный вопрос: кто-то же когда-то написал этот код, сохранил, распространил. Значит компиляция кода выполнялась?

Или код всю жизнь компилировали тоьлко в P-код?
Или код был изначально написан под VB5, например?

Проявляется ли ошибка на VB6 без SP?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Что за странная ошибка?

Сообщение Mikle » 13.09.2022 (Вт) 9:52

Хакер писал(а):Отдельный вопрос: кто-то же когда-то написал этот код, сохранил, распространил. Значит компиляция кода выполнялась?

Этот код написан мною за последние несколько дней.
В VB6 без SP не проверял, это же нужно как-то удалить SP или найти комп без VB6.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Что за странная ошибка?

Сообщение Mikle » 13.09.2022 (Вт) 15:41

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что за странная ошибка?

Сообщение Хакер » 14.09.2022 (Ср) 9:39

Майкл, ты меня подбиваешь сесть пореверсить компилятор C/C++ :lol:

В целом, по поводу акцентов на то, что выражения математически и довольно простые и примитивные: дело явно не в сложности выражений. Сишный компилятор, точнее его бэкенд-порция получает от VB содержимое компилируемого модуля в виде IL-файлов.

IL это intermediate language: промежуточный язык (не привязанный ни к ЯП, ни к машинной архитектуре и его системе команд и ассемблеру) между фронтэндом, который обязан скушать текстовый человеко-читаемый поток символов, написанный на каком-то языке программирования (например Си или Си++), и бэкендом, который должен выплюнуть машино-специфичное представление.

Не знаю, как технически огранизована передача данных между фронтендом (C1.DLL или C1XX.DLL) и бэкендом (C2.DLL) в случае полноценного сишного компилятора, но в случае VB передача IL-информации идёт через набор IL-файлов:
  • nnnnnGL (Globals)
  • nnnnnIN (Initialization)
  • nnnnnEX (Exports)
  • nnnnnSY (Symbols)
  • nnnnnDB (Data Base)
гле nnnnn — имя временного файла

VB (а конкретнее — EB в лице VBA6.DLL) формирует эти временные файлы в TEMP-папке, потом вызывается C2.EXE с передачей общего префикса.

C2 читает эти файлы и выполняет компиляцию.

Упрощённо можно сказать, что я для каждой записи из одного файла есть соответствующая запись из другого. C2 путешествует по ним, сдвигая указатели/смещения. Если файлы сформированы по какой-то причине криво, где-то забыто выравнивание или пропущена или записана лишняя запись, то при прожёвывании информации получается бредовый рассинхрон.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Что за странная ошибка?

Сообщение The trick » 14.09.2022 (Ср) 12:34

Хакер писал(а):Не знаю, как технически огранизована передача данных между фронтендом (C1.DLL или C1XX.DLL) и бэкендом (C2.DLL) в случае полноценного сишного компилятора


Почти также

UA6527P

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что за странная ошибка?

Сообщение Хакер » 14.09.2022 (Ср) 13:25

Не проверял, что происходит с 2010-ым C2.DLL, если подсунуть ему IL-файлы из проекта Майкла?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Что за странная ошибка?

Сообщение Teranas » 14.09.2022 (Ср) 13:25

Убрал "Предпочтения для pentium pro" и ошибка при компиляции не появляется
Вложения
2022-09-14-13-23-15.png
2022-09-14-13-23-15.png (15.8 Кб) Просмотров: 1141
С уважением, Андрей.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Что за странная ошибка?

Сообщение Mikle » 14.09.2022 (Ср) 13:48

Teranas писал(а):Убрал "Предпочтения для pentium pro" и ошибка при компиляции не появляется

Действительно. Я пробовал играться с другими опциями, но про эту даже подумать не мог.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Что за странная ошибка?

Сообщение Adam Smith » 06.10.2022 (Чт) 11:59

Пару раз замечал, что с этой галочкой экзешки вызывают чуть меньше ложной паники недоантивиров.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Что за странная ошибка?

Сообщение Teranas » 05.12.2022 (Пн) 19:13

Да ерунда, мы уже крутили все параметры компиляции и всегда есть срабатывания антивирусов.
Я тут несколько стационарных антивирусов протестировал, та они мне все мои программы на VB6 нахрен в карантин отправили, причём совершенно безобидные программы работы с текстом.
За это убивать надо!
С уважением, Андрей.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Что за странная ошибка?

Сообщение ALX_2002 » 10.01.2023 (Вт) 14:01

А упаковка EXE через UPX тоже не спасает ? Тоже антивир ругается ?

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Что за странная ошибка?

Сообщение Teranas » 10.01.2023 (Вт) 19:31

ALX_2002 писал(а):А упаковка EXE через UPX тоже не спасает ? Тоже антивир ругается ?

На UPX антивирусы-вирусы ещё больше ругаются
С уважением, Андрей.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Что за странная ошибка?

Сообщение Teranas » 10.01.2023 (Вт) 19:35

Раньше спасали малоизвестные пакеры и криптеры, но сейчас и это не помогает
Изображение
Прикол, даже Microsoft ругается на собственное детище
С уважением, Андрей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что за странная ошибка?

Сообщение Хакер » 11.01.2023 (Ср) 4:36

Teranas писал(а):Прикол, даже Microsoft ругается на собственное детище

Ну, хотя бы им можно написать в надежде на то, что поправят опознавание.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 14

    TopList