Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

xc8 и degenerate unsigned comparison

Ср июн 26, 2019 11:10:47

Пишу код, никого не трогаю и вдруг бамс варнинг degenerate unsigned comparison

Я пишу на си(вернее на с++) уже 16 лет, а тут какой-то варнинг
Код:
for (int16_t i = 255; i >= 0; i -= 8) // вот здесь ругаетцо
{
}


Что, что он от меня хочет?? Думал с ума схожу взял gcc - скомпилил этот кусок - нет никаких варнингов, да и быть не может, что за дичь с микрочиповским компилятором

ПС
компиль xc8

Re: xc8 и degenerate unsigned comparison

Ср июн 26, 2019 23:45:49

Дичь у вас в голове, от неумения читать документацию.

Re: xc8 и degenerate unsigned comparison

Чт июн 27, 2019 10:57:30

неумения читать документацию.

Очень хорошо...начало положено. Только хотелось бы услышать подробности. Просто кинуться подобными фразами и уйти в закат - это конечно круто, но я считаю, что по стандарту си - ошибки тут не должно быть. И про какую документацию идёт речь? Даташит-не имеет ничего общего с си. Дока по XC8 - ну я её читал - можт конечно пропустил чего. Ну тыкните меня носом - раз уж так уверены.

Re: xc8 и degenerate unsigned comparison

Чт июн 27, 2019 16:27:15

Варнинг не является ошибкой. Варнинг предупреждает о возможной ПРИ ОПРЕДЕЛЕННЫХ УСЛОВИЯХ ошибке.

Re: xc8 и degenerate unsigned comparison

Чт июн 27, 2019 21:35:26

Это вообще пять! Уважаемый, Вы действительно думаете, что я не знаю, что такое варнинг. А вы знаете, что в нормальном проекте не должно быть даже варнингов! Даже опция такая есть treat warnings as errors, чтоб вычистить код.

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 00:33:04

Автор, запости точное определение че тебе сказали.
Я хоть и меньше 30 лет на с/с++, но вижу что компайлер волну гонит.
Нет тут ансайнед

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 08:41:23

взял gcc - скомпилил этот кусок - нет никаких варнингов

GCC с опцией -ansi:
Изображение
может:
MPLAB® XC8 C CompilerUser’s Guide
5.2ANSI C STANDARD ISSUESThis compiler conforms to the ISO/IEC 9899:1990 Standard for programming lan-guages. This is commonly called the C90 Standard. It is referred to as the ANSI C Standard in this manual.Some violations to the ANSI C Standard are discussed in this section, as well as some features from the later standard C99 that are supported.

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 12:08:46

По теме
Переписал этот код следующим образом:
Код:
int16_t i = 255;
while (i >= 0)
{

   i -= 8;
}

Варнинг исчез, моё личное мнение в двух этих случаях код генерируемый компилятором должен быть идентичен(кроме, разве что области видимости переменной i). Похоже на ошибку компилятора, буду писать в микрочип, возможно удастся выяснить подробности

A. Fig Lee писал(а):может:
MPLAB® XC8 C CompilerUser’s Guide
.

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

А теперь не по теме (заранее прошу прощения у администрации сайта и модераторов):
Наконец то добрался до компа - теперь могу излить всё что я увидел в этом посте.
Первое - неадекватное поведение г-на модератора с его фразой
Аlex писал(а):Дичь у вас в голове.
.

Г-н Модератор Alex Заметьте я не переходил на личности в отличие от Вас. Вы не только не аргументировали свою фразу, но и не удосужились появиться, когда я ответил на Ваш выпад.
Ещё раз повторюсь: я являюсь руководителем департамента разработки в одной крупной компании России(я напишу Вам личное сообщение в какой именно, надеюсь Вы не опуститесь до разглашения подобных конфиденциальных подробностей). В бытность свою принимал участи в консультировании разработки некоторых больших зарубежных продуктов (в их числе, знакомый на данном ресурсе, Altium). И само собой я давным давно являюсь синьором в области языка С++. А уж язык СИ и его стандарты я знаю вдоль и поперёк. Поэтому подобное поведение, тем более на должности модератора не приемлемо.

И не важно кем являюсь я, сам по себе переход на личности рождает зерно сомнения в адекватности принимаемых Вами решения на должности модератора.

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

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

ПС
Прошу прощения если вдруг кого-то задел своими заявлениями.

Добавлено after 17 minutes 25 seconds:
Автор, запости точное определение че тебе сказали.


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

