реклама на сайте
подробности

 
 
> Странное предупреждение
Jenya7
сообщение Jun 5 2018, 05:52
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть такая строчка в коде
Код
for (i=0; i < size_to_take; i++)
{
      DataBuffer[i] = (data_out[j++]<<8) | data_out[j++];
}
Выскакивает предупреждение
Цитата
Warning[Pa079]: undefined behavior: variable "j" (declared at line 176) (or a value reached by some form of indirection through it) is modified more than once without an intervening
В GCC компайлере такого предупреждения нет.Что надо переделать чтоб предупреждение исчезло?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
juvf
сообщение Jun 21 2018, 07:50
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



ну на конец то предметный разговор, а не "слепая вера"

Цитата
Попробуйте когда-нить
попробую обязательно.

Цитата
Современные оптимизаторы творят чудеса. И им по-барабану Ваши жалкие потуги заменить операции индексирования на указатели и подобное - они это и сами хорошо делают, даже ещё и лучше.
Это я слышал и/или знаю.... Но, во первых, современные оптимизаторы иногда портят код так, что он не работает как надо, приходится либо отключать оптимизацию полностью, либо на отдельной функции. Во вторых про потуги вы зря.... когда мой код перестал влазить в флешь, а в прерываниях стал долго задерживаться, то сделал рефакторинг - код и влез и стал быстрее работать. Одна строчка до рефакторинга была 6 машинных команд, стала 2 или 4.
Убрал всякие лишние << |, на каждом участке экономил где по 10-20 байт флеша, где по 100.

Цитата
во-вторых: ничего не известно о значении size_to_take, а если она перед началом цикла может быть отрицательной (и i - тоже знаковое)

Морите!? О чем тут дискутировать, если вы не знаете как работает for? Если size_to_take отрицательная и i тоже знаковое, то в примере ТС в тело цикла for не разу не зайдем. Это вообще букварь Си.

Цитата
с чего Вы приводите входные аргументы к типу void *?
Да, согласен, неточность есть. Если быть скрупулёзным к явным преобразованиям, то нужно так
memcpy((void*)DataBuffer, (const void*)&data_out[j], 2*size_to_take);
Я не утверждаю, я всего лишь предположил, что копировать память лучше через memcpy. Если это не 8 и 16 бит, то забыли про мой совет. О чем спор?

Цитата
А если у ТС-а DataBuffer и data_out объявлены к примеру с модификатором volatile
И что? в чем разница вот в таких кодах с volatile (архитектура ст первый, без перевёртывания):
Вариант 1:
Код
volatile uint16_t DataBuffer[100];
volatile uint8_t data_out [1024];
uint16_t size_to_take = 100;
uint8_t j = 17;
for(uint16_t  i=0; i<size_to_take; i++ )
{
   DataBuffer[i] = (data_out[j] << 8)| data_out[j+1];
   j += 2;
}


Вариант 2:
Код
volatile uint16_t DataBuffer[100];
volatile uint8_t data_out [1024];
uint16_t size_to_take = 100;
memcpy((void*)DataBuffer, (const void*)&data_out[17], 2*size_to_take);


Или по вашему 1-ый вариант работать будет, а второй нет?



Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 21 2018, 08:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(juvf @ Jun 21 2018, 10:50) *
Но, во первых, современные оптимизаторы иногда портят код так, что он не работает как надо, приходится либо отключать оптимизацию полностью

А вот здесь: код в студию!
Ибо в 99.9% таких случаев причина - баг в коде. smile3046.gif
Я даже скажу больше: я при отладке кода проверяю его работу с включенной и отключенной оптимизацией - это помогает находить скрытые баги в коде.
Go to the top of the page
 
+Quote Post
juvf
сообщение Jun 21 2018, 09:01
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата
Продолжаем думать дальше. Подсказываю ещё раз: А что будет с Вашим вариантом на memcpy()?
Что за глупость? при чем тут memcpy с отрицатеольными size_to_take? В коде ТС явно size_to_take > 0.
Цитата(jcxz @ Jun 21 2018, 13:44) *
А вот здесь: код в студию!

