Ошибки адресов

Тема в разделе "LANGS.C", создана пользователем NoName, 10 ноя 2011.

  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Подскажите люди. Возможно это самый сложный баг с которым мне приходилось бороться.

    Есть некий, достаточно простой код на си который в силу внешних обстоятельств (работа с импортом и экспортом) перестал работать.

    Вывожу на экран содержимое странных значений. Адрес FullProjectIdent при работе не изменяется.

    Код (Text):
    1. unsigned char * FullProjectIdent[];
    2. ...
    3. for( i = 0; FullProjectIdent[ i ] != NULL; i++ ) ;
    4. //i = 0x11.
    5.  
    6. b = i; //b добавлена для проверки и далее не изменяется кроме места применения.
    7.  
    8. &FullProjectIdent = 0x3380
    9. ...
    10. &FullProjectIdent[i - 1] = 0x33C0 //по неведомой причине индекс (i - 1) выдает NULL.
    11. ... (i не изменяется.)
    12. &FullProjectIdent[--i] = 0x33C4 //!!!!!!!!!!!!!!!??????????????
    13. ...
    14. FullProjectIdent[--b] = 0x3870 //!!!!!!!!!!!!!!!??????????????
    15. ...
    16. &FullProjectIdent[0x10]  = 0x3380 //!!!!!!!!!!!!!!!??????????????
    Остальной код в большом проекте работает нормально. Пытаюсь понять в чем дело.
    FullProjectIdent импортируется из отдельной DLL.

    Подскажите - это ошибка при обработки связки импорта экспорта или какая-та ошибка обработки фиксапов?
    Как это победить? Я даже не очень понимаю что конкретно мне ловить и где.

    Схема получения значения для:
    Код (Text):
    1. ?live1@2868: ; EBX = i
    1. &FullProjectIdent
    Код (Text):
    1. push offset _FullProjectIdent
    2. i - 1
    Код (Text):
    1. mov       eax,ebx
    2. shl       eax,2
    3. add       eax,offset _FullProjectIdent-4
    4. push      eax
    3. --i
    Код (Text):
    1. dec       ebx
    2. shl       ebx,2
    3. add       ebx,offset _FullProjectIdent
    4. push      ebx
    4. --b
    Код (Text):
    1. dec       dword ptr [ebp-4]
    2. mov       eax,dword ptr [ebp-4]
    3. push      dword ptr [_FullProjectIdent+4*eax]
    5. 0x10
    Код (Text):
    1. push offset _FullProjectIdent+64
    Компилятор Borland 4.5. Не спрашивайте почему просто так надо.
     
  2. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Такое впечатление что все смещения добавляемые к offset _FullProjectIdent стираются, тогда понятно поведение в 4 случаях из 5 (кроме --b).
     
  3. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    NoName, сабжевый проект возможно выложить в паблик, нам на отладку?
    Я бы дал много процентов вероятности, что просто нужно погонять это щастье со «свежей» головой, не вдаваясь в детали.
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Единственные средства отладки - запреты прерываний, вывод на экран и внедрение в исходный код проверок.
    Код выполняется параллельно с другими задачами. Там тонны кода.
    Программа работает под своей ОС.

    Еще у меня есть предположение что дело в линковщике.
     
  5. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    //del
    Прошу прощения, сначала не разобрался, что проблема — невалидные значения указателей
     
  6. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    При каких условиях Massive[i - 1] и Massive[--i] могут выдавать разный результат?
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    NoName

    Это какой вообще язык, лол?
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    думаю, что не при каких))) выложи бажный код полностью...

    совершенно типоичное Си))) такое Си)))
     
  9. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Прошу прощения, что снова лезу поперёд батьки в пекло, но всё же.

    Меня вот это -4 в коде [i-1] сильно смущает.
    У меня тот же самый код компилируется так:

    I-1:
    Код (Text):
    1. MOV RAX, QWORD PTR [RBP -  4]; <-- теперь в RAX лежит I
    2. SUB RAX, 1
    3. SHL RAX, 3
    4. ADD RAX, QWORD PTR [RBP - 16]; <-- складываем (I-1)*SIZEOF(int) с базой массива
    --I:
    Код (Text):
    1. SUB QWORD PTR [RBP -  4], 1
    2. MOV RAX, QWORD PTR [RBP -  4]; <-- теперь в RAX лежит --I
    3. SHL RAX, 3
    4. ADD RAX, QWORD PTR [RBP - 16]; <-- складываем (--I)*SIZEOF(int) с базой массива
    При этом между вызовами ни [RBP - 16], ни [RBP - 4] не изменяются.

    Откуда вдруг взялось это -4 у Вас — неясно.
     
  10. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    размер элемента массива _FullProjectIdent = 4

    Скомпилировал отдельную dll. В работе там тоже -4 есть, но все показывается правильно:
    Код (Text):
    1. [i-1]
    2. ?live1@1044: ; EBX = i, ESI = &FullProjectIdent, EDI = &Buff
    3.     push      dword ptr [esi+4*ebx-4]
    4.     push      edi
    5.     call
    Такое впечатление что конструкция offset _FullProjectIdent - 4 стремная, хотя вроде ничего криминального.
     
  11. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Нда уж, это снова я дурак со своими 64 битами. ИЧСХ, сам же вместо RBP + 8 написал + 4.
    Надо больше отдыхать.

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