|
Лучшее - враг хорошего?, Глюки при оптимизации компилятора KEIL |
|
|
|
May 31 2012, 14:16
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(vlad_new @ May 31 2012, 15:41)  А Вы его и спросите. К примеру sprintf(mas,"бла...бла", tmp); при объявленном локальном массиве char mas[10] и включенном оптимизаторе O1 просто не заработал. И передача адреса массива в другую функцию send(char *mas) то же не работало. Помог static. А может это самое "бла...бла" было такое длиное, что не влезало в 10 байт? А когда разместилось как static, может sprintf и залезало на верхнего соседа массива, но тот был того же толка, - временная переменная (что заявленый стиль программирования позволяет предположить), - которая стерпела вторжение. Даже с пониманием того, что компилятор не безгрешен по определению, следовало бы поискать ошибки сначала у себя, прежде чем бросаться в крайности. Конечно, каждый пишет, как хочет, и окончательным критерием истины является только одно - работает программа как надо, или нет, - но я бы позволил себе дать дружеский совет пересмотреть стиль программирования.
|
|
|
|
|
May 31 2012, 14:44
|
Местный
  
Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127

|
На счет ошибок - я уже показывал этот пример другим. Никто ошибок не обнаружил. Так что вряд ли. Хотя опять же такое было в ранних версиях. За это время и библиотеки могли поминяться и и еще что то. У меня щас времени нет перепроверять. Хочеш сам попробуй. А потом сообщиш о результатах. Цитата(KnightIgor @ May 31 2012, 18:16)  А может это самое "бла...бла" было такое длиное, что не влезало в 10 байт? Ну не 10 может 20 яж так к примеру. То что 32 бита занимают 10 символов+0+(возможно)знак я вроде как считать умею. Мы здесь чего обсуждаем то? Разве не то кто с какими проблеммами сталкивался при оптимизации? И от ошибок никто не застрахован. Все может быть. Короче я все рассказал что вспомнил. Всем пока.
Сообщение отредактировал vlad_new - May 31 2012, 14:47
|
|
|
|
|
Jun 1 2012, 05:58
|

Частый гость
 
Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593

|
Цитата(vlad_new @ May 31 2012, 05:41)  А Вы его и спросите. К примеру sprintf(mas,"бла...бла", tmp); при объявленном локальном массиве char mas[10] и включенном оптимизаторе O1 просто не заработал. И передача адреса массива в другую функцию send(char *mas) то же не работало. Помог static. Уверен, что косяк у вас в коде. Довольно часто использовал подобные конструкции на разных уровнях оптимизации, никогда проблем не было. Думаю, что обьяснение данное выше KnightIgor довольно точно описывает причину происходящего.
|
|
|
|
|
Jun 1 2012, 12:32
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(zuy @ Jun 1 2012, 09:58)  Уверен, что косяк у вас в коде. С Кейлом знаком еще по 51 семейству, еще тогда были проблемы с локальными переменными, если их передавать в функции (при чем в свои, а не в sprintf) и не обозвать static. Для arm аналогично, будет время покопаю этот момент.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 1 2012, 12:42
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(aaarrr @ Jun 1 2012, 16:39)  А ничего так, что это два совершенно разных компилятора от разных производителей? Я это к тому, что еще с тех пор взял за правило ставить static у локальных переменных в функциях, если они идут дальше. Цитата(aaarrr) 99.9% "ошибок компилятора" и "багов оптимизатора" - это косяки в коде. Обратному можно верить только при наличии примера в виде код + дизассемблер. Я к этому мнению пришел недавно, намного позже, чем стал ставить static у локальных переменных. =) Поэтому и хочу при наличии времени поиграться именно с дизассемблером.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 2 2012, 18:36
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(_Артём_ @ Jun 1 2012, 17:31)  Очень странная идея. Зачем оно надо?
P.S. volatile не пробовали для локальных? Это хоть не так нелогично. Вы заблуждаетесь, логика присутствует. При static локальная переменная будет жить в глобальной области памяти, а не на стеке. И именно поэтому проблемы исчезали. PS: На работе попробовал по памяти набросать код, который вызывал когда-то проблемы (чтобы осмысленно глянуть в дизассемблер) - в функции локальный массив или указатель передается дальше. Но увы, всё работает, как надо при любой оптимизации. =) Помню, когда в последний раз такое случалось, я перенес аналогичный код в iar'овский компилятор - там без static работало. И т.к. это был не первый случай, то старался больше не рисковать и ставил static у локальных указателей и массивов, если они идут дальше (реентерабельность не требовалась). Прочитав эту тему по диагонали и заметив знакомую проблему, удивился что уважаемый aaarrr очень уверенно говорит, что дело не в компиляторе. Может оно и так, но помимо меня как минимум еще двое испытывают похожие проблемы.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 2 2012, 19:53
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Lotor @ Jun 2 2012, 21:36)  Вы заблуждаетесь, логика присутствует.  Ну какая-то логика конечно присутствует, если программа всё-таки работает. Цитата(Lotor @ Jun 2 2012, 21:36)  При static локальная переменная будет жить в глобальной области памяти, а не на стеке. И именно поэтому проблемы исчезали. Зачем переменной "жить в глобальной области памяти"? Локальная переменная должна жить в стеке (за исключением особых случаев). Вопрос в том, почему такие проблемы вообще возникают. Что-то делаете не так. Согласен с мнением scifiЦитата Это танцы с бубном. Так не интересно. Лучше докопаться до сути проблемы. Каким-то образом вам удалось заткнуть проблему (с помощью static), но не факт что не вылезет где-нибудь в другом месте. Цитата(Lotor @ Jun 2 2012, 21:36)  И т.к. это был не первый случай, то старался больше не рисковать и ставил static у локальных указателей и массивов, если они идут дальше (реентерабельность не требовалась). Если реентерабельность не требуется, то как бы и ладно, если по другому никак. А как потребуется? Или как такое будет работать в программе с ОС? Понятно что никак не будет. Цитата(Lotor @ Jun 2 2012, 21:36)  Прочитав эту тему по диагонали и заметив знакомую проблему, удивился что уважаемый aaarrr очень уверенно говорит, что дело не в компиляторе. Может оно и так, но помимо меня как минимум еще двое испытывают похожие проблемы. aaarrr видимо прав на 100 %. Если у него таких проблем не возникает, то что-то эти "ещё двое" делают не правильно и дело не в компиляторе. Вообще за последние несколько лет не встречал чтобы дело было в компиляторе (правда я с iar работаю), 99% что виноват программист, ну и может доли процента можно оставить на глюки компилятора.
|
|
|
|
|
Jun 4 2012, 12:21
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(_Артём_ @ Jun 2 2012, 23:53)  Зачем переменной "жить в глобальной области памяти"? Локальная переменная должна жить в стеке (за исключением особых случаев). Речь шла о том, что помогло решить проблему и что дает static у локальных переменных. Другое дело, что это костыль. Цитата(_Артём_ @ Jun 2 2012, 23:53)  Вообще за последние несколько лет не встречал чтобы дело было в компиляторе (правда я с iar работаю), 99% что виноват программист, ну и может доли процента можно оставить на глюки компилятора. Так вроде мы и не из этих, которые свои косяки валят на компилятор, кристалл или фазу луны.  Увы, воспроизвести "по заказу" не могу, поэтому добавляю тему в закладки - и как только, так сразу.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|