Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / BYTE buf[16] = {0}; вылетает с исключением. / 25 сообщений из 26, страница 1 из 2
12.02.2016, 13:36
    #39169528
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
DLL стабильно вылетала с исключением на одном компе.
Вставил запись в лог после каждой строчки, в итоге все свелось к
Код: plaintext
1.
BYTE buf[16] = {0};


я офигел, заменил на
Код: plaintext
1.
2.
BYTE buf[16];
memset(buf, 0, 16);


и все заработало.

Visual Studio 2015 Community 14.0.24720 Update 1
Проект Win32 DLL
PlatformToolset = Visual Studio 2015 - Windows XP (v140_xp)

Сглючило на древнем компе WinXP, на других работает, в т.ч. под WinXP

Вот такой привет от с++14. Там ведь {0} это означает не просто ноликами заполнить.
...
Рейтинг: 0 / 0
12.02.2016, 18:10
    #39169816
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Dima TВот такой привет от с++14. Там ведь {0} это означает не просто ноликами заполнить.
А можно привести цитату из стандарта из которой это уже не инициализация массива нулями, а что-то другое?
Код: plaintext
1.
BYTE buf[16] = {0}
...
Рейтинг: 0 / 0
12.02.2016, 18:28
    #39169834
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Со своей стороны привожу цитату отсюда http://en.cppreference.com/w/cpp/language/aggregate_initialization

If the number of initializer clauses is less than the number of members or initializer list is completely empty, the remaining members are initialized by their default initializers, if provided in the class definition, and otherwise (since C++14) by empty lists, which performs value-initialization. If a member of a reference type is one of these remaining members, the program is ill-formed (references cannot be value-initialized)

Из этой цитаты следует, что с С++14 для элементов которым не хватило инициализаторов выполняется инициализация value-initialization, которая для обычных int'ов равна default-инициализации и равна присвоению 0.

Т.е. проблема не в этом.
...
Рейтинг: 0 / 0
12.02.2016, 18:47
    #39169862
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Anatoly MoskovskyDima TВот такой привет от с++14. Там ведь {0} это означает не просто ноликами заполнить.
А можно привести цитату из стандарта из которой это уже не инициализация массива нулями, а что-то другое?
Код: plaintext
1.
BYTE buf[16] = {0}


Я разве сказал что это не иницизация нулями? Я сам это ожидал.
из книжки
авторПростая
замена текста приводит к следующему коду:
auto xl = 2 7 ;
auto х2 ( 2 7 ) ;
auto х3 = { 27 } ;
auto х4 { 2 7 } ;

1 .2. Вывод типа auto 33
Все эти объявления компилируются, но их смысл оказывается не тем же, что и у объявлений,
которые они заменяют. Первые две инструкции в действительности объявляют
переменную типа int со значением 27. Вторые две, однако, определяют переменную типа
std::initializer_list<int>, содержащую единственный элемент со значением 27!
auto x l = 2 7 ; 1 1 Тип int , значение - 27
auto х2 ( 2 7 ) ; 11 То же самое
auto хЗ = { 2 7 } ; 11 std : : initializer_list<int>, значение ( 2 7 }
auto х4 { 2 7 } ; 11 То же самое
Это объясняется специальным правилом вывода ...
Да как бы пофиг как оно инициализируется, т.к. это буфер под Md5 который после снова инициализируется.

Засада в том что поменялось понимание синтаксиса, как следствие изменения в компиляторе, как следствие косяк в компиляторе, в моем случае вылет проги на ровном месте (обращение к несуществующей памяти).

Как обнаружил: втыкал запись в лог после каждой строчки, компилировал и тестил. В итоге получил:
Код: plaintext
1.
2.
3.
4.
WriteLog("123");
BYTE buf[16] = {0};
WriteLog("124");
...


123 в логе было, 124 нет. Это не окончание проги, т.к. вокруг есть __try ... __except(EXCEPTION_EXECUTE_HANDLER) ...

Вобщем заменив на
Код: plaintext
1.
2.
3.
4.
5.
WriteLog("123");
BYTE buf[16];
memset(buf, 0, 16);
WriteLog("124");
...


