Страница 1 из 2

xc8 и degenerate unsigned comparison

Добавлено: Ср июн 26, 2019 11:10:47
fsmoke
Пишу код, никого не трогаю и вдруг бамс варнинг 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
Аlex
Дичь у вас в голове, от неумения читать документацию.

Re: xc8 и degenerate unsigned comparison

Добавлено: Чт июн 27, 2019 10:57:30
fsmoke
[uquote="Аlex",url="/forum/viewtopic.php?p=3657346#p3657346"]неумения читать документацию.[/uquote]
Очень хорошо...начало положено. Только хотелось бы услышать подробности. Просто кинуться подобными фразами и уйти в закат - это конечно круто, но я считаю, что по стандарту си - ошибки тут не должно быть. И про какую документацию идёт речь? Даташит-не имеет ничего общего с си. Дока по XC8 - ну я её читал - можт конечно пропустил чего. Ну тыкните меня носом - раз уж так уверены.

Re: xc8 и degenerate unsigned comparison

Добавлено: Чт июн 27, 2019 16:27:15
КРАМ
Варнинг не является ошибкой. Варнинг предупреждает о возможной ПРИ ОПРЕДЕЛЕННЫХ УСЛОВИЯХ ошибке.

Re: xc8 и degenerate unsigned comparison

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

Re: xc8 и degenerate unsigned comparison

Добавлено: Пт июн 28, 2019 00:33:04
A. Fig Lee
Автор, запости точное определение че тебе сказали.
Я хоть и меньше 30 лет на с/с++, но вижу что компайлер волну гонит.
Нет тут ансайнед

Re: xc8 и degenerate unsigned comparison

Добавлено: Пт июн 28, 2019 08:41:23
oleg110592
[uquote="fsmoke",url="/forum/viewtopic.php?p=3657034#p3657034"]взял gcc - скомпилил этот кусок - нет никаких варнингов[/uquote]
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
fsmoke
По теме
Переписал этот код следующим образом:

Код: Выделить всё

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:
[uquote="A. Fig Lee",url="/forum/viewtopic.php?p=3657869#p3657869"]Автор, запости точное определение че тебе сказали.[/uquote]

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

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

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

Код: Выделить всё

#include <xc.h>
#include <stdint.h>

_Noreturn void main()
{
	for (int16_t i = 255; i >= 0; i-=8)
	{
	
	}
}
ПС
Компилятор xc8 2.05, тестовый проект в аттаче

Re: xc8 и degenerate unsigned comparison

Добавлено: Пт июн 28, 2019 12:19:28
oleg110592
в гугле полно жалоб на "degenerate unsigned comparison" - не изучал
так нормально

Код: Выделить всё

for (int16_t i = 255; i >= -1; i -= 8) 
значит "0" unsigned :))

Re: xc8 и degenerate unsigned comparison

Добавлено: Пт июн 28, 2019 12:32:07
fsmoke
[uquote="oleg110592",url="/forum/viewtopic.php?p=3658045#p3658045"]в гугле полно жалоб на "degenerate unsigned comparison"[/uquote]

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

[uquote="oleg110592",url="/forum/viewtopic.php?p=3658045#p3658045"]так нормально

Код: Выделить всё

for (int16_t i = 255; i >= -1; i -= 8) 
значит "0" unsigned :))[/uquote]

действительно 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
pyzhman
А если не 255, а, скажем, 248 ему дать?

Re: xc8 и degenerate unsigned comparison

Добавлено: Пт июн 28, 2019 12:57:21
fsmoke
[uquote="pyzhman",url="/forum/viewtopic.php?p=3658062#p3658062"]скажем, 248 ему дать?[/uquote]

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

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

Re: xc8 и degenerate unsigned comparison

Добавлено: Пт июн 28, 2019 13:04:15
oleg110592
в листинге вроде хорошо - бит знака похоже проверяет 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
fsmoke
Вот мой листинг с 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
oleg110592
по листингу похоже нормально - практически как 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
fsmoke
Короче, на форуме микрочип большинство людей пришло к выводу - что таки да - это баг компиля. И советуют ставить тикет на микрочип. Кому интересно ссыль на топик я приводил выше.

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

Добавлено after 1 minute 56 seconds:
[uquote="oleg110592",url="/forum/viewtopic.php?p=3658221#p3658221"]Компилятор SDCC (3.9 свежий) на конструкцию вообще не ругнулся[/uquote]

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

Re: xc8 и degenerate unsigned comparison

Добавлено: Пт июн 28, 2019 18:29:09
Аlex
fsmoke писал(а):Вы не только не аргументировали свою фразу, но и не удосужились появиться, когда я ответил на Ваш выпад.
Если Вы не умеете читать документацию (или просто Вам лень это делать) - это Ваши проблемы. Я не намерен аргументировать очевидное.
И будь Вы хоть 100500-летним программистом, не зная, что существуют стандарты, Вы - плохой программист.

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

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

Re: xc8 и degenerate unsigned comparison

Добавлено: Пт июн 28, 2019 18:42:33
fsmoke
[uquote="Аlex",url="/forum/viewtopic.php?p=3658251#p3658251"]не зная, что существуют стандарты, Вы - плохой программист.[/uquote]

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

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

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

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

Re: xc8 и degenerate unsigned comparison

Добавлено: Пт июн 28, 2019 19:03:51
Аlex
Не нужно меня троллить. Если Вам скучно и не с кем поговорить, Вы выбрали неправильное направление - я не собеседник для досуга.
PS: Повторяться не буду. Всего хорошего !

Re: xc8 и degenerate unsigned comparison

Добавлено: Пт июн 28, 2019 19:17:18
fsmoke
[uquote="Аlex",url="/forum/viewtopic.php?p=3658271#p3658271"]Не нужно меня троллить.[/uquote]
Я не собирался никого троллить, просто это уже абсурдная ситуация - Вы можете объяснить наличие этого варнинга? Я хочу ответа по теме - больше мне ничего не нужно.