Код
#pragma optimize=none
unsigned int crc16_byte(unsigned int crc, unsigned int data)
{
    //const unsigned int Poly16=0xA001;
    unsigned int LSB;
    crc = ((crc^data) | 0xFF00) & (crc | 0x00FF);
    for (uint8_t i=0; i<8; i++)
    {
        LSB=(crc & 0x0001);
        crc >>= 1;
        if(LSB)
            crc=crc^0xA001;
    }
    return crc;
}
Такой код работает, если убрать прагму, то црц считается не правильно. Для фантазёров, видящих за рамками кода всякое ООП, перегрузку операторов, переопределение типов и прочую фуе ту.... перегрузки операторов нет, переопределений типов и чего либо ещё нет. тип unsigned int 16 бит!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 21 2018, 10:18
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(juvf @ Jun 21 2018, 12:01) *
Что за глупость? при чем тут memcpy с отрицатеольными size_to_take? В коде ТС явно size_to_take > 0.

Где это "явно указано"? Ни объявления ни присвоения значения size_to_take там нету. А это означает, что size_to_take к началу цикла может принимать любое значение. И алгоритм вполне может быть рассчитан на то, что при size_to_take<=0 не должно выполняться ни одной итерации.
Глупость - это видеть то, чего нет.

Цитата(juvf @ Jun 21 2018, 12:01) *
Такой код работает, если убрать прагму, то црц считается не правильно.

В исходнике вроде криминала нет. Но это ничего не доказывает.
Без анализа ассемблерного результата ничего сказать нельзя.
Да даже анализ ассемблерного варианта может ничего не дать. Элементарная причина "неверной работы оптимизированного варианта" при работе оптимизированного например: переполнение стека в вызывающей задаче. Оптимизированные варианты, как правило расходуют больше стека (больше регистров используют, соответственно - больше их сохраняют на входе в функции; заменяют некоторые повторяющиеся куски кода на дополнительные подпрограммы, что опять же ведёт к увеличению расхода стека и т.п.), а в неоптимизированном варианте стека ещё хватает.
Другой вариант: при вкл. оптимизации функция может инлайниться в точки вызова, вызывая перераспределение регистров (увеличение их использования), что может приводить к проявлению скрытых багов в вызывающих функциях, которые при меньшем кол-ве используемых регистров не проявляются.
Так что наиболее вероятный диагноз остаётся тем же: с вероятностью 99.9% - баги в коде. laughing.gif И необязательно что в этой процедуре.

Цитата(adnega @ Jun 21 2018, 12:06) *
Да, но 0.1% все же баг в компиляторе.
У меня есть проект, который собирается и работает при O2 и не собирается при Os. Интересно?

В приведённом Вами примере баг в Вашем коде, а не в компиляторе. О чём компилятор Вам и сообщает.
Вы вычисляете выражение, результат которого зависит от взаимного расположения меток. Их взаимное расположение видимо определяется на этапе компиляции (в зависимости от результата компиляции кода, который между ними - размер его меняется). Естественно - когда результат не влазит в байт, компилятор Вам об этом сообщает. В чём его ошибка? wacko.gif
А писать так код - это выстрел себе в ногу: сегодня компилится, завтра - нет.

Цитата(juvf @ Jun 21 2018, 12:24) *
Я тоже про это думал. На весь проект стоит максимальная оптимизация по размеру кода. Дебажил на уровне Си, в асм углубляться не стал. Одна строчка #pragma optimize=none давала правильную работу расчета црц. Поэтому врят-ли что-то в остальном коде не так. Времени не было искать глюк в компиляторе или ещё где.... Видимо это был 0,1%.

Ну да - обычное оправдание багописателей в таких случаях: "не было времени искать баг, поэтому я закопал его поглубже". Это ничего, что потом, через неопределённой время он опять проявится и вдарит по лбу в самом неожиданном месте. Когда совершенно безобидный код станет глючить. И опять виноват конечно будет компилятор, ну кто-ж ещё! smile3009.gif

При отладке одно из главнейших правил: ПРИ ПРОЯВЛЕНИИ БАГА НЕ СЛЕДУЕТ СТАРАТЬСЯ ДОБИТЬСЯ ТОГО, ЧТОБЫ ОН НЕ ПРОЯВЛЯЛСЯ. НАДО НАОБОРОТ - ЗАКРЕПИТЬ УСЛОВИЯ, ПРИ КОТОРЫХ ОН ПРОЯВЛЯЕТСЯ, ДОБИТЬСЯ ЕГО ПОВТОРЯЕМОСТИ И ИСКАТЬ ЕГО ПРИЧИНУ И УСТРАНИТЬ! И пока этого не сделано - двигаться дальше нельзя.
Ведь не тот баг страшен, который чётко проявляется, а тот - что проявляется иногда, внезапно и хаотично.

