Перейти к содержанию
    

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

Предлагаю выдать проверенный компилятором исходный текст.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А о чем должно быть предупреждение?

о своих действиях - выбросил код, обнаружил невыполняемый или недостижимый код - сообщи

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

о своих действиях - выбросил код, обнаружил невыполняемый или недостижимый код - сообщи

Код 1:

x = y + 2 + 3;

Выбросил 2+3, заменил на 5. Сообщать?

 

Код 2:

int x, y, z;

x = y + 2;

z = (y + 2) * 3;

Выбросил (y+2) во втором выражении, заменив на x*3. Сообщать?

 

Код 3:

#define DEF_X некое const-выражение

int x;

if (DEF_X == 1 && x == 1) {

выражение1;

} else {

выражение2;

};

если DEF_X != 1, то будет выкинута операция if и выражение1. Сообщать?

...и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

о своих действиях - выбросил код, обнаружил невыполняемый или недостижимый код - сообщи

Он так и сделает, будьте patient.

У Кейла есть ключик компилятора -remarks. И тогда он мне кидает больше сотни предупреждений. Один недостаток, трудно сообщения об ошибках искать. Задаю поиск "error". :)

Может, ИАР тоже так может?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Кейла есть ключик компилятора -remarks. И тогда он мне кидает больше сотни предупреждений. Один недостаток, трудно сообщения об ошибках искать. Задаю поиск "error". :)

Может, ИАР тоже так может?

IAR всё может. Только какая польза от такого кол-ва предупреждений, если среди них трудно найти полезные и всё равно их приходится отключать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

> Выбросил 2+3, заменил на 5. Сообщать?

скорее нет, чем да

 

>Выбросил (y+2) во втором выражении, заменив на x*3. Сообщать?

скорее да, чем нет

 

>если DEF_X != 1, то будет выкинута операция if и выражение1. Сообщать?

определённо да, ибо иначе использовался ifdef

 

 

если среди них трудно найти полезные

пишите так, чтобы не было неполезных

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IAR всё может. Только какая польза от такого кол-ва предупреждений, если среди них трудно найти полезные и всё равно их приходится отключать?

Отчего же сразу отключать? "Сначала - так, потом - вот так" (с) Сначала компилируем, чтобы без ошибок, потом блох начинаем вычесывать. Потом чисто будет, можно и не проверять.

Да, Назначения (Target) можно разные создать, чтоб одной кнопкой мышки... У меня два обычно, Debug и Release. Можно добавить Checked, типа...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Предлагаю выдать проверенный компилятором исходный текст.

Ну что же Вы право...

Если усомнились, что же сами не проверили?

example1.c - переменные 16 битные, код не формируется (example1.lst).

example2.c - переменные 32 битные, код формируется (example2.lst).

Оптимизация - None. Понятно, что в данном конкретном случае, когда присваиваются константы, компилятор на высоком уровне оптимизации может выбросить вообще весь код.

Но без оптимизации на этом фрагменте всё воспроизводится так, как я описал.

example.zip

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Keil

Example1

; generated by Component: ARM Compiler 5.06 update 1 (build 61) Tool: ArmCC [4d35ad]
; commandline ArmCC [--c99 --list --split_sections --debug -c --asm --interleave -o.\objects\example1.o --asm_dir=.\Listings\ --list_dir=.\Listings\ --depend=.\objects\example1.d --cpu=Cortex-M3 --apcs=interwork -O0 --diag_suppress=9931 -I"D:\ViKo\Works\Keil works\(Keil) Example\RTE" -I"D:\ViKo\Works\Keil works\(Keil) Example\RTE\Device\STM32F103VC" -IC:\Design\Keil\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include -IC:\Design\Keil\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include -D__UVISION_VERSION=518 -D_RTE_ -DSTM32F10X_HD --omf_browse=.\objects\example1.crf Source\example1.c]
                         THUMB

                         AREA ||i.main||, CODE, READONLY, ALIGN=1

                 main PROC
