Atlantis
Guest
Sun Jul 23, 2017 4:42 pm
Do tej pory we wszystkich moich projektach, zgodnie z zalecaną praktyką
stosowałem funkcję snprintf() zamiast sprintf(), aby uniknąć możliwości
przepełnienia bufora. Podobnie z innymi funkcjami z stdio.h i string.h,
które posiadają taki odpowiednik.
Jednak z tego co widzę, to w przypadku SDK do ESP8266 nie jest to takie
proste. Wśród bibliotek udostępnionych przez producenta znajdują się
osobne funkcje do manipulowana łańcuchami tekstowymi, z prefiksem "os_".
Zamiast sprintf() należy więc używać os_sprintf. Problem w tym, że w
zestawie nie ma funkcji sprawdzających wielkość bufora.
Teoretycznie można w projekcie wykorzystać standardowe biblioteki
"stdio.h" albo "string.h", jednak z tego co wyczytałem nie jest to
zalecane i wynika to ze specyfiki sprzętu (coś z wyrównywaniem pamięci).
Kod się skompiluje i może działać, ale wcale nie musi i nie ma
gwarancji, że w pewnym momencie się z tego powodu nie wysypie.
Stąd mam kilka pytań do osób trochę lepiej obeznanych z tą platformą:
1) Czy Arduino Core dla ESP8266 też jest dotknięte tą przypadłością?
Jest ono zaledwie nakładką na oficjalne SDK, czy też ktoś przeportował
standardowe biblioteki uwzględniając tę kwestię i można bezpiecznie
używać snprintf()?
Niby nie przepadam szczególnie za Arduino, ale to byłoby jakimś
argumentem...
2) Czy istnieje jakiś prosty sposób na uniknięcie tego problemu, przy
jednoczesnym korzystaniu z os_sprintf()? Czy też jedynym wyjściem jest
wcześniejsze sprawdzanie długości wszystkich elementów składowych,
wpisywanych?
slawek
Guest
Mon Jul 24, 2017 7:07 am
On Sun, 23 Jul 2017 18:42:29 +0200, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
stosowałem funkcję snprintf() zamiast sprintf()
AFAIK snprintf nie jest w standardzie. Podobnie jak printf_s itp.
I o jakim przepełnieniu mowa? Przecież liczba znaków dla %f itd. jest
zawsze znana compile time, a dla %s nikt ci nie zabrania użyć strlen,
sizeof itp. Zawsze możesz zapodać szerokość, np. %10s. Albo obciąć
ilość znaków w łańcuchu zanim pójdzie do printf.
Marek
Guest
Mon Jul 24, 2017 9:49 am
On Sun, 23 Jul 2017 18:42:29 +0200, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
Teoretycznie można w projekcie wykorzystać standardowe biblioteki
"stdio.h" albo "string.h", jednak z tego co wyczytałem nie jest to
zalecane i wynika to ze specyfiki sprzętu (coś z wyrównywaniem
pamięci).
A tego to nie rozumiem, kompilator pod tą platformę nie umie sobie
poradzić z wyrównaniem??
--
Marek
Atlantis
Guest
Mon Jul 24, 2017 12:08 pm
On 24.07.2017 11:49, Marek wrote:
Quote:
A tego to nie rozumiem, kompilator pod tą platformę nie umie sobie
poradzić z wyrównaniem??
Nie znam szczegółów, ale chodzi o jakąś specyfikę sprzętu. Z tego samego
powodu nie zaleca się stosowania standardowych funkcji malloc()/free().
Zamiast tego biblioteki od producenta udostępniają os_malloc()/os_free().
J.F.
Guest
Mon Jul 24, 2017 12:58 pm
Użytkownik "Atlantis" napisał w wiadomości grup
dyskusyjnych:5975e339$0$663$65785112@news.neostrada.pl...
On 24.07.2017 11:49, Marek wrote:
Quote:
A tego to nie rozumiem, kompilator pod tą platformę nie umie sobie
poradzić z wyrównaniem??
Nie znam szczegółów, ale chodzi o jakąś specyfikę sprzętu. Z tego
samego
powodu nie zaleca się stosowania standardowych funkcji
malloc()/free().
Zamiast tego biblioteki od producenta udostępniają
os_malloc()/os_free().
zaraz ... a mowisz o kompilatorze dla Arduino, do ktorego tenze ESP
jest podlaczony laczem szeregowym,
czy kompilatorze na wewnetrzny procesor w tymze ESP ?
J.
Jakub Rakus
Guest
Mon Jul 24, 2017 5:24 pm
W dniu 23.07.2017 o 18:42, Atlantis pisze:
Quote:
Jednak z tego co widzę, to w przypadku SDK do ESP8266 nie jest to takie
proste. Wśród bibliotek udostępnionych przez producenta znajdują się
osobne funkcje do manipulowana łańcuchami tekstowymi, z prefiksem "os_".
Zamiast sprintf() należy więc używać os_sprintf. Problem w tym, że w
zestawie nie ma funkcji sprawdzających wielkość bufora.
A nie lepiej (i wydajniej) będzie dodać sobie biblioteczkę z takowymi
funkcjami:
https://github.com/cjlano/tinyprintf
Używam tego na STM32. Działa.
--
Pozdrawiam
Jakub Rakus
wĂłĹ, wóŠroboczy, wĂł
Guest
Mon Jul 24, 2017 6:13 pm
przepraszam, że tak debilnie zapytam: czy wy konstruujecie samoloty?
slawek
Guest
Tue Jul 25, 2017 5:38 am
On Mon, 24 Jul 2017 20:13:25 +0200, wół, wół roboczy, wół dojno
roboczo obronny 'POPIS/EU<NOSPAMtestowanije@go2.pl> wrote:
Quote:
przepraszam, że tak debilnie zapytam: czy wy konstruujecie samoloty?
Nie wiem co konstruują.
Ale wiem że nie potrafią przeczytać dokumentacji.
Atlantis
Guest
Tue Jul 25, 2017 10:59 am
On 24.07.2017 14:58, J.F. wrote:
Quote:
zaraz ... a mowisz o kompilatorze dla Arduino, do ktorego tenze ESP jest
podlaczony laczem szeregowym,
czy kompilatorze na wewnetrzny procesor w tymze ESP ?
Oczywiście, że mówię o kompilatorze na wewnętrzny procesor ESP. Kto
normalny używałby jeszcze dzisiaj tych modułów w roli dodatku do AVR-a,
sterując nimi przez komendy AT? ;)
Po prostu jakiś czas temu wypuszczony został dodatek do Arduino IDE,
umożliwiający programowanie ESP w tym środowisku. Z tego co mi wiadomo,
opiera się on na SDK od producenta z pewnymi zmianami. Nie wiem jednak
jak daleko posunięte są te zmiany i czy w związku z nimi można
bezpiecznie używać stdio.h.
Guest
Tue Jul 25, 2017 1:03 pm
W dniu wtorek, 25 lipca 2017 12:59:06 UTC+2 użytkownik Atlantis napisał:
Quote:
On 24.07.2017 14:58, J.F. wrote:
zaraz ... a mowisz o kompilatorze dla Arduino, do ktorego tenze ESP jest
podlaczony laczem szeregowym,
czy kompilatorze na wewnetrzny procesor w tymze ESP ?
Oczywiście, że mówię o kompilatorze na wewnętrzny procesor ESP. Kto
normalny używałby jeszcze dzisiaj tych modułów w roli dodatku do AVR-a,
sterując nimi przez komendy AT? ;)
Po prostu jakiś czas temu wypuszczony został dodatek do Arduino IDE,
umożliwiający programowanie ESP w tym środowisku. Z tego co mi wiadomo,
opiera się on na SDK od producenta z pewnymi zmianami. Nie wiem jednak
jak daleko posunięte są te zmiany i czy w związku z nimi można
bezpiecznie używać stdio.h.
Tez wlasnie zaczalem z tego korzystac. Ale za mało dłubałem aby ci cokolwiek wyjaśnić.
Ja narazie korzystam ze zwyklych stdio i o ile sam sobie pilnuje aby odpowiednio zaznaczac końce stringów i nie wychodzić poza zakres to jakoś mi tam programy dzialaja...
wĂłĹ, wóŠroboczy, wĂł
Guest
Tue Jul 25, 2017 3:26 pm
taaaak? a to ciekawe, to jest opisane gdzieś?
P.S.
jak i z kogo wycisnąć opis (iwpriv) sdk do rtl8186/1?