Форум программистов, компьютерный форум CyberForum.ru

Баг или фича - C++

Восстановить пароль Регистрация
 
 
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
19.12.2012, 07:05     Баг или фича #1
решил проверить на своем VS 2008
присвоение в сравнении
написал
C++
1
2
3
char buf[100];
char *buf1;
if(buf1=buf)
все прошло никакого предупреждения

написал так
C++
1
2
3
char buf[100];
char *buf1;
if(buf1=0x05)
ошибка не может привести int к указателю, все правильно

написал так
C++
1
2
3
char buf[100];
char *buf1;
if(buf1=(char*)0x05)
опять все в порядке

уровень предупреждений
Уровень 3 (/W3)
вот и думаю что это?

Не по теме:

хотел создать тему в экспертах, не получилось(хотя вопрос к экспертам)

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2012, 07:05     Баг или фича
Посмотрите здесь:

Баг strcmp C++
C++ помогите определить баг или недочёт в программе.
Баг компилятора? Или я чего то не догоняю? C++
баг студии? C++
C++ Ошибка или баг в Dev C++?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 07:13     Баг или фича #2
А что именно смущает? Последний пример?
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
19.12.2012, 07:34  [ТС]     Баг или фича #3
Цитата Сообщение от Smetanka Посмотреть сообщение
А что именно смущает?
смущает то что в if идет сравнение (==) и если написать присвоение(=)
компилятор должен заверещать "обрати внимание не ошибся ли ты" но при этом код скомпилировать
а это молчит как партизан
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
19.12.2012, 07:42     Баг или фича #4
А почему он должен предупреждать о подобном? Использование присваивания в условии - обычная практика.

C++
1
2
3
4
if (const SomeClass* some_object = GetObject())
{
    // все ок, получили указатель на объект. Используем его только в текущем блоке.
}
Вместо

C++
1
2
3
4
5
6
const SomeClass* some_object = GetObject();
if (some_object)
{
    // все ок, получили указатель на объект.
}
// Тут объект уже не нужен, но он все еще существует в области видимости.
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
19.12.2012, 07:49  [ТС]     Баг или фича #5
вот как например ведет себя CodeVisionAVR
C++
1
2
3
  char aaa[10];
 char * bbb; 
  if(bbb=aaa)
possibly incorrect assignment
Добавлено через 5 минут
Цитата Сообщение от 0x10 Посмотреть сообщение
Использование присваивания в условии - обычная практика.
я что то говорил об ошибке(Error) ?
я говорил о предупреждении (Warning)
Цитата Сообщение от 0x10 Посмотреть сообщение
А почему он должен предупреждать о подобном?
потому что вместо
C++
1
if(i==5)
запросто можно написать
C++
1
if(i=5)
поэтому некоторые советуют писать так
C++
1
if(5==i)
потому что
C++
1
if(5=i)
уж точно даст ошибку
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 07:51     Баг или фича #6
Ну вобще то я думаю известно, что в выражении условия if не обязательно должно быть логическое выражение. Все что == 0 false, все остальное true. Ругаться компилятор не должен, на то что вы используете присваивание. Ведь результатом выражения в if будет(в вашем случае) какой то адрес, а это я так думаю true. Никакой фантастики.
P.S. Просто так придуман язык С, что можно выстрелить нечаяно себе в ногу
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 07:51     Баг или фича #7
ValeryS, а этот пример типа

C++
1
2
int i;
if(i=5);
Тоже ворнинг не выдает?
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
19.12.2012, 08:01  [ТС]     Баг или фича #8
Schizorb,
C++
1
2
3
int k;
if(k=5)
  k=10;
молчит
вот на это вякнул
C++
1
2
3
int k;
if(k=5)
  k==10;
не понравилось k==10; и то не ошибка(!!!) а предупреждение

Добавлено через 3 минуты
Цитата Сообщение от Smetanka Посмотреть сообщение
Все что == 0 false, все остальное true. Ругаться компилятор не должен, на то что вы используете присваивание.
спасибо что объяснил
я то за пятнадцать лет работы с языком, об этом даже не догадывался
речь идет о конкретной среде VS 2008, все остальные(что у меня есть) ведут себя адекватно

Не по теме:

почему и не хотел создавать тему в начинающих

Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 08:11     Баг или фича #9
Цитата Сообщение от ValeryS Посмотреть сообщение
Schizorb,
C++
1
2
3
int k;
if(k=5)
  k=10;
молчит
вот на это вякнул
C++
1
2
3
int k;
if(k=5)
  k==10;
не понравилось k==10; и то не ошибка(!!!) а предупреждение

Добавлено через 3 минуты

спасибо что объяснил
я то за пятнадцать лет работы с языком, об этом даже не догадывался
речь идет о конкретной среде VS 2008, все остальные(что у меня есть) ведут себя адекватно

Не по теме:

почему и не хотел создавать тему в начинающих

Просто изначально неясно было О ЧЕМ ЖЕ ВСЕ ТАКИ ВОПРОС))) Ответил то что думал.
Теперь понял вопрос конкретнее)
Ну а в чем проблема то, что он выдает предупреждение? Просто компания microsoft пытается сделать так, чтобы программист допускал меньше ошибок при написании кода, для последующей простоты отладки. Вот и сделала компилятор с логикой
Например VS 2012 на

C++
1
2
3
int k;
if(k=5)
  k==10;
тоже выдает предупреждение

Предупреждение warning C4553: ==: оператор не имеет результата; возможно, имелся в виду "="

Что и логично)))
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
19.12.2012, 08:21  [ТС]     Баг или фича #10
Цитата Сообщение от Smetanka Посмотреть сообщение
Просто компания microsoft пытается сделать так, чтобы программист допускал меньше ошибок
ага а это вот не ошибка?
C++
1
k==10;
происходит сравнение а результат не куда не присваивается (хотя формально это не ошибка, эта строка ничего не делает)




Цитата Сообщение от Smetanka Посмотреть сообщение
Предупреждение warning C4553: ==: оператор не имеет результата; возможно, имелся в виду "="
очень информативно
оператор == как раз имеет результат просто мы его потеряли
вот так ведь вопросов не возникает
C++
1
bool b=k==10;
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 08:31     Баг или фича #11
ValeryS, оно?

http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

Там по идее level 4 указан.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
оператор == как раз имеет результат просто мы его потеряли
Но это же не ошибка. Можно писать что-нибудь типа:
x + y;

Результат теряется, но никто не говорил, что присваивание в выражении обязательно)
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 08:33     Баг или фича #12
ValeryS, не понятно что же все таки Вас не устраивает? Вы пытаетесь доказать что C++ несовершенен?) Или сообщить о несовершенстве компилятора? Или Вы просто пытаетесь понять почему же все таки всплывает это предупреждение?
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
19.12.2012, 08:50  [ТС]     Баг или фича #13
Цитата Сообщение от Schizorb Посмотреть сообщение
ValeryS, оно?
да
но четвертый уровень он же параноидальный
бывает что на свои собственные библиотеки ругается
Цитата Сообщение от Schizorb Посмотреть сообщение
Но это же не ошибка. Можно писать что-нибудь типа:
x + y;
с точки зрения языка конечно не ошибка, а с точки зрения алгоритма бесполезное действие

Добавлено через 7 минут
изначально то хотел проверить
что вот это
C++
1
if(buf1=buf)
должно дать предупреждение
а вот это вот
C++
1
if((buf1=buf)!=NULL)
нет, хотя смысл один
и это мне мог дать только 4 уровень
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 08:56     Баг или фича #14
Цитата Сообщение от ValeryS Посмотреть сообщение
с точки зрения языка конечно не ошибка, а с точки зрения алгоритма бесполезное действие
Видимо, поэтому и не ошибка, а именно предупреждение, причем первого уровня. http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

Почему assignment in condition четвертого уровня, вопрос к разработчикам студии, наверное...

C++
1
if(buf1=buf)
должно дать предупреждение
а вот это вот
C++
1
if((buf1=buf)!=NULL)
нет
В gcc с опцией wall так получилось. Первое - с предупреждением, второе- без.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
19.12.2012, 10:29     Баг или фича #15
Цитата Сообщение от ValeryS Посмотреть сообщение
компилятор должен заверещать "обрати внимание не ошибся ли ты" но при этом код скомпилировать
Это абсолютно лекальная инструкция по мнению компилятора и предупреждать о ней нет необходимости, ибо тогда
C++
1
if(a=strlen(x))
также будет выдавать варнинг.
и то не ошибка(!!!) а предупреждение
Это само собой, ибо инструкция сама по себе должна использоваться внутри выражения. Иначе она просто не имеет смысла (скорее всего, при компиляции она будет удалена из кода)
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
19.12.2012, 11:25  [ТС]     Баг или фича #16
Цитата Сообщение от Croessmah Посмотреть сообщение
Это абсолютно лекальная инструкция по мнению компилятора и предупреждать о ней нет необходимости,
хорошо тогда почему CodeVisionAVR
выдает
possibly incorrect assignment
пытался найти в стандарте как должен вести себя компилятор, но не нашел( заблудился в 800 страницах)

Цитата Сообщение от Croessmah Посмотреть сообщение
Это само собой, ибо инструкция сама по себе должна использоваться внутри выражения. Иначе она просто не имеет смысла
здесь я погорячился насчет ошибки
действительно с точки зрения языка все нормально
Цитата Сообщение от ValeryS Посмотреть сообщение
с точки зрения языка конечно не ошибка, а с точки зрения алгоритма
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
19.12.2012, 11:28     Баг или фича #17
Цитата Сообщение от ValeryS Посмотреть сообщение
хорошо тогда почему CodeVisionAVR выдает
Потому что так захотели его разработчики
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.12.2012, 11:38     Баг или фича #18
C++
1
2
3
4
5
int main()
{
   int i = 0;
   if (i = 5);
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp
forever@pterois:~/My_pro1/cpp_pro$ ./new
 
 
forever@pterois:~/My_pro1/cpp_pro$ clang++ -o new new.cpp
new.cpp:4:10: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
   if (i = 5);
       ~~^~~
new.cpp:4:10: note: place parentheses around the assignment to silence this warning
   if (i = 5);
         ^
       (    )
new.cpp:4:10: note: use '==' to turn this assignment into an equality comparison
   if (i = 5);
         ^
         ==
new.cpp:4:14: warning: if statement has empty body [-Wempty-body]
   if (i = 5);
             ^
new.cpp:4:14: note: put the semicolon on a separate line to silence this warning [-Wempty-body]
2 warnings generated.
Полагаю нечто подобное этой опции есть и в MSVC.
Ах ну да. Выше было же уже.
Тогда

C++
1
#pragma warning (4:4706)
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
19.12.2012, 11:43  [ТС]     Баг или фича #19
Цитата Сообщение от defer Посмотреть сообщение
Потому что так захотели его разработчики
это я должен на каждого разработчика оглядываться
Цитата Сообщение от ForEveR Посмотреть сообщение
Полагаю нечто подобное этой опции есть и в MSVC.
есть как выяснилось 4 уровень
но все таки стандарт регламентирует поведение компилятора при присвоении в if или нет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 11:45     Баг или фича
Еще ссылки по теме:

Баг компилятора? C++
C++ Ввод/вывод баг или нет?
C++ std::regex : баг на сайте или баг компилятора?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.12.2012, 11:45     Баг или фича #20
ValeryS, Стандарт вообще не регламинтирует warning-и. Если это не ошибка однозначно - значит не регламентировано.
Yandex
Объявления
19.12.2012, 11:45     Баг или фича
Ответ Создать тему
Опции темы

Текущее время: 06:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru