Bug 22601

Summary: Нет предупреждений о записи в программную память
Product: Sisyphus Reporter: Dmitry A. Kharitonov <kharpost>
Component: avr-gccAssignee: Grigory Milev <week>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: erthad, kharpost, viy, week
Version: unstable   
Hardware: all   
OS: Linux   

Description Dmitry A. Kharitonov 2009-12-22 17:41:49 MSK
1  #include <avr/io.h>
     2  #include <avr/pgmspace.h>
     3
     4  int main() {
     5      prog_uint8_t p=44,t;      // ошибка пропущен обязательный модификатор static
     6      t=pgm_read_byte_near(&p); // будет прочитан не p
     7  }

В строке 5 переменные должны располагаться в программной памяти, но всё совсем криво и никаких ошибок или предупреждений не возникает.
Компилятор резервирует место в программной памяти, но значения туда не помещает. Значения туда копируются на этапе инициализации переменных, но тк программная память доступна только для чтения, данные в эту область фактически не копируются и там оказываются случайные данные.
В строке 6 происходит копирование данных в переменную, которая расположена в программной памяти, а фактически происходит копирование в озу, по тому же адресу, где в это время расположена совсем другая переменная.

При этом нет даже предупреждений (хотя бы о мнимом преобразовании типов).
Comment 1 Grigory Milev 2009-12-23 11:29:51 MSK
А какие варианты фикса имеются? Я не gcc писатель, если имеются готовые решения, я с радостью приложу патчик к пакету :)
Comment 2 Dmitry A. Kharitonov 2009-12-23 13:07:24 MSK
я, честно говоря, даже не в курсе где их искать, вернее не понятно по каким ключевым словам.
В первом приближении достаточно в <avr/pgmspace.h> во все типы программной памяти добавить модификатор static.
const добавлять не стоит (хотя очень хочется для строчки 6) -- будут проблемы с указателями и ссылками.

PS.: На днях сделаю тест для баги с обработкой логических операций в операторе if, надо только вспомнить в каком месте я с ним боролся.
Comment 3 Grigory Milev 2011-01-18 12:48:09 MSK
Если правки относятся к avr/pgmspace.h, то багу стоит перенести на avr-libc + проверить с последней сборкой avr-libc!
Comment 4 Grigory Milev 2011-03-09 15:08:19 MSK
Не воспроизводится с:
avr-gcc-4.5.1-alt2
avr-libc-1.7.0-alt2