Код прикрепил - собственно он пустой :)

main состоит из нескольких строк:

Код:
#include <xc.h>
#include <stdint.h>

_Noreturn void main()
{
   for (int16_t i = 255; i >= 0; i-=8)
   {
   
   }
}


ПС
Компилятор xc8 2.05, тестовый проект в аттаче
Вложения
TestWarning.X.7z
(7.21 KiB) Скачиваний: 186

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 12:19:28

в гугле полно жалоб на "degenerate unsigned comparison" - не изучал
так нормально
Код:
for (int16_t i = 255; i >= -1; i -= 8)

значит "0" unsigned :))

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 12:32:07

в гугле полно жалоб на "degenerate unsigned comparison"


Изучал. Но все они связаны с действительно детскими ошибками сравнения беззнакового со знаковым - т.е. логчно что будет варнинг.

так нормально
Код:
for (int16_t i = 255; i >= -1; i -= 8)

значит "0" unsigned :))


действительно i >= -1 - не генерирует варнинг

А
Код:
for (int16_t i = 255; i > -1; i-=8)

Код:
for (int16_t i = 255; i > (int16_t)0; i-=8)


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

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 12:43:35

А если не 255, а, скажем, 248 ему дать?

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 12:57:21

скажем, 248 ему дать?


аналогично - сейчас проверил

а вот если написать 2550 например, т.е. любое число больше границы байта - варнинг исчезает. Чудеса. Имхо оптимизатор, что-то не корректно оптимизирует

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 13:04:15

в листинге вроде хорошо - бит знака похоже проверяет xc8 1.42:
Код:
;main.c: 5: for (int16_t i = 255; i >= 0; i -= 8)
   movlw   0FFh
   movwf   (main@i)
   clrf   (main@i+1)
   
