crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
molchanoviv
  опции профиля:
сообщение 20.2.2009, 11:15
Сообщение #1


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Сегодня на работе во время ожидания окончания очередной антивирусной проверки на просторах интернета наткнулся на такую штуку

#include <iostream>
int main()
{
int i = 5;

i = i++ + 1;

std::cout<< i << std::endl;

return 0;
}

При компиляции этого кода gcc выдает undefined behaviour и в кач-ве результата i=7, а интел хавает все без варнингов и результат i=6
Выводы делаем сами и желательно отписываем сюда.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 20.2.2009, 11:18
Сообщение #2


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


кто то не соответствует стандарту
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 20.2.2009, 11:41
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Оба соответствуют.
Это действительно undefined behaviour. Результат может быть любой в зависимости от компилятора и его опций.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 26.2.2009, 15:38
Сообщение #4


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Я как-то заметил еще одну интересную вещь. Не помню точно, какая версия, но компилятор из VS(cl.exe) не поддерживает динамические массивы такого типа(а они есть в стандарте), в то время как g++ тут не имеет проблем:
//это только кусок кода
int n=1;
std::cin >> n;
int array[n]; //VS здесь выдаст ошибку(не помню точно какую)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2009, 16:08
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(void* @ 26.2.2009, 15:38) *
Я как-то заметил еще одну интересную вещь. Не помню точно, какая версия, но компилятор из VS(cl.exe) не поддерживает динамические массивы такого типа(а они есть в стандарте), в то время как g++ тут не имеет проблем:
//это только кусок кода
int n=1;
std::cin >> n;
int array[n]; //VS здесь выдаст ошибку(не помню точно какую)

Известный факт! :) Borland на эту штуку тоже ругается! Лучше делать так - код воспримется любым компилятором:
//это только кусок кода
int n=2;
std::cin >> n;
int *array = new int[n]; //VS здесь выдаст ошибку(не помню точно какую)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 26.2.2009, 16:32
Сообщение #6


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Цитата(AD @ 26.2.2009, 15:08) *
Лучше делать так - код воспримется любым компилятором:

Я то знаю что можно делать так :) я лишь привел пример плохого придерживания стандартов некоторыми компиляторами

Сообщение отредактировал void* - 26.2.2009, 16:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 26.2.2009, 18:08
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


В стандарте динамических массивов нет - это расширение gcc.
Так что тут и микрософт и багланд как раз более соответствуют стандарту. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Novak
  опции профиля:
сообщение 26.2.2009, 18:18
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 319
Регистрация: 15.3.2008
Из: Замкадыш
Пользователь №: 121

Спасибо сказали: 28 раз(а)




Репутация:   6  


Цитата(Tonal @ 26.2.2009, 18:08) *
В стандарте динамических массивов нет

В стандарте динамических массивов пока нет 8)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.2.2009, 18:47
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Tonal @ 26.2.2009, 21:08) *
это расширение gcc.
вообще у него довольно много расширений, Торвальдс как-то объяснял, что GCC выбран из-за удобных, а порой и необходимых расширений. Поэтому Линух мелкосовтовским компиллером не соберешь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 26.2.2009, 21:06
Сообщение #10


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Цитата(Tonal @ 26.2.2009, 17:08) *
В стандарте динамических массивов нет - это расширение gcc.

Ясно, спасибо буду теперь знать. Просто очень давно сталкивался с этим, вот и подзабыл детали этой проблемы.

П.С. Кстати а может кто-нибудь привести реальные примеры непридерживания стандартов компилятором от Borland (интересно просто)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 27.2.2009, 8:45
Сообщение #11


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(void* @ 27.2.2009, 0:06) *
П.С. Кстати а может кто-нибудь привести реальные примеры непридерживания стандартов компилятором от Borland (интересно просто)?

У меня была большая подборка багов для багланда.
Основная масса в поддержке шаблонов и исключений. Не зря половина boost-а багландом не компилится.
Насколько она актуальна сейчас - не в курсе - слез с него уже довольно давно.
Мой любимый:
#include <iostream>

using std::cout;
using std::endl;

struct test_t {
  int val;
  test_t(int val) : val(val) {
    cout<<"test_t::test_t val = "<<val<<endl;
  }
  ~test_t() {
    cout<<"~test_t::test_t val = "<<val<<endl;
  }
};

int main() {
  size_t arg_size = sizeof test_t(666);
  cout<<"sizeof test_t = "<<arg_size<<endl;
  return 0;
}

На bcc 5.6.4 (C++Builder 6 sp4) и раньше вызывается деструктор несозданного объекта...
Причём эта кочующая бага. Я на неё нарывался со статическими объектами и с тернарным оператором.
Как оно сейчас - просто не в курсе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 27.2.2009, 10:42
Сообщение #12


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Субъективное впечатление:
Mingw (3.4.5) не особо любит когда весь код пихают прямо в хидер. И большие инлайны тоже плохо переваривает. А вот темплейты (например из Boost) кушает без вопросов!
Причём похоже что проблема на уровне линкера... и в известных багах этого вроде нет.
А может у меня просто руки кривые 8)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 27.2.2009, 11:52
Сообщение #13


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Не в курсе как тройка, а вот 4-ка отлично все переваривает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 27.2.2009, 22:17
Сообщение #14


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Цитата(molchanoviv @ 27.2.2009, 11:52) *
Не в курсе как тройка, а вот 4-ка отлично все переваривает.

Четверка плохо переваривает dll-import от дружественных классов. Это официально признанный баг gcc 4.2.0-4.3.0 под виндоус. Поэтому проекты с Qt порождают кучу предупреждений :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 27.2.2009, 22:27
Сообщение #15


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Я в основном пользую линукс. В винду загружаюсь очень редко(да и снес бы ее давно если бы мой младший брат не играл в игры)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 22.6.2025, 15:52