увидел в логе 124
...
Рейтинг: 0 / 0
12.02.2016, 18:52
    #39169868
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Причем это один комп из нескольких сотен с той же DLL отлично работающей. ХЗ как понимать этот глюк.
...
Рейтинг: 0 / 0
12.02.2016, 19:16
    #39169890
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Dima TЗасада в том что поменялось понимание синтаксиса, как следствие изменения в компиляторе, как следствие косяк в компиляторе, в моем случае вылет проги на ровном месте (обращение к несуществующей памяти).
Так а причем здесь С++14? )))
У вас баг в программе (ну или в компиляторе, но скорее всего именно у вас)
...
Рейтинг: 0 / 0
12.02.2016, 19:18
    #39169892
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Dima TПричем это один комп из нескольких сотен с той же DLL отлично работающей. ХЗ как понимать этот глюк.
Давайте ассемблерный код обоих вариантов функции - посмотрим.
...
Рейтинг: 0 / 0
12.02.2016, 20:08
    #39169907
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Anatoly MoskovskyDima TПричем это один комп из нескольких сотен с той же DLL отлично работающей. ХЗ как понимать этот глюк.
Давайте ассемблерный код обоих вариантов функции - посмотрим.
Его уже нет. Хорошо что клиент дал полдня на разбор. В итоге была выявлена строчка (как выявлена выше написал), затем откат к исходной версии cpp из респозитория и исправление этой строчки. Вобщем то чего надо сравнивать в идеале - не осталось.
...
Рейтинг: 0 / 0
13.02.2016, 13:40
    #39170289
