[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[avr-libc-dev] [bug #28058] parameter checking in pgm_read_xxx()
From: |
Jan Waclawek |
Subject: |
[avr-libc-dev] [bug #28058] parameter checking in pgm_read_xxx() |
Date: |
Fri, 20 Nov 2009 10:32:07 +0000 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729) |
URL:
<http://savannah.nongnu.org/bugs/?28058>
Summary: parameter checking in pgm_read_xxx()
Project: AVR C Runtime Library
Submitted by: wek
Submitted on: Fri 20 Nov 2009 10:32:06 AM GMT
Category: Feature Request
Severity: 3 - Normal
Priority: 5 - Normal
Item Group: Header files
Status: None
Percent Complete: 0%
Assigned to: None
Open/Closed: Open
Discussion Lock: Any
Release: Any
Fixed Release: None
_______________________________________________________
Details:
The pgm_read_xxx() functions in <avr/pgmspace.h> are currently implemented as
macros, casting the parameter to (uint16_t).
While the parameter is supposed to be a pointer, this enables to use any
garbage (read: non-pointer expression used by error) quietly.
Opposed to this are the similar accessing functions in eeprom.h.
It is therefore suggested, that these macros to be replaced by the following
constructions:
// #define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
__attribute__((__always_inline__)) static uint8_t pgm_read_byte(const PROGMEM
uint8_t *);
static uint8_t pgm_read_byte(const PROGMEM uint8_t *addr) {
return __LPM((uint16_t)(addr));
}
// #define pgm_read_word(address_short) pgm_read_word_near(address_short)
__attribute__((__always_inline__)) static uint16_t pgm_read_word(const
PROGMEM uint16_t *);
static uint16_t pgm_read_word(const PROGMEM uint16_t *addr) {
return __LPM_word((uint16_t)(addr));
}
// #define pgm_read_dword(address_short)
pgm_read_dword_near(address_short)
__attribute__((__always_inline__)) static uint32_t pgm_read_dword(const
PROGMEM uint32_t *);
static uint32_t pgm_read_dword(const PROGMEM uint32_t *addr) {
return __LPM_dword((uint16_t)(addr));
}
I am not expert enough to judge whether the functions may be tagged also with
the __pure__ attribute.
A discussion on the topic is on
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=85490 .
Jan Waclawek
_______________________________________________________
Reply to this item at:
<http://savannah.nongnu.org/bugs/?28058>
_______________________________________________
Message sent via/by Savannah
http://savannah.nongnu.org/
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [avr-libc-dev] [bug #28058] parameter checking in pgm_read_xxx(),
Jan Waclawek <=