Re[2]: #pragma pack(3)
От: dilmah США  
Дата: 07.06.10 09:42
Оценка: 1 (1) +1 :))) :))) :)
G_>А как вы себе представляете выравнивание не по границам степени двойки?

а в чем проблема это себе представить?
Re[4]: #pragma pack(3)
От: Воронков Василий Россия  
Дата: 07.06.10 11:48
Оценка: 1 (1) +4
Здравствуйте, korzhik, Вы писали:

K>ну ведь там же сказано: valud values are ...

K>Зачем же пихать не валидные значения, а потом ещё жаловаться что что-то не так.
K>Конечно подход gcc интеллигентней, тут спорить не буду.

А зачем защищать баги компилятора? ICE — это баг, при какой бы ситуации он не возникал.
Re[2]: #pragma pack(3)
От: Alexander G Украина  
Дата: 09.06.10 13:27
Оценка: 41 (2) :))
Здравствуйте, Кодт, Вы писали:


К>Забавно, что валится строго на #pragma pack(push,n) где n — левое.

К>Если сделать push, затем n, затем pop — всё в порядке.

К>Засада: gcc тоже понимает #pragma pack, но считает #pragma pack(push) невалидной.

К>#pragma pack(push,n) / #pragma pack(pop) — это совместимый код.

Таким образом, желающие странного могут писать:


#pragma pack(push,1)
#pragma pack(3)
...
#pragma pack(pop)
Русский военный корабль идёт ко дну!
#pragma pack(3)
От: dmitry_npi Россия  
Дата: 07.06.10 06:48
Оценка: 32 (1) :)
Конечно, это абсурд. Но VC++ 2008 SP1 после выдачи предупреждения падает.

Вот, такой вот глюк. Падает также при всех значениях, отличных от [1,2,4,8,16]
А как в других версиях?

07.06.10 13:29: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Атмосферная музыка — www.aventuel.net
Re[3]: #pragma pack(3)
От: Alexander G Украина  
Дата: 07.06.10 11:14
Оценка: :))
Здравствуйте, dilmah, Вы писали:

D>а в чем проблема это себе представить?

— Профессор, я не могу представить семимерную сферу!
— Это же элементарно! Представьте n-мерную, а n положите равным семи!

Русский военный корабль идёт ко дну!
Re[2]: #pragma pack(3)
От: lxa http://aliakseis.livejournal.com
Дата: 07.06.10 12:53
Оценка: :))
Здравствуйте, Guard_h4s, Вы писали:

G_>А как вы себе представляете выравнивание не по границам степени двойки?



Структура КБ-103 выглядела следующим образом:
"руководитель" В. Балашов, майор госбезопасности, его зам. Крючков, тоже
майор, оба достаточно серые личности. Маленький штрих рисует их техническую
эрудицию. К Устинову, "руководившему" КБ-102 В. М. Мясищева, обратились два
зэка с предложением создать двухтактный бензиновый двигатель для бортового
агрегата. "А какие употребляются сейчас?" -- поинтересовался тот.
"Четырехтактные" -- ответили ему. "Переходить сразу на двухтактные
рискованно, -- заметил Устинов, -- не лучше ли вам заняться трехтактными?"
Иначе, как "трехтактный" его с тех пор не называли.

http://lib.ru/MEMUARY/KERBER/tupolewskaya_sharaga.txt

Re[6]: #pragma pack(3)
От: тыдыщъх  
Дата: 09.06.10 20:13
Оценка: :))
Здравствуйте, dmitry_npi, Вы писали:

>>как говорится, пришла мысль — напишу-ка число 3, каково ему будет? А он упал. Потом попробовал -6. Не скомпилил.


— Ага! — сказали суровые сибирские мужики.
Re[2]: #pragma pack(3)
От: blackhearted Украина  
Дата: 07.06.10 09:31
Оценка: +1
Здравствуйте, Guard_h4s, Вы писали:

G_>А как вы себе представляете выравнивание не по границам степени двойки?


А падать зачем?
Re[2]: #pragma pack(3)
От: dmitry_npi Россия  
Дата: 07.06.10 10:54
Оценка: :)
Здравствуйте, Guard_h4s, Вы писали:

G_>А как вы себе представляете выравнивание не по границам степени двойки?


Я никак. Хотелось посмотреть, как это может представить компилятор.
Атмосферная музыка — www.aventuel.net
Re[3]: #pragma pack(3)
От: Erop Россия  
Дата: 07.06.10 12:15
Оценка: +1
Здравствуйте, Кодт, Вы писали:

К>То есть, целиком проигнорировал первую прагму и, как следствие, выругался на якобы непарную вторую.

К>После чего выравнял всё по дефолту на 4.
Это, типа, лучше?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: #pragma pack(3)
От: Юрий Жмеренецкий ICQ 380412032
Дата: 07.06.10 13:03
Оценка: +1
Здравствуйте, dmitry_npi, Вы писали:

_>Конечно, это абсурд. Но VC++ 2008 SP1 после выдачи предупреждения падает.


_>Вот, такой вот глюк. Падает также при всех значениях, отличных от [1,2,4,8,16]

_>А как в других версиях?

Минимальный код и флаги можно увидеть? На VC++ 2008 SP1 воспроизвести не удалось.
Re: #pragma pack(3)
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 07.06.10 13:48
Оценка: +1
Здравствуйте, 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'
Re[4]: #pragma pack(3)
От: Antikrot  
Дата: 07.06.10 15:05
Оценка: +1
Здравствуйте, 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
Re: #pragma pack(3)
От: Guard_h4s Россия  
Дата: 07.06.10 09:27
Оценка:
А как вы себе представляете выравнивание не по границам степени двойки?
Re: #pragma pack(3)
От: korzhik Россия  
Дата: 07.06.10 09:32
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Конечно, это абсурд. Но VC++ 2008 SP1 после выдачи предупреждения падает.