L.Otujktd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Вопрос в размерности типа BYTE и константы 0. Возможно происходит запись в область памяти вне buf(да к тому же это стековая переменная). Имхо смешивание c и с++ может дать такой результат. Как уже сказали без ассемблерного листинга трудно будет что то сказать :)
...
Рейтинг: 0 / 0
13.02.2016, 21:18
    #39170469
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Еще подозрение: у клиента был Pentium3, возможно компилятор вставил какую-то асмовскую команду неизвестную тому процессору, вот и вылетело.
...
Рейтинг: 0 / 0
14.02.2016, 04:24
    #39170581
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
L.OtujktdВопрос в размерности типа BYTE и константы 0. Возможно происходит запись в область памяти вне buf(да к тому же это стековая переменная). Имхо смешивание c и с++ может дать такой результат.
Нет конечно. Не фантазируйте ))
...
Рейтинг: 0 / 0
15.02.2016, 06:23
    #39170965
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Dima T, ну там 20 секунд написать BYTE buf[16] = {0}; и запустить под 2015 под отладчиком, тоже хочу увидеть асм, так как всегда пользуюсь этой конструкцией :(

2005:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	BYTE buf[16] = {0};
00411C70  mov         byte ptr [ebp-24h],0 
00411C74  xor         eax,eax 
00411C76  mov         dword ptr [ebp-23h],eax 
00411C79  mov         dword ptr [ebp-1Fh],eax 
00411C7C  mov         dword ptr [ebp-1Bh],eax 
00411C7F  mov         word ptr [ebp-17h],ax 
00411C83  mov         byte ptr [ebp-15h],al 
...
Рейтинг: 0 / 0
15.02.2016, 09:11
    #39171000
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
из книжкив книжке std::initializer_list накатывается именно для auto , в случае же BYTE , он во всех 4-х случаях будет одинаковый.
...
Рейтинг: 0 / 0
15.02.2016, 09:38
    #39171011
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Посмотрел:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	BYTE buf[16] = { 0 };
	printf((char*)buf);
00F421DE  lea         eax,[buf]  
00F421E1  mov         byte ptr [buf],0  
00F421E5  xorps       xmm0,xmm0  
00F421E8  mov         dword ptr [ebp-17h],0  
00F421EF  push        eax  
00F421F0  movq        mmword ptr [ebp-1Fh],xmm0  
00F421F5  mov         word ptr [ebp-13h],0  
00F421FB  mov         byte ptr [ebp-11h],0  
00F421FF  call        printf (0F41340h)  


Как уже предполагал 18813821 похоже вылет из-за XORPS
http://asm.inightmare.org/opcodelst/index.php?op=XORPS CPU: Pentium III+ (KNI/MMX2)
там проц какой-то древний был, вроде PIII, а может и древнее, точно не помню.

Новые стандарты ни при чем.

Смутило то что выше в коде было
Код: plaintext
1.
BYTE buf[MAX_PATH] = { 0 };

и не вылетало.
Оно совсем по другому компилируется
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
001821DE  push        104h  
001821E3  lea         eax,[buf]  
001821E9  push        0  
001821EB  push        eax  
001821EC  call        memset (0192150h)  
	BYTE buf[MAX_PATH] = { 0 };
	printf((char*)buf);
001821F1  lea         eax,[buf]  
001821F7  push        eax  
001821F8  call        printf (0181340h)  

...
Рейтинг: 0 / 0
15.02.2016, 10:41
    #39171043
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
...
Рейтинг: 0 / 0
15.02.2016, 11:47
    #39171141
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
SiemarglТогда убрать /arch:SSE

https://msdn.microsoft.com/en-us/library/7t5yh4fd.aspx
автор/arch:SSE2

Enables the use of SSE2 instructions. This is the default instruction on x86 platforms if no /arch option is specified.

Попробовал добавить /arch:SSE ничего не изменилось. /arch:IA32 тоже не меняет.

Да и отключать везде ради одного древнего компа - как-то не нормально. Лучше клиенту объяснить что пора бы комп обновить.
...
Рейтинг: 0 / 0
15.02.2016, 12:24
    #39171208
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
[quot Dima T]SiemarglТогда убрать /arch:SSE

Попробовал добавить /arch:SSE ничего не изменилось. /arch:IA32 тоже не меняет.

Да и отключать везде ради одного древнего компа - как-то не нормально. Лучше клиенту объяснить что пора бы комп обновить.вообще убери SSE

судя по всему, у С14 это дефолтная опция... о_О

MAX_PATHКстати, обратите внимание, в компиляторе сидит демон Максвелла.
В приведённом мной коде, он сначала обнуляет 1 байт, потом 4 байта, потом ещё 4, потом 2 и ещё 1. А когда константа разрастается до уровня MAX_PATH, он ниасиливает и вставляет mem_set. Правильно я всё понял? Где-то я уже на такое натыкался...
...
Рейтинг: 0 / 0
15.02.2016, 13:39
    #39171292
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Dima TЛучше клиенту объяснить что пора бы комп обновить.
а собрать под разные компы - никак?
...
Рейтинг: 0 / 0
15.02.2016, 14:00
    #39171306
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
ИзопропилDima TЛучше клиенту объяснить что пора бы комп обновить.
а собрать под разные компы - никак?
потом всю оставшуюся жизнь делать два комплекта обновлений?
...
Рейтинг: 0 / 0
15.02.2016, 14:55
    #39171380
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Dima TИзопропилпропущено...

а собрать под разные компы - никак?
потом всю оставшуюся жизнь делать два комплекта обновлений?
чем это отличается от версий для x86 и x64 ?
...
Рейтинг: 0 / 0
15.02.2016, 15:26
    #39171433
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
ИзопропилDima Tпропущено...

потом всю оставшуюся жизнь делать два комплекта обновлений?
чем это отличается от версий для x86 и x64 ?
ничем, только у меня нет x64 и пока не ожидается. Это вспомогательная DLL для проги на фоксе, а Visual FoxPro x64 никто не обещает.
...
Рейтинг: 0 / 0
15.02.2016, 16:11
    #39171497
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Dima T,

остаются варианты
- собирать под самый дохлый процессор
- в требованиях прописать минимальный (неплохо бы проверить при запуске, что процессор удовлетворяет минимальным требованиям)
- собирать старым компилятором
...
Рейтинг: 0 / 0
15.02.2016, 16:20
    #39171508
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Изопропил- собирать под самый дохлый процессор
- собирать старым компилятором
Не для того я с VC6 на VC2015 переехал наконец-то. Ладно хоть под XP собирает.
Изопропил- в требованиях прописать минимальный (неплохо бы проверить при запуске, что процессор удовлетворяет минимальным требованиям)
Спасибо. Отличная мысль, погуглю как проверялку сделать.
...
Рейтинг: 0 / 0
15.02.2016, 16:44
    #39171539
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
Dima T,

Последняя нормальная студия с поддержкой XP - 2010.

Потом то студия не работает на XP, то без патча не собирает, то спецрантайм.

К .NET тоже относится - 3.5 (будет вечно поддерживаться) или 4.0 (уже снимается с поддержки).

И под Веб почему то тоже последний WebDeveloper, который ставится со всеми обновлениями - на базе 2010.
...
Рейтинг: 0 / 0
15.02.2016, 17:10
    #39171580
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BYTE buf[16] = {0}; вылетает с исключением.
SiemarglDima T,

Последняя нормальная студия с поддержкой XP - 2010.

Потом то студия не работает на XP, то без патча не собирает, то спецрантайм.
Тоже так считал пока не стал вникать:
2010 последняя работающая под XP.
Потом МС выпустил 2012 которая не компилировала под XP, но позже выпустили очередной сервиспак где была возвернута компиляция под XP
2015 под XP отлично компилирует, только в свойствах проекта надо поставить "Platform toolset: Visual Studio 2015 - Windows XP (v140_xp)"
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / BYTE buf[16] = {0}; вылетает с исключением. / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]