Цитата(scifi @ Jun 21 2018, 12:07) *
Поймать его за руку на конретной инструкции сложно, так как код MD5 зубодробительный.

Один из вариантов действий в такой ситуации:
Скомпилить подозреваемую функцию с оптимизацией. Взять ассемблерный результат её компиляции, оформить в виде асм-функции. И вставить в исходник вместо вызова си-функции. Выключить оптимизацию и проверить работу кода. Если теперь глюк появился и в неоптимизированном варианте, то только в этом случае можно предполагать, что проблема в данной оптимизированной функции. Далее - только анализ этой ассемблерной функции.
Go to the top of the page
 
+Quote Post
juvf
сообщение Jun 21 2018, 10:50
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(jcxz @ Jun 21 2018, 15:18) *
При отладке одно из главнейших правил: ПРИ ПРОЯВЛЕНИИ БАГА НЕ СЛЕДУЕТ СТАРАТЬСЯ ДОБИТЬСЯ ТОГО, ЧТОБЫ ОН НЕ ПРОЯВЛЯЛСЯ. НАДО НАОБОРОТ - ЗАКРЕПИТЬ УСЛОВИЯ, ПРИ КОТОРЫХ ОН ПРОЯВЛЯЕТСЯ, ДОБИТЬСЯ ЕГО ПОВТОРЯЕМОСТИ И ИСКАТЬ ЕГО ПРИЧИНУ И УСТРАНИТЬ! И пока этого не сделано - двигаться дальше нельзя.
так я нашел причину и устранил. ))

inline void waitSpi() { while( (SPI1->SR & (uint8_t)SPI_FLAG_BSY));} - вот этот код не работает с оптимизацией в пустом хороводе. И не изредка - а всегда. 100 раз из 100. А без оптимизации работает как часы. ни каких сбоев в обмене по SPI замечено не было.

Цитата
Ведь не тот баг страшен, который чётко проявляется, а тот - что проявляется иногда, внезапно и хаотично.
У меня црц считается с ошибкой всегда, когда вкл оптимизация, не изредка, а всегда. И всегда считается правильно с отключенной оптимизацией. Нету хаотичных и внезапных сбоев.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 21 2018, 11:04
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(juvf @ Jun 21 2018, 13:50) *
inline void waitSpi() { while( (SPI1->SR & (uint8_t)SPI_FLAG_BSY));} - вот этот код не работает с оптимизацией в пустом хороводе. И не изредка - а всегда. 100 раз из 100. А без оптимизации работает как часы. ни каких сбоев в обмене по SPI замечено не было.