l483:   
;main.c: 6: {
   movlw   -8
   addwf   (main@i),f
   skipc
   decf   (main@i+1),f
   
l485:   
   btfss   (main@i+1),7
   goto   u21
   goto   u20
u21:
   goto   l483
u20:

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 16:17:03

Вот мой листинг с 2.05 версии, я не силён в микрочиповском асме и сейчас нет времени лезть изучать инструкции - поэтому прошу посмотреть более компетентных людей

Код:
;psect for function _main
   221  07E7                     _main:   
   222  07E7                     l611:   
   223                           ;incstack = 0
   224                           ; Regs used in _main: [wreg+status,2+status,0]
   225                           
   226                           
   227                           ;main.c: 7:  for (int16_t i = (int16_t)255; i >= 0; i-=8)
   228  07E7  30FF                  movlw   255
   229  07E8  00F0                  movwf   main@i
   230  07E9  01F1                  clrf   main@i+1
   231  07EA                     l7:   
   232                           
   233                           ;main.c: 8:  {;main.c: 9:   RA0 = i & 1;
   234  07EA  1C70                  btfss   main@i,0
   235  07EB  2FF0                  goto   u10
   236  07EC  1283                  bcf   3,5   ;RP0=0, select bank0
   237  07ED  1303                  bcf   3,6   ;RP1=0, select bank0
   238  07EE  1405                  bsf   5,0   ;volatile
   239  07EF  2FF3                  goto   l617
   240  07F0                     u10:   
   241  07F0  1283                  bcf   3,5   ;RP0=0, select bank0
   242  07F1  1303                  bcf   3,6   ;RP1=0, select bank0
   243  07F2  1005                  bcf   5,0   ;volatile
   244  07F3                     l617:   
   245                           
   246                           ;main.c: 10:  }
   247  07F3  30F8                  movlw   -8
   248  07F4  07F0                  addwf   main@i,f
   249  07F5  1C03                  skipc
   250  07F6  03F1                  decf   main@i+1,f
   251  07F7  1FF1                  btfss   main@i+1,7
   252  07F8  2FEA                  goto   l7
   253  07F9  120A  118A  2800      ljmp   start
   254  07FC                     __end_of_main:   
   255  007E                     btemp   set   126   ;btemp
   256  007E                     wtemp0   set   126


Единственное я добавил элементарный код, чтоб оптимизатор не выбрасывал цикл
Код:
for (int16_t i = (int16_t)255; i >= 0; i-=8)
   {
      RA0 = i & 1;
   }


Добавлено after 10 minutes 22 seconds:
кому интересно создал топик на микрочиповском форуме

https://www.microchip.com/forums/m11032 ... tree=false

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 17:27:48

по листингу похоже нормально - практически как v 1.42.
Компилятор SDCC (3.9 свежий) на конструкцию вообще не ругнулся
Код:
    for (int16_t i = 255; i >= 0; i -= 8)
    {
        PORTCbits.RC0 = (uint8_t)i & 1;
    }

листинг немного по другому но похоже
Код:
;   .line   32; "main.c"   for (int16_t i = 255; i >= 0; i -= 8)
   MOVLW   0xff
   MOVWF   r0x1005
   CLRF   r0x1006
;;signed compare: left < lit(0x0=0), size=2, mask=ffff
_00130_DS_:
   BSF   STATUS,0
   BTFSS   r0x1006,7
   BCF   STATUS,0
   BTFSC   STATUS,0
   GOTO   _00127_DS_
;;genSkipc:3257: created from rifx:0x7ffc5f11ef70
;   .line   34; "main.c"   PORTCbits.RC0 = (uint8_t)i & 1;
   MOVF   r0x1005,W
   MOVWF   r0x1007
   RRF   r0x1007,W
   BTFSC   STATUS,0
   GOTO   _00001_DS_
   BANKSEL   _PORTCbits
   BCF   _PORTCbits,0
_00001_DS_:
   BTFSS   STATUS,0
   GOTO   _00002_DS_
   BANKSEL   _PORTCbits
   BSF   _PORTCbits,0
_00002_DS_:
;   .line   32; "main.c"   for (int16_t i = 255; i >= 0; i -= 8)
   MOVLW   0xf8
   ADDWF   r0x1005,F
   BTFSS   STATUS,0
   DECF   r0x1006,F
   GOTO   _00130_DS_
_00127_DS_:

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 18:01:42

Короче, на форуме микрочип большинство людей пришло к выводу - что таки да - это баг компиля. И советуют ставить тикет на микрочип. Кому интересно ссыль на топик я приводил выше.

ПС
Просто разница меня поразила - за полчаса на буржуйском форуме адекватно всё разобрали с пришли к выводу. А на нашем родном коте - началось с оскорблений....печаль

Добавлено after 1 minute 56 seconds:
Компилятор SDCC (3.9 свежий) на конструкцию вообще не ругнулся


Естественно, да и не должен - как я и писал в стартовом посте то, что пишет xc8 - это бред не совместимый со стандартом СИ.

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 18:29:09

fsmoke писал(а):Вы не только не аргументировали свою фразу, но и не удосужились появиться, когда я ответил на Ваш выпад.

Если Вы не умеете читать документацию (или просто Вам лень это делать) - это Ваши проблемы. Я не намерен аргументировать очевидное.
И будь Вы хоть 100500-летним программистом, не зная, что существуют стандарты, Вы - плохой программист.

PS: А выпад (как Вы выразились), был именно с Вашей стороны. Таких выпадов тут на форуме - вагон и маленькая тележка. Когда каждый "программист" с месячным стажем, мнящий себя крутым спецом, первым делом забрасывает какашками компилятор, считая себя умнее его разработчиков. А проблема, как потом оказывается (как и в данном случае), элементарная - в прокладке между стулом и монитором.

PSPS: По поводу личностей. Вы меня оскорбили, назвав компилятор XC дичью. Надеюсь, этого аргумента достаточно.

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 18:42:33

не зная, что существуют стандарты, Вы - плохой программист.


Дык вот из-за того, что я их знаю - я и создал этот топик. А Ваши знания видимо оставляют желать лучшего.

ПС
А Вы вообще читали остальной тред и тред на микрочипе - или как обычно выпалили не подумав. Мы тут как раз стандарт и обсуждаем :lol:

Как вообще можно опять писать такое - если для Вас всё уже разложили по полочкам, прикрепили проект дали ссылки - какие ещё аргументы Вам нужны?

ПС2
Да и кстати - если Вы такой хороший программист - растолкуйте нам убогим - в чём же мы не правы?

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 19:03:51

Не нужно меня троллить. Если Вам скучно и не с кем поговорить, Вы выбрали неправильное направление - я не собеседник для досуга.
PS: Повторяться не буду. Всего хорошего !

Re: xc8 и degenerate unsigned comparison

Пт июн 28, 2019 19:17:18

Не нужно меня троллить.

Я не собирался никого троллить, просто это уже абсурдная ситуация - Вы можете объяснить наличие этого варнинга? Я хочу ответа по теме - больше мне ничего не нужно.
Ответить