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

 
 
> IAR 5.40.0.51500 баг в sprintf @ lpc1114/CM0
GetSmart
сообщение Mar 5 2013, 23:49
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Непонятный баг в виде выпадения в HardFault из sprintf при выводе форматированного float, причём в некоторых случаях. Юзал эту версию ИАРа вместе со sprintf для LPC1768 и ни на какие грабли не попадал. Стек проверял, его достаточно, оптимизация никак не влияет. Простенький кастрированный проект прилагаю для LPC1114 (без кварца) можно потестить. Прочитал все исправленные баги в версии 6.30 и не нашёл ничего об исправленном sprintf. Хотя тот же код в 6.30 не зависает, но проверил наспех. Поэтому самому интересно в чём косяк и исправлен ли он в новых версиях ИАРа.

Код
    sprintf((char *)&buf, "started\15\12");
    sendBuf(&buf[0]);

    for (uInt i=0; i<sizeof(buf); ++i) buf[i] = 0xeb;
    float freq = 82.6046981;
    sprint_flag = 10;
    sprintf((char *)&buf, "freq1=%1.5f\15\12", freq);           // <------- тут происходит падение на HardFault
    sprint_flag = 0;
    sendBuf(&buf[0]);

    sprintf((char *)&buf, "ended\15\12");
    sendBuf(&buf[0]);


Регистры на картинке взяты из режима исключения HardFault, на котором стоит бесконечный цикл.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Mar 6 2013, 00:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Стоп, это ж M0, а он в принципе не умеет unaligned access делать.
В опциях точно M0 стоит? Если да, тогда баг однозначно.

Цитата(Xenia @ Mar 6 2013, 04:18) *
Т.е. во всех функциях sprintf в качестве 1-го аргумента следует указывать (char *)buf или (char *)&buf[0], а не (char *)&buf
А покуда это не сделано, искать какие-то иные ошибки в его коде неразумно.

В случае массива buf и &buf - это одно и то же.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Mar 6 2013, 02:36
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(aaarrr @ Mar 6 2013, 06:27) *
Стоп, это ж M0, а он в принципе не умеет unaligned access делать.

Ну а допустим это был бы СМ3 со сброшенным битом UNALIGN_TRP. Он ведь всё-равно не так сохранил бы в память как умеет х86? То бишь прога не зависла бы, но значение неправильное бы выводила? Начинаю сомневаться за свои проекты, работающие в 5.40 для СМ3.

Цитата(shreck @ Mar 6 2013, 08:33) *
Мдя.
Зачем вы вообще совета просите, если не хотите хотя бы проверить его.
Почитайте стандарт С.

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

По поводу выравнивания на 8 "внутри кода" (ака перед вызовом sprintf) - это очень непонятная мне вещь. Зачем оно? То, что внутри скрипта линкера должно быть выравнивание на 8, это есть.

Сообщение отредактировал GetSmart - Mar 6 2013, 03:37


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- GetSmart   IAR 5.40.0.51500 баг в sprintf @ lpc1114/CM0   Mar 5 2013, 23:49
- - aaarrr   Может, UNALIGN_TRP установлен?   Mar 5 2013, 23:59
- - GetSmart   Это что такое и с чем его едят? Вообще-то я ничего...   Mar 6 2013, 00:05
|- - aaarrr   Цитата(GetSmart @ Mar 6 2013, 04:05) Это ...   Mar 6 2013, 00:18
- - Xenia   Если буфер (buf) является массивом, то char-указат...   Mar 6 2013, 00:18
|- - Xenia   Цитата(aaarrr @ Mar 6 2013, 04:27) В случ...   Mar 6 2013, 00:30
|- - GetSmart   Цитата(aaarrr @ Mar 6 2013, 06:27) Стоп, ...   Mar 6 2013, 02:02
||- - shreck   Цитата(GetSmart @ Mar 6 2013, 09:02) Да, ...   Mar 6 2013, 02:33
|- - aaarrr   Цитата(GetSmart @ Mar 6 2013, 06:36) Ну а...   Mar 6 2013, 09:36
- - aaarrr   ОК, согласен. Но в данном конкретном случае это к ...   Mar 6 2013, 01:23
- - shreck   Попробуйте так: Кодsprintf((char *)buf...   Mar 6 2013, 01:43
- - shmur   А какая версия printf стоит в настройках проекта? ...   Mar 6 2013, 05:35
|- - GetSmart   Цитата(shmur @ Mar 6 2013, 11:35) Попробу...   Mar 6 2013, 12:54
- - GetSmart   Встал ещё на одну граблю ИАРа 5.50. Может кто-то н...   Jul 11 2015, 11:50


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 10:26
Рейтинг@Mail.ru


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