Я так понимаю, версия про "volatile" была проверена и не подтвердилась? Опять же, конкретно в этом случае чтение листинга дизассемблера не затруднило бы нисколько. Из оправданий - только лень.
Кстати, бывают баги, зависящие от задержек. Скажем, регистр SPI1->SR нужно начинать читать не сразу, а через пару тактов, без оптимизации задержка получалась сама собой - как вариант.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Странное предупреждение   Jun 5 2018, 05:52
- - scifi   j++ два раза в одном выражении - это бяка. Результ...   Jun 5 2018, 05:54
|- - Jenya7   Цитата(scifi @ Jun 5 2018, 11:54) j++ два...   Jun 5 2018, 05:58
|- - MrYuran   Цитата(scifi @ Jun 5 2018, 08:54) j++ два...   Jun 5 2018, 06:18
- - scifi   Цитата(Jenya7 @ Jun 5 2018, 08:58) по мое...   Jun 5 2018, 06:37
|- - andrew_b   Цитата(scifi @ Jun 5 2018, 09:37) То есть...   Jun 5 2018, 06:49
||- - scifi   Цитата(andrew_b @ Jun 5 2018, 09:49) Риск...   Jun 5 2018, 07:09
||- - andrew_b   Цитата(scifi @ Jun 5 2018, 10:09) Неверно...   Jun 5 2018, 13:24
||- - Сергей Борщ   QUOTE (andrew_b @ Jun 5 2018, 16:24) Оно?...   Jun 5 2018, 15:22
|- - MrYuran   Цитата(scifi @ Jun 5 2018, 09:37) То есть...   Jun 5 2018, 07:07
|- - Jenya7   Цитата(scifi @ Jun 5 2018, 12:37) Что меш...   Jun 5 2018, 08:17
- - ViKo   А вот же похожая тема. Только в ней инкремент с др...   Jun 5 2018, 07:34
- - k155la3   Код DataBuffer[i] = (data_out[j++...   Jun 5 2018, 12:55
- - juvf   Цитата(Jenya7 @ Jun 5 2018, 10:52) Есть т...   Jun 20 2018, 07:19
|- - scifi   Цитата(juvf @ Jun 20 2018, 10:19) без вор...   Jun 20 2018, 08:59
|- - jcxz   Цитата(juvf @ Jun 20 2018, 10:19) безопас...   Jun 20 2018, 09:40
|- - juvf   Цитата(jcxz @ Jun 20 2018, 14:40) Не верю...   Jun 20 2018, 10:10
|- - jcxz   Цитата(juvf @ Jun 20 2018, 13:10) Bера в ...   Jun 20 2018, 10:24
||- - juvf   Цитата(jcxz @ Jun 20 2018, 15:24) но даже...   Jun 20 2018, 10:37
||- - jcxz   Цитата(juvf @ Jun 20 2018, 13:37) какую? ...   Jun 20 2018, 18:30
||- - adnega   Цитата(jcxz @ Jun 20 2018, 21:30) С чего ...   Jun 20 2018, 18:42
||- - jcxz   Цитата(adnega @ Jun 20 2018, 21:42) Это о...   Jun 20 2018, 19:31
||- - adnega   Цитата(jcxz @ Jun 20 2018, 22:31) И что? ...   Jun 20 2018, 20:01
|- - adnega   Цитата(juvf @ Jun 20 2018, 13:10) C memcp...   Jun 20 2018, 10:31
|- - Obam   Цитата(juvf @ Jun 20 2018, 13:10) ...ТС с...   Jun 20 2018, 18:49
|- - juvf   Цитата(Obam @ Jun 20 2018, 23:49) GCC не ...   Jun 21 2018, 04:24
|- - adnega   Цитата(juvf @ Jun 21 2018, 07:24) С чего ...   Jun 21 2018, 05:32
||- - Сергей Борщ   QUOTE (adnega @ Jun 21 2018, 08:32) ...   Jun 21 2018, 06:22
||- - VladislavS   Цитата(Сергей Борщ @ Jun 21 2018, 09:22) ...   Jun 21 2018, 07:27
|- - jcxz   Цитата(juvf @ Jun 21 2018, 07:24) Как вы ...   Jun 21 2018, 07:05
|- - juvf   Цитата(jcxz @ Jun 21 2018, 12:05) Цитата(...   Jun 22 2018, 05:11
|- - scifi   Цитата(juvf @ Jun 22 2018, 08:11) Добрый ...   Jun 22 2018, 06:55
|- - jcxz   Цитата(juvf @ Jun 22 2018, 08:11) ps пров...   Jun 22 2018, 07:37
|- - juvf   ваш ответ - тоже априори. много слюней, воды, теле...   Jun 22 2018, 09:13
|- - jcxz   Цитата(juvf @ Jun 22 2018, 12:13) Нормаль...   Jun 22 2018, 09:31
|- - juvf   Цитата(jcxz @ Jun 22 2018, 14:31) Ну, дае...   Jun 22 2018, 18:10
- - scifi   Цитата(juvf @ Jun 20 2018, 10:19) и БЫСТР...   Jun 20 2018, 12:52
|- - VladislavS   Цитата(scifi @ Jun 20 2018, 15:52) Интере...   Jun 20 2018, 17:59
|- - scifi   Цитата(juvf @ Jun 21 2018, 10:50) Но, во ...   Jun 21 2018, 08:03
||- - juvf   Цитата(scifi @ Jun 21 2018, 13:03) За так...   Jun 21 2018, 08:17
|- - jcxz   Цитата(juvf @ Jun 21 2018, 10:50) Морите...   Jun 21 2018, 08:41
|- - scifi   Цитата(juvf @ Jun 21 2018, 10:50) Или по ...   Jun 21 2018, 08:42
||- - scifi   Цитата(juvf @ Jun 21 2018, 12:01) Такой к...   Jun 21 2018, 09:07
|||- - juvf   Цитата(scifi @ Jun 21 2018, 14:07) Конечн...   Jun 21 2018, 09:24
||- - juvf   Цитата(jcxz @ Jun 21 2018, 14:53) Где это...   Jun 21 2018, 10:24
|||- - jcxz   Цитата(juvf @ Jun 21 2018, 13:24) ээээ......   Jun 21 2018, 11:06
|||- - scifi   Цитата(jcxz @ Jun 21 2018, 14:06) И по ас...   Jun 21 2018, 11:09
|||- - juvf   Цитата(jcxz @ Jun 21 2018, 16:06) При пер...   Jun 21 2018, 11:19
||- - adnega   Цитата(jcxz @ Jun 21 2018, 13:09) В приве...   Jun 21 2018, 10:25
|||- - jcxz   Цитата(adnega @ Jun 21 2018, 13:25) компи...   Jun 21 2018, 11:12
|||- - scifi   Цитата(jcxz @ Jun 21 2018, 14:10) Для так...   Jun 21 2018, 11:13
||||- - jcxz   Цитата(scifi @ Jun 21 2018, 14:13) Пожалу...   Jun 21 2018, 11:22
|||- - adnega   Цитата(jcxz @ Jun 21 2018, 14:12) Из Ваше...   Jun 21 2018, 12:01
||- - jcxz   Цитата(juvf @ Jun 21 2018, 13:50) У меня ...   Jun 21 2018, 11:19
|||- - juvf   Цитата(jcxz @ Jun 21 2018, 16:19) Ведь ес...   Jun 21 2018, 11:46
|||- - jcxz   Цитата(juvf @ Jun 21 2018, 14:46) в waitS...   Jun 21 2018, 12:11
|||- - adnega   Цитата(jcxz @ Jun 21 2018, 15:11) PS: Есл...   Jun 21 2018, 12:57
|||- - juvf   Цитата(jcxz @ Jun 21 2018, 17:11) Вот так...   Jun 21 2018, 13:09
|||- - scifi   Цитата(juvf @ Jun 21 2018, 16:09) Дело в ...   Jun 21 2018, 13:19
||||- - juvf   ЦитатаПравильно тут уже написали про Ваш стиль: Вм...   Jun 21 2018, 14:44
|||- - adnega   Цитата(juvf @ Jun 21 2018, 16:09) Т.е. по...   Jun 21 2018, 13:34
|||- - scifi   Цитата(adnega @ Jun 21 2018, 16:34) Телеп...   Jun 21 2018, 13:40
|||- - adnega   Цитата(scifi @ Jun 21 2018, 16:40) А не л...   Jun 21 2018, 13:56
||- - jcxz   Цитата(juvf @ Jun 21 2018, 13:50) inline ...   Jun 21 2018, 11:48
||- - juvf   Цитата(jcxz @ Jun 21 2018, 16:48) описани...   Jun 21 2018, 12:29
||- - scifi   Цитата(juvf @ Jun 21 2018, 15:29) CS - не...   Jun 21 2018, 12:39
||- - jcxz   Цитата(juvf @ Jun 21 2018, 15:29) Я же го...   Jun 21 2018, 14:21
||- - adnega   Цитата(jcxz @ Jun 21 2018, 17:21) Нет, не...   Jun 21 2018, 14:47
|- - adnega   Цитата(jcxz @ Jun 21 2018, 11:44) Ибо в 9...   Jun 21 2018, 09:06
- - Kabdim   Любопытства ради и самообразования для, не могли б...   Jun 21 2018, 11:02
|- - juvf   Цитата(Kabdim @ Jun 21 2018, 16:02) Любоп...   Jun 21 2018, 11:06
- - VladislavS   Вместо стольких слов достаточно посмотреть листинг...   Jun 21 2018, 15:52
- - jcxz   Цитата(VladislavS @ Jun 21 2018, 18:52) В...   Jun 21 2018, 16:51


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 13:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01748 секунд с 7
ELECTRONIX ©2004-2016