_>Вот, такой вот глюк. Падает также при всех значениях, отличных от [1,2,4,8,16]

_>А как в других версиях?

#pragma pack: Valid values are 1, 2, 4, 8, and 16.
Re[2]: #pragma pack(3)
От: Кодт Россия  
Дата: 07.06.10 09:41
Оценка:
Здравствуйте, 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.
Перекуём баги на фичи!
Re[2]: #pragma pack(3)
От: Кодт Россия  
Дата: 07.06.10 09:42
Оценка:
Здравствуйте, korzhik, Вы писали:

K>#pragma pack: Valid values are 1, 2, 4, 8, and 16.

Если б там ещё ICE было задокументировано как фича...
Перекуём баги на фичи!
Re[3]: #pragma pack(3)
От: korzhik Россия  
Дата: 07.06.10 09:46
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, korzhik, Вы писали:


K>>#pragma pack: Valid values are 1, 2, 4, 8, and 16.

К>Если б там ещё ICE было задокументировано как фича...

ну ведь там же сказано: valud values are ...
Зачем же пихать не валидные значения, а потом ещё жаловаться что что-то не так.
Конечно подход gcc интеллигентней, тут спорить не буду.
Re[3]: #pragma pack(3)
От: dilmah США  
Дата: 07.06.10 11:07
Оценка:
_>Я никак.

а почему никак-то?
выравнивание на 4 -- это выравнивание на адрес кратный 4.
выравнивание на 3 -- это выравнивание на адрес кратный 3.

Это бессмысленно с "физической/хардверной" точки зрения, но с математической точки зрения (с которой и смотрит компилятор) не вижу разницы.
Re[4]: #pragma pack(3)
От: Guard_h4s Россия  
Дата: 07.06.10 12:36
Оценка:
т.е. у вас компилятор только для проверки математической модели? Всегда считал что он затачивается именно на "физической/хардверной".
Отсюда и вопрос — зачем?
Re[3]: #pragma pack(3)
От: Guard_h4s Россия  
Дата: 07.06.10 12:38
Оценка:
B>А падать зачем?
Незачем. Но и использовать такое незачем. Возможно потому и не фиксят.
Re[4]: #pragma pack(3)
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 07.06.10 13:54
Оценка:
Здравствуйте, dilmah, Вы писали:


_>>Я никак.


D>а почему никак-то?

D>выравнивание на 4 -- это выравнивание на адрес кратный 4.
D>выравнивание на 3 -- это выравнивание на адрес кратный 3.

D>Это бессмысленно с "физической/хардверной" точки зрения, но с математической точки зрения (с которой и смотрит компилятор) не вижу разницы.


Почему же бессмысленно:
http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%AD%D0%92%D0%9C
Re[4]: #pragma pack(3)
От: Кодт Россия  
Дата: 07.06.10 15:14
Оценка:
Здравствуйте, Erop, Вы писали:

К>>То есть, целиком проигнорировал первую прагму и, как следствие, выругался на якобы непарную вторую.

К>>После чего выравнял всё по дефолту на 4.
E>Это, типа, лучше?

Это, типа, тоже хреново, но продвинуть варнинг до еррора — плёвое дело.
Перекуём баги на фичи!
Re: #pragma pack(3)
От: Кодт Россия  
Дата: 07.06.10 15:33
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Вот, такой вот глюк. Падает также при всех значениях, отличных от [1,2,4,8,16]


Забавно, что валится строго на #pragma pack(push,n) где n — левое.
Если сделать push, затем n, затем pop — всё в порядке.


Засада: gcc тоже понимает #pragma pack, но считает #pragma pack(push) невалидной.
#pragma pack(push,n) / #pragma pack(pop) — это совместимый код.
Перекуём баги на фичи!
Re[5]: #pragma pack(3)
От: dmitry_npi Россия  
Дата: 07.06.10 18:28
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%AD%D0%92%D0%9C


Не, ну вы даёте Вообще дело было так. Досталась мне программа, которая читает свои файлы определенного формата. Блоками сразу в структуры. И смотрю, какая-то ерунда. Поставил выравнивание "1" — стало нормально. Потом просто поигрался с прагмой — я не очень понимал это выравнивание. И тут ВНЕЗАПНО, как говорится, пришла мысль — напишу-ка число 3, каково ему будет? А он упал. Потом попробовал -6. Не скомпилил.
Атмосферная музыка — www.aventuel.net
Re[2]: #pragma pack(3)
От: dmitry_npi Россия  
Дата: 07.06.10 20:11
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Минимальный код и флаги можно увидеть? На 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>
Атмосферная музыка — www.aventuel.net
Re[3]: #pragma pack(3)
От: Кодт Россия  
Дата: 07.06.10 22:35
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

ЮЖ>>Минимальный код и флаги можно увидеть? На VC++ 2008 SP1 воспроизвести не удалось.

_>Минимальнейший пример (вывод на консоль):

_>
_>#pragma pack(push, 3)
_>


Вот ключевой момент.
Если написать просто #pragma pack(3) — не упадёт, а проигнорирует.

Минимальный код выглядит вообще так
#pragma pack(push,3) // только в таком виде
struct X { int a; }; // нужна хоть какая-нибудь структура - предмет для вываливания в ICE.

Валится на всех версиях VC.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.