Здравствуйте, dmitry_npi, Вы писали:
_>Конечно, это абсурд. Но VC++ 2008 SP1 после выдачи предупреждения падает.
_>Вот, такой вот глюк. Падает также при всех значениях, отличных от [1,2,4,8,16] _>А как в других версиях?
Здравствуйте, Guard_h4s, Вы писали:
G_>А как вы себе представляете выравнивание не по границам степени двойки?
Примерно так:
t.cpp(3) : warning C4086: expected pragma parameter to be '1', '2', '4', '8', or '16'
с последующим игнорированием этой прагмы.
Но никак не
t.cpp(3) : warning C4086: expected pragma parameter to be '1', '2', '4', '8', or '16'
t.cpp(6) : fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'msc1.cpp', line 1393)
Воспроизводится и на VC2005, и 2010 тоже.
Причём gcc3.4.4 поступил вот так
t.cpp:3: warning: alignment must be a small power of two, not 3
t.cpp:10: warning: #pragma pack (pop) encountered without matching #pragma pack (push, <n>)
То есть, целиком проигнорировал первую прагму и, как следствие, выругался на якобы непарную вторую.
После чего выравнял всё по дефолту на 4.
ну ведь там же сказано: valud values are ...
Зачем же пихать не валидные значения, а потом ещё жаловаться что что-то не так.
Конечно подход gcc интеллигентней, тут спорить не буду.
Здравствуйте, korzhik, Вы писали:
K>ну ведь там же сказано: valud values are ... K>Зачем же пихать не валидные значения, а потом ещё жаловаться что что-то не так. K>Конечно подход gcc интеллигентней, тут спорить не буду.
А зачем защищать баги компилятора? ICE — это баг, при какой бы ситуации он не возникал.
Здравствуйте, Кодт, Вы писали:
К>То есть, целиком проигнорировал первую прагму и, как следствие, выругался на якобы непарную вторую. К>После чего выравнял всё по дефолту на 4.
Это, типа, лучше?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
т.е. у вас компилятор только для проверки математической модели? Всегда считал что он затачивается именно на "физической/хардверной".
Отсюда и вопрос — зачем?
Здравствуйте, Guard_h4s, Вы писали:
G_>А как вы себе представляете выравнивание не по границам степени двойки?
Структура КБ-103 выглядела следующим образом:
"руководитель" В. Балашов, майор госбезопасности, его зам. Крючков, тоже
майор, оба достаточно серые личности. Маленький штрих рисует их техническую
эрудицию. К Устинову, "руководившему" КБ-102 В. М. Мясищева, обратились два
зэка с предложением создать двухтактный бензиновый двигатель для бортового
агрегата. "А какие употребляются сейчас?" -- поинтересовался тот.
"Четырехтактные" -- ответили ему. "Переходить сразу на двухтактные
рискованно, -- заметил Устинов, -- не лучше ли вам заняться трехтактными?"
Иначе, как "трехтактный" его с тех пор не называли.
Здравствуйте, dmitry_npi, Вы писали:
_>Конечно, это абсурд. Но VC++ 2008 SP1 после выдачи предупреждения падает.
_>Вот, такой вот глюк. Падает также при всех значениях, отличных от [1,2,4,8,16] _>А как в других версиях?
Минимальный код и флаги можно увидеть? На VC++ 2008 SP1 воспроизвести не удалось.
Здравствуйте, dmitry_npi, Вы писали:
_>Конечно, это абсурд. Но VC++ 2008 SP1 после выдачи предупреждения падает.
_>Вот, такой вот глюк. Падает также при всех значениях, отличных от [1,2,4,8,16] _>А как в других версиях?
У мну всё нормально.
Version 9.0.30729.1 SP
warning C4086: expected pragma parameter to be '1', '2', '4', '8', or '16'
_>>Я никак.
D>а почему никак-то? D>выравнивание на 4 -- это выравнивание на адрес кратный 4. D>выравнивание на 3 -- это выравнивание на адрес кратный 3.
D>Это бессмысленно с "физической/хардверной" точки зрения, но с математической точки зрения (с которой и смотрит компилятор) не вижу разницы.
Здравствуйте, korzhik, Вы писали:
K>>>#pragma pack: Valid values are 1, 2, 4, 8, and 16. К>>Если б там ещё ICE было задокументировано как фича... K>ну ведь там же сказано: valud values are ... K>Зачем же пихать не валидные значения,
такое пихать должны QA-щики в принципе
K>а потом ещё жаловаться что что-то не так.
главное, чтобы "что-то не так" не привело к появлению сорсовых вирусов, при компиляции которых компилятор выполняет rm -rf
хотя может уже и есть такие, просто я не знаю
K>Конечно подход gcc интеллигентней, тут спорить не буду.
из-за такого подхода приходится делать -Werror
Здравствуйте, Erop, Вы писали:
К>>То есть, целиком проигнорировал первую прагму и, как следствие, выругался на якобы непарную вторую. К>>После чего выравнял всё по дефолту на 4. E>Это, типа, лучше?
Это, типа, тоже хреново, но продвинуть варнинг до еррора — плёвое дело.
Не, ну вы даёте Вообще дело было так. Досталась мне программа, которая читает свои файлы определенного формата. Блоками сразу в структуры. И смотрю, какая-то ерунда. Поставил выравнивание "1" — стало нормально. Потом просто поигрался с прагмой — я не очень понимал это выравнивание. И тут ВНЕЗАПНО, как говорится, пришла мысль — напишу-ка число 3, каково ему будет? А он упал. Потом попробовал -6. Не скомпилил.
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Минимальный код и флаги можно увидеть? На VC++ 2008 SP1 воспроизвести не удалось.
Минимальнейший пример (вывод на консоль):
Setting environment for using Microsoft Visual Studio 2008 x86 tools.
C:\Program Files\Microsoft Visual Studio 9.0\VC>cd \temp
C:\temp>copy con test.cpp
#pragma pack(push, 3)
struct X
{
char a;
bool b;
int i;
};
#pragma pack (pop)
int main()
{
return 0;
}
^Z
Скопировано файлов: 1.
C:\temp>cl test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
test.cpp(1) : warning C4086: expected pragma parameter to be '1', '2', '4', '8',
or '16'
test.cpp(5) : fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'msc1.cpp', line 1411)
To work around this problem, try simplifying or changing the program near the l
ocations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Internal Compiler Error in C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\c
l.exe. You will be prompted to send an error report to Microsoft later.
C:\temp>
Здравствуйте, dmitry_npi, Вы писали:
ЮЖ>>Минимальный код и флаги можно увидеть? На VC++ 2008 SP1 воспроизвести не удалось. _>Минимальнейший пример (вывод на консоль):
_>
_>#pragma pack(push, 3)
_>
Вот ключевой момент.
Если написать просто #pragma pack(3) — не упадёт, а проигнорирует.
Минимальный код выглядит вообще так
#pragma pack(push,3) // только в таком видеstruct X { int a; }; // нужна хоть какая-нибудь структура - предмет для вываливания в ICE.
К>Забавно, что валится строго на #pragma pack(push,n) где n — левое. К>Если сделать push, затем n, затем pop — всё в порядке.
К>Засада: gcc тоже понимает #pragma pack, но считает #pragma pack(push) невалидной. К>#pragma pack(push,n) / #pragma pack(pop) — это совместимый код.
Здравствуйте, dmitry_npi, Вы писали:
>>как говорится, пришла мысль — напишу-ка число 3, каково ему будет? А он упал. Потом попробовал -6. Не скомпилил.