Неприятная ошибка - A1010

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 8 май 2017.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    208
    Если кому интересно предлагаю программку которая помогает отловить в коде ошибку - A1010 программка заточена под платформу Ассемблера - masm32

    Пояснение к программке:


    При программировании компилятор платформы Ассемблера - masm32 в определённых случаях выдаёт ошибку
    fatal error A1010:unmatched block nesting : .if-.repeat-.while
    суть этой ошибки в том что компилятор не нашёл закрывающую директиву к одному из этих высокоуровневых блоков
    Код (ASM):
    1.  .if
    2.    .endif
    3.  
    4.    .repeat
    5.    .until
    6.  
    7.    .while
    8.    .endw
    но самый большой подводный камень в том, что компилятор конечно пропишет адрес ошибки но искать эту ошибку по этому адресу с большой долей вероятности бесполезно не исключено что это происходит потому, что компилятор попытается найти закрывающую директиву где то дальше по коду и скорее всего уходит за горизонт

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

    Ради интереса можно проверить это тестом например в каком нибудь проекте в каком нибудь подключённом файле этого проекта и в какой нибудь прописанной там функции пропишите в её теле один из этих блоков например просто блок пустышку
    Код (ASM):
    1.    .if eax == 0
    2.    .endif
    теперь если вы в этом блоке закомментируете открывающую директиву
    Код (ASM):
    1.    ;.if eax == 0
    2.    .endif
    и запустите компилятор то он выдаст ошибку
    fatal error A1011:directive must be in control block
    вначале этой ошибки - A1011 компилятор укажет вам имя подключённого файла и номер строки закрывающей директивы - .endif
    вольный перевод этой ошибки будет: 'Должна быть открывающая директива блока', то есть в данном случае директива - .if

    Но подобные ошибки компилятор не плохо раскрывает, а вот если вы вместо директивы - .if закоментируете закрывающую директиву
    Код (ASM):
    1.    .if eax == 0
    2.  
    3.    ;.endif
    то тогда то и всплывёт неприятная ошибка - A1010, где компилятор скажет вам что блок не закрыт и в большинстве случаев укажет вам бесполезный адрес, а в большом проекте найти эту ошибку будет мягко говоря не совсем просто

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

    Алгоритм поиска этой ошибки в программе реализован так данные анализируемого файла загоняются в буфер и программа начинает искать эти сигнатуры
    Код (ASM):
    1.    .if
    2.    .endif
    3.    .while
    4.    .endw
    5.    .repeat
    6.    .until
    для каждого из этих трёх блоков у программы есть три буфера, в который она записывает адрес строки открытия блока и, соответственно, закрывает этот адрес, если блок закрывается соответствующей директивой после прохода всего файла от начала до конца программа просматривает эти буфера и, если в каком нибудь буфере или буферах она найдёт открытые адреса строк данного блока, то программа формирует перечень найденных ошибок и выводит их в окно программы для просмотра, так же в районе правого угла появляется кнопка значок в виде стрелки и, если вас не устраивает информация в окне, можно кликнуть по этому значку и тогда программа запишет эту информацию в файл который будет иметь имя - $error$ и положит его рядом с исполнительным файлом

    Программа может отловить и ошибку - A1011 это где компилятор напишет, что должна быть открывающая директива блока, но подобную ошибку и компилятор неплохо находит по большому счёту эту программу можно использовать в том случае если ваш компилятор выдал вам именно ошибку - A1010 с непонятными координатами этой ошибки

    Эта программа конечно не панацея, но в определённых случаях может помочь найти ошибку при анализе она руководствуется только заложенным в ней алгоритмом и своеобразными фильтрами, но предусмотреть все подводные камни очень сложно, программа работает с указанными сигнатурами, которые могут находиться например в обычном текстовом файле, но в любом случае программа будет принимать их за чистую монету или например если ошибка - A1011 будет в сочетании с ошибкой - A1010, то программа может выдать некорректные данные, но в любом случае она может существенно уменьшить зону поиска проблемы

    Если программа всё таки не нашла ошибку или указала не правильную информацию, то это будет означать что алгоритму программы не по зубам анализируемый в данный момент файл

    Чтобы начать анализ нужно мышкой перетащить в окно программы файл или папку, если перетащить папку, то программа проанализирует все файлы в этой папке и, если программа найдёт в этой папке ещё и вложенные папки, то программа включит рекурсию и проанализирует так же все файлы в этих папках, а если перетащить в окно программы файл, то программа проанализирует все файлы из этой же директории и соответственно все вложенные папки в ней

    Если по определённым причинам надо проверить только избранные файл или файлы, тогда нужно эти файлы скопировать в любую пустую папку и перетащить эту папку в окно программы

    У программы установлен лимит не больше ста (100) файлов во время поиска в шапке окна будет прописываться индикация файлов

    Если программе для анализа попадётся бинарный файл, где в одном из байтов будет прописан ноль (0), то программа естественно проигнорирует этот файл все остальные бинарные файлы где нет нулей программа будет анализировать

    Если программа не найдёт своим алгоритмом ошибки, то она выведет это сообщение и покажет количество файлов которые она просмотрела

    Как только программа в одном из файлов найдёт ошибку или ошибки она сразу же прекратит поиск и выведет эту информацию в окно программы с указанием файла где она нашла ошибку или ошибки
    • ошибки блока - .if будут первые в списке
    • ошибки блока - .while будут вторые в списке
    • ошибки блока - .repeat будут третьи в списке
    Программа имеет заточку под кодинги, написанные под платформу - masm32

    Если кому-нибудь это хоть немного интересно, выкладываю ссылку на програмку на яндекс-диске

    https://yadi.sk/d/qMdbjlDn3Hqzid

    у файла пароль - assch
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Писать нужно не в штатном блокноте, а в заточенном под кодинг редакторе и использовать блочные отступы. И никакие выпрямляторы рук не нужны будут :)
     
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    rmn,

    Писать нужно когда в уме удерживаются начала и концы условных конструкций. Иначе нужны не выпрямляторы" рук, а разума :sarcastic_hand:
     
  4. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    208
    rmn,
    не подскажешь такой редактор для - masm32
     
  5. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    А notepad++ не?
     
  6. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    assch, идея нормальная, но если нужна IDE, могу посоветовать "WinASM Studio". Она как-раз выделяет табами блоки(IF)
     

    Вложения:

    • if.JPG
      if.JPG
      Размер файла:
      50,5 КБ
      Просмотров:
      699
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    И вообще не понятен смысл такого программистского акта, как комментирование/удаление закрывающего блок тега. Какой еще результат кроме ошибки компиляции тут можно ожидать? Или ТС пишет код последовательно и не знает, что гораздо удобней парные синтаксические элементы (скобки, границы блоков) писать сразу, а потом уже писать между ними код?..
     
  8. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    208
    rmn,
    смысл комментирование/удаление закрывающего блок тега в том чтобы искуственно вызвать эту ошибку (это просто тест неужели не понятно)
    и когда компилятор покажет эту ошибку посмотреть на её адрес и убедится что указанный адрес мягко говоря далеко не правильный