;;;1      int main ()
000000  2000              MOVS     r0,#0
;;;2      {
;;;3      unsigned short temp1, temp2;
;;;4      	for (unsigned int i = 0; i < 10; i++)
000002  e009              B        |L1.24|
                 |L1.4|
;;;5      	{
;;;6      		temp1 = 0x0001;
000004  2101              MOVS     r1,#1
;;;7      		temp2 = 0xFFFE;
000006  f64f72fe          MOV      r2,#0xfffe
;;;8      		if (~temp1 != temp2) continue;
00000a  43cb              MVNS     r3,r1
00000c  4293              CMP      r3,r2
00000e  d000              BEQ      |L1.18|
000010  e001              B        |L1.22|
                 |L1.18|
;;;9      		temp2 = temp1;
000012  460a              MOV      r2,r1
000014  bf00              NOP                            ;8
                 |L1.22|
000016  1c40              ADDS     r0,r0,#1              ;4
                 |L1.24|
000018  280a              CMP      r0,#0xa               ;4
00001a  d3f3              BCC      |L1.4|
;;;10     	}
;;;11     }
00001c  2000              MOVS     r0,#0
00001e  4770              BX       lr
                         ENDP


                 __ARM_use_no_argv EQU 0

 

Example2

; generated by Component: ARM Compiler 5.06 update 1 (build 61) Tool: ArmCC [4d35ad]
; commandline ArmCC [--c99 --list --split_sections --debug -c --asm --interleave -o.\objects\example2.o --asm_dir=.\Listings\ --list_dir=.\Listings\ --depend=.\objects\example2.d --cpu=Cortex-M3 --apcs=interwork -O0 --diag_suppress=9931 -I"D:\ViKo\Works\Keil works\(Keil) Example\RTE" -I"D:\ViKo\Works\Keil works\(Keil) Example\RTE\Device\STM32F103VC" -IC:\Design\Keil\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include -IC:\Design\Keil\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include -D__UVISION_VERSION=518 -D_RTE_ -DSTM32F10X_HD --omf_browse=.\objects\example2.crf Source\example2.c]
                         THUMB

                         AREA ||i.main||, CODE, READONLY, ALIGN=1

                 main PROC
;;;1      int main ()
000000  2000              MOVS     r0,#0
;;;2      {
;;;3      unsigned int temp1, temp2;
;;;4      	for (unsigned int i = 0; i < 10; i++)
000002  e009              B        |L1.24|
                 |L1.4|
;;;5      	{
;;;6      		temp1 = 0x0001;
000004  2101              MOVS     r1,#1
;;;7      		temp2 = 0xFFFE;
000006  f64f72fe          MOV      r2,#0xfffe
;;;8      		if (~temp1 != temp2) continue;
00000a  43cb              MVNS     r3,r1
00000c  4293              CMP      r3,r2
00000e  d000              BEQ      |L1.18|
000010  e001              B        |L1.22|
                 |L1.18|
;;;9      		temp2 = temp1;
000012  460a              MOV      r2,r1
000014  bf00              NOP                            ;8
                 |L1.22|
000016  1c40              ADDS     r0,r0,#1              ;4
                 |L1.24|
000018  280a              CMP      r0,#0xa               ;4
00001a  d3f3              BCC      |L1.4|
;;;10     	}
;;;11     }
00001c  2000              MOVS     r0,#0
00001e  4770              BX       lr
                         ENDP


                 __ARM_use_no_argv EQU 0

 

Keil победил! :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

о своих действиях - выбросил код, обнаружил невыполняемый или недостижимый код - сообщи

Так он выбросил код, проанализировав if(0). Случай исключительно вырожденный, так что и сообщать ему не о чем.

 

Грубо говоря, процесс "ошибки" заложен внутри выражения (~temp1 != temp2)

в результате перехода lvalue temp1 16 -> rvalue temp1 32.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так он выбросил код, проанализировав if(0). Случай исключительно вырожденный, так что и сообщать ему не о чем.

 

Грубо говоря, процесс "ошибки" заложен внутри выражения (~temp1 != temp2)

в результате перехода lvalue temp1 16 -> rvalue temp1 32.

А давайте утрируем ситуацию:

main ()
{
unsigned int temp1, temp2;
for (unsigned int i = 0; i < 10; i++)
{
	temp1 = 0x0001;
	temp2 = 0xFFFE;
	if (1) continue;
	temp2 = temp1;
}
}

Вроде как здесь всё ещё более определено. Так ведь нет. В этом случае видим предупреждение:

Warning[Pe111]: statement is unreachable H:\work\test\example2.c 9

Где логика то?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Маразм процветает :(. Причем тут "старые", или "новые" - в огороде бузина а в Киеве дядька :(. Компиляция такого "примера" зависит от разрядности int целевой платформы и ни от чего более.

Спасибо, конечно, за оценку но речь, как бы не о механизме действия компилятора, - их вполне полно и лаконично уже описал Сергей Борщ.

 

Приведу аналогию: чтобы обойти лишнюю писанину при желании char сделать беззнаковым, компиляторы добавили галочку "считать 'char' как unsigned.

В нашем случае требуется добавление лишней писанины для предписания явного преобразования. Галочки не хватает.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И во что же должно продвинуться беззнаковое uint16_t 0xfffe? Разве не в 0x0000fffe, независимо, знаковое или без 32 битовое?

И продвигаться надо когда? Когда результат логического сравнения используется? Сказано же, сравнивать 16-битовые беззнаковые.

По-моему, IAR накосячил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде как здесь всё ещё более определено. Так ведь нет. В этом случае видим предупреждение:

Warning[Pe111]: statement is unreachable H:\work\test\example2.c 9

Где логика то?

Точно не знаю, могу лишь предположить, что в этом случае все уже предопределено

на уровне синтаксического разбора, поэтому компилятор выдает предупреждение.

Но если Вы поменяете на

int16u tst = 1;
if(tst) continue;

то сообщение уже может отсутствовать.

 

 

 

И во что же должно продвинуться беззнаковое uint16_t 0xfffe? Разве не в 0x0000fffe, независимо, знаковое или без 32 битовое?

И продвигаться надо когда? Когда результат логического сравнения используется? Сказано же, сравнивать 16-битовые беззнаковые.

По-моему, IAR накосячил.

Продвинутое uint16_t 0xfffe равно 0xfffffffe и оно является строго знаковым, независимо от знаковости или беззнаковости исходной переменной.

Процесс продвижки начинается с упоминания имени переменной в выражении, а именно temp1 в выражении означает значение rvalue (signed int 32), полученное

из lvalue переменной temp1 с помощью правил расширения.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>Выбросил (y+2) во втором выражении, заменив на x*3. Сообщать?

скорее да, чем нет

Зачем??? Это обычная оптимизация никак не влияющая на выполнение кода. Таких оптимизаций в исходниках может быть тысячи случаев. Какая от них польза?

Один только вред из-за того, что среди такого мусора пропадут полезные сообщения.

 

>если DEF_X != 1, то будет выкинута операция if и выражение1. Сообщать?

определённо да, ибо иначе использовался ifdef

:wacko: Каким боком тут ifdef??? Его значение всегда будет true.

А смысл этого кода например в том, что есть некий общий модуль исходного кода на 2 разных устройства.

В одном устройстве например установлено два чипа SPI-FLASH в другом - один. И данный define задаёт кол-во чипов.

Это если Вы не поняли.

 

Отчего же сразу отключать? "Сначала - так, потом - вот так" (с) Сначала компилируем, чтобы без ошибок, потом блох начинаем вычесывать. Потом чисто будет, можно и не проверять.

Причём тут ошибки? Ошибок нет. Преобразование типа - это стандартная операция. Тем более - оптимизация и лишний код удаляемый оптимизацией.

Таких событий будут тысячи мест в коде.

 

Продвинутое uint16_t 0xfffe равно 0xfffffffe и оно является строго знаковым, независимо от знаковости или беззнаковости исходной переменной.

Хмммм.... А что такое "продвинутое uint16_t"? Я отстал от жизни и в си ввели новые "продвинутые" типы?

И как именно из беззнакового 0xFFFE получается 0xFFFFFFFE?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...