Страница 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" - не изучал
так нормально
значит "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"]так нормально
значит "0" unsigned

[/uquote]
действительно i >= -1 - не генерирует варнинг
А
Код: Выделить всё
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]
Дык вот из-за того, что я их знаю - я и создал этот топик. А Ваши знания видимо оставляют желать лучшего.
ПС
А Вы вообще читали остальной тред и тред на микрочипе - или как обычно выпалили не подумав. Мы тут как раз стандарт и обсуждаем
Как вообще можно опять писать такое - если для Вас всё уже разложили по полочкам, прикрепили проект дали ссылки - какие ещё аргументы Вам нужны?
ПС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]
Я не собирался никого троллить, просто это уже абсурдная ситуация - Вы можете объяснить наличие этого варнинга? Я хочу ответа по теме - больше мне ничего не нужно.