Отговори на тема  [ 35 мнения ]  Отиди на страница 1, 2, 3  Следваща
Интересно поведение на GCC 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 8:19 pm
Мнения: 4410
Местоположение: Stara Zagora
Мнение Интересно поведение на GCC
Код:
void sys_rise_active_warning(ut warning)
{
   if (sys.active_warnings & (1<<warning))
      return
   sb16_sec((void*)&sys.active_warnings, warning);
   communication_SendPeriodicStatus();
}


Това се компилира но разбира се не работи според очакванията.
След return съм забравил ;
sb16_sec се изпълнява ако условието е изпълнено :)


Пет Ное 01, 2019 10:17 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Съб Фев 06, 2016 7:29 pm
Мнения: 171
Мнение Re: Интересно поведение на GCC
GCC-то би трябвало да се държи точно по правилния начин,
защото това което компилира е всъщност:
Код:
void sys_rise_active_warning(ut warning)
{
   if (sys.active_warnings & (1<<warning))
   {
      return sb16_sec((void*)&sys.active_warnings, warning);
   }
   communication_SendPeriodicStatus();
}

нали ? :) По принцип би трябвало да се оплаче поне с warning, че void ф-ция се напъва да връща нещо....


Пет Ное 01, 2019 10:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 8:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: Интересно поведение на GCC
ako sb16_sec e void, е напълно коретно!


Пет Ное 01, 2019 11:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 8:19 pm
Мнения: 4410
Местоположение: Stara Zagora
Мнение Re: Интересно поведение на GCC
Коректно е уж ама и аз си мисля че едно предупреждения че void функцията иска да връща нещо нямаше да е излишно :)
Постнах го щото е интересно. Не се бях сблъсквал.


Съб Ное 02, 2019 8:11 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 10:31 pm
Мнения: 9646
Мнение Re: Интересно поведение на GCC
това с какъв уорнинг левъл минава?

Код:
void f() {}
int t() {
return f();
}

clang 6.0.0:
t2.c:3:8: error: returning 'void' from a function with incompatible result type 'int'
return f();
       ^~~
1 error generated.

gcc 6.4.0:
t2.c: In function 't':
t2.c:3:8: error: void value not ignored as it ought to be
return f();
        ^~~



ако функцията t() e void всичко е наред и няма причина компилатора да мръцне. генерира се просто връщане (ала RTS). демек return (void) f() не се различава по нищо от чист return
Код:
Disassembly of section .text:

0000000000000000 <f>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   5d                      pop    %rbp
   5:   c3                      retq
   6:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
   d:   00 00 00

0000000000000010 <t>:
  10:   55                      push   %rbp
  11:   48 89 e5                mov    %rsp,%rbp
  14:   e8 e7 ff ff ff          callq  0 <f>
  19:   5d                      pop    %rbp
  1a:   c3                      retq


Съб Ное 02, 2019 8:17 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 8:19 pm
Мнения: 4410
Местоположение: Stara Zagora
Мнение Re: Интересно поведение на GCC
Различава се с това че вика функцията :)


Съб Ное 02, 2019 2:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 10:31 pm
Мнения: 9646
Мнение Re: Интересно поведение на GCC
е, да. така е.
затова е добра практика винаги да си ограждаш иф-овете (примерно) с {}, независимо, че е само един ред след иф-а. така компилатора ще ти ревне, ако си забравил ';'

отродоксалните правоверни в kernel.org обаче не го харесват това и са го деприкейтнали.

та в тоя контекст, компилатора не се държи странно. прави точно това, което си написал :D


Съб Ное 02, 2019 3:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2593
Местоположение: Велико Търново / София
Мнение Re: Интересно поведение на GCC
Карам едни курсове за програмиране и там също препоръчаха винаги да има {} .
Обаче на мен лично ми е много по-удобно ако има един стейтмънт, да го пиша без тях. Малко по-прегледно като, че ли. А и ако има последователно много вложени if-ове става луда работа да се слагат {} на всеки следващ if. :-s
Код:
if(command[0] == 'T')
   if(command[1] == 'E')
      if(command[2] == 'S')
         if(command[3] == 'T'){
             AlaBala();
             DyraByra();
             StoChadyra();
         }

не, че няма по-културен начин за тая проверка...

_________________
https://github.com/slav4ocom/


Съб Ное 02, 2019 8:51 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Май 07, 2019 8:16 pm
Мнения: 278
Мнение Re: Интересно поведение на GCC
На времето (първата и единствена книжка по дискретна математика която съм чел - по Шанън, Флег и компания от 80-те) беше към 100-150 странички(много добро четиво разбираемо дори за математически инвалид като мен). И така- тука преди две седмици реших да хвърля едно око на нещо по-съвременно, та белким да си разчупя и аз малко 'парадигмите'. 'Книжлето' на което попаднах е къде 600-700 страници и за две седмици, с буксуване и припълзяване, стигнах докъм 100-тната - в стил е: " Представете си един хотел с безкраен брой стаи... Теоретично не може да бъде запълнен, но на момента ви пристигат точно безкраен брой гости и го запълвате... След малко ви идва още един гост който няма къде да настаните и за това премествате всички гости с една стая на-горе, при което се освобождава стая 'номер 1' и го настанявате там... така всички гости са настанени и доволни... 8O ...ко речи? Не знам на каква дрога са били авторите, като са писали 'парадигмите' :evil: Или по-скоро аз съм кривия, щото кат гледам младеШта си ги разбира нещата, програмисТва си, професорсТва си по разни уни-та, даже престижни такива. Явно на мен не ми стига редбула в кръвта и твърде мноо съм излизал на вънка - ходил съм пеш, виждал съм разни предмети като дървета,хора, хотели - можИм да мислим до дадена степен в абстракция че хотела може и да е безкраен, но как така хем ще е краен, хем безкраен в един и същи момент -когато както ни оттърва. С две думи - всеки да си преценя сам до колко си е увредил мозъка от допир с реални предмети и хора :D , или пък 'парадигмите' на съвременните деца са и за него :? и той/тя владее 'Jedi Mind Tricks' за пред FAA.

ПС-по темата - то и около аритметичните оператори са желателни скоби, ма по съвременните стандарти не е 'cool' .
Виж ей тва е 'яко куул':
Код:
main(_){_^448&&main(-~_);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1:10);}


Пет Ное 08, 2019 9:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 28024
Местоположение: София
Мнение Re: Интересно поведение на GCC
Абе те ги учат уравнения с логика да решават .... сега гледам щерката в унито, верно че английския ми не е майчин, ама като гледам и на такива в които им е в кръвта до 10-то коляно пак не могат да разберат какво точно се пита в задачата камо ли как се решава, горе долу имаш две ябълки и три домата,колко тежи една планета ... някак си децата разбират, или налучкват какво се пита, и също така налучкват отговора, а може и дирекнто отговора да налучкват :)


Пет Ное 08, 2019 9:12 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Фев 13, 2013 2:35 pm
Мнения: 1748
Мнение Re: Интересно поведение на GCC
slav4o.com написа:
Карам едни курсове за програмиране и там също препоръчаха винаги да има {} .
Обаче на мен лично ми е много по-удобно ако има един стейтмънт, да го пиша без тях. Малко по-прегледно като, че ли. А и ако има последователно много вложени if-ове става луда работа да се слагат {} на всеки следващ if. :-s
Код:
if(command[0] == 'T')
   if(command[1] == 'E')
      if(command[2] == 'S')
         if(command[3] == 'T'){
             AlaBala();
             DyraByra();
             StoChadyra();
         }

не, че няма по-културен начин за тая проверка...

Aз харесвам леко слятото писане като твоето. Не
if(command[3] == 'T')
{
AlaBala();
}
else
{
DyraByra();
StoChadyra();
}


Пет Ное 08, 2019 10:14 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 28024
Местоположение: София
Мнение Re: Интересно поведение на GCC
Ами слято е прегледно, стига да не му се обърка табулацията, иначе може да стане малък ужас, особенно някои по-сбити и съкратени записи, аз затова слагам {}, то не че пиша кой зане и какъв код ама ...


Съб Ное 09, 2019 2:48 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4723
Мнение Re: Интересно поведение на GCC
memcmp( command, "TEST", sizeof("TEST")-1 ) :roll:
http://www.cplusplus.com/reference/cstring/memcmp/

_________________
main[-1u]={1};


Съб Ное 09, 2019 2:54 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2593
Местоположение: Велико Търново / София
Мнение Re: Интересно поведение на GCC
Честно казано ако си я има табулацията, кода си се чете и без скобите.
Това кое къде е вложено може само по табулацията да се разбере, скобите ги слагам само поради изискване на стандарта. Някой виждал ли е компилатор който работи без скоби ?
TheWizard написа:
memcmp( command, "TEST", sizeof("TEST")-1 ) :roll:
http://www.cplusplus.com/reference/cstring/memcmp/

sizeof не връщаше ли размера в байтове на променливата. В случая подаваш (const char *)("TEST") ? Те. указател към null terminated string ? Размера на указателя зависи от операционната система или какъв процесор ползваш. Не беше ли нещо strlen :roll: това което трябва

_________________
https://github.com/slav4ocom/


Съб Ное 09, 2019 8:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4723
Мнение Re: Интересно поведение на GCC
sizeof е препроцес само - би трябва да върне 5 с нулата... или 4 :) ... нящо такова

_________________
main[-1u]={1};


Съб Ное 09, 2019 9:35 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 35 мнения ]  Отиди на страница 1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: RM и 6 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни