powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / BYTE buf[16] = {0}; вылетает с исключением.
26 сообщений из 26, показаны все 2 страниц
BYTE buf[16] = {0}; вылетает с исключением.
    #39169528
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
BYTE buf[16] = {0}; вылетает с исключением.
    #39169816
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВот такой привет от с++14. Там ведь {0} это означает не просто ноликами заполнить.
А можно привести цитату из стандарта из которой это уже не инициализация массива нулями, а что-то другое?
Код: plaintext
1.
BYTE buf[16] = {0}
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39169834
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Со своей стороны привожу цитату отсюда 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
BYTE buf[16] = {0}; вылетает с исключением.
    #39169862
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
BYTE buf[16] = {0}; вылетает с исключением.
    #39169868
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем это один комп из нескольких сотен с той же DLL отлично работающей. ХЗ как понимать этот глюк.
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39169890
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗасада в том что поменялось понимание синтаксиса, как следствие изменения в компиляторе, как следствие косяк в компиляторе, в моем случае вылет проги на ровном месте (обращение к несуществующей памяти).
Так а причем здесь С++14? )))
У вас баг в программе (ну или в компиляторе, но скорее всего именно у вас)
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39169892
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПричем это один комп из нескольких сотен с той же DLL отлично работающей. ХЗ как понимать этот глюк.
Давайте ассемблерный код обоих вариантов функции - посмотрим.
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39169907
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDima TПричем это один комп из нескольких сотен с той же DLL отлично работающей. ХЗ как понимать этот глюк.
Давайте ассемблерный код обоих вариантов функции - посмотрим.
Его уже нет. Хорошо что клиент дал полдня на разбор. В итоге была выявлена строчка (как выявлена выше написал), затем откат к исходной версии cpp из респозитория и исправление этой строчки. Вобщем то чего надо сравнивать в идеале - не осталось.
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39170289
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос в размерности типа BYTE и константы 0. Возможно происходит запись в область памяти вне buf(да к тому же это стековая переменная). Имхо смешивание c и с++ может дать такой результат. Как уже сказали без ассемблерного листинга трудно будет что то сказать :)
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39170469
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще подозрение: у клиента был Pentium3, возможно компилятор вставил какую-то асмовскую команду неизвестную тому процессору, вот и вылетело.
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39170581
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L.OtujktdВопрос в размерности типа BYTE и константы 0. Возможно происходит запись в область памяти вне buf(да к тому же это стековая переменная). Имхо смешивание c и с++ может дать такой результат.
Нет конечно. Не фантазируйте ))
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39170965
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
BYTE buf[16] = {0}; вылетает с исключением.
    #39171000
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из книжкив книжке std::initializer_list накатывается именно для auto , в случае же BYTE , он во всех 4-х случаях будет одинаковый.
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39171011
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел:
Код: 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
BYTE buf[16] = {0}; вылетает с исключением.
    #39171043
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39171141
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
BYTE buf[16] = {0}; вылетает с исключением.
    #39171208
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[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
BYTE buf[16] = {0}; вылетает с исключением.
    #39171292
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЛучше клиенту объяснить что пора бы комп обновить.
а собрать под разные компы - никак?
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39171306
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TЛучше клиенту объяснить что пора бы комп обновить.
а собрать под разные компы - никак?
потом всю оставшуюся жизнь делать два комплекта обновлений?
...
Рейтинг: 0 / 0
BYTE buf[16] = {0}; вылетает с исключением.
    #39171380
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИзопропилпропущено...

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

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

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

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

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

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

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

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

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


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