Warning pointer targets in passing argument 2 of 'strlcpy' differ in signedness

Tu możesz pisać o swoich problemach z pisaniem programów w języku C/C++ dla STM.
Awatar użytkownika
GrumpyRez
User
User
Posty: 224
Rejestracja: poniedziałek 04 cze 2018, 09:19

Warning pointer targets in passing argument 2 of 'strlcpy' differ in signedness

Postautor: GrumpyRez » piątek 10 gru 2021, 08:54

Mam Warning
pointer targets in passing argument 2 of 'strlcpy' differ in signedness [-Wpointer-sign]

W

Kod: Zaznacz cały

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
   extern uint8_t USBReceivedDataFlag; // Flaga informujaca o odebraniu danych
   extern uint8_t USBDataRX[50];       // Tablica przechowujaca odebrane dane

   USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
   USBD_CDC_ReceivePacket(&hUsbDeviceFS);

     // Wyczyszczenie tablicy odebranych danych
     uint8_t iter;
     for(iter = 0; iter<50; ++iter){
        USBDataRX[iter] = 0;
     }

=> tu  strlcpy(USBDataRX, Buf, (*Len) + 1); // Przekopiowanie danych do naszej tablicy
     USBReceivedDataFlag = 1; // Ustawienie flagi odebrania danych

   return (USBD_OK);
  /* USER CODE END 6 */
}


Nie do końca rozumiem przyczyny tego stanu.

Awatar użytkownika
GrumpyRez
User
User
Posty: 224
Rejestracja: poniedziałek 04 cze 2018, 09:19

Re: Warning pointer targets in passing argument 2 of 'strlcpy' differ in signedness

Postautor: GrumpyRez » piątek 10 gru 2021, 10:19

Nie wiem, czy to nie jest spowodowane tą sumą +1 w wskaźniku :/

Awatar użytkownika
xor
User
User
Posty: 169
Rejestracja: poniedziałek 05 wrz 2016, 21:44

Re: Warning pointer targets in passing argument 2 of 'strlcpy' differ in signedness

Postautor: xor » piątek 10 gru 2021, 20:34

Komunikat dotyczy zmiennej Buf. strlcpy oczekuje typu char* a otrzymuje uint8_t* który jest typedefem do unsigned char*.
Strlcpy wymaga by string źródłowy był C-stringiem a zawartość Buf przekazywana do CDC_Receive_FS nim nie jest więc ta funkcja się nie nadaje.

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: Warning pointer targets in passing argument 2 of 'strlcpy' differ in signedness

Postautor: gaweł » sobota 11 gru 2021, 13:05

Jak zauważył XOR wyżej, zachodzi tu konflikt typów. Jednak na każdą "koncepcję" kompilatora można znaleźć "anykoncepcję" programisty.
Dla człowieka ciąg znaków jest ciągiem bajtów i h...teczka go obchodzi, czy te bajty mają znak czy nie (w sensie liczb w kodzie U2). Po prostu znak jest znakiem i kropka. Ja osobiście używam znaków jako uint_8, bo to rodzi mniej problemów. Jeżeli znaki są jako int8_t to są problemy w ich komparacji. Przykładowo znaki o kodach >= 128, są zawsze mniejsze od normalnych znaków ASCII (bo liczba ujemna jest zawsze mniejsza od dodatniej → ot taki mały paradoks). Jednak kompilery się czepiają, że przetwarzasz ciągi bajtów ze znakiem czy bez znaku. By wszyscy byli "szczęśliwi" możesz zrobić rzutowanie typu i napisać:

Kod: Zaznacz cały

  strlcpy(USBDataRX, (int8_t *)Buf, (*Len) + 1); // Przekopiowanie danych do naszej tablicy

Buf jest obszarem określonym jako uint8_t *, skoro kompiler chce, by to było jako int8_t * to napisz swoje życzenie wyraźnie. Wtedy kompiler nie ma nic do powiedzenia i zrobi jak ty chcesz (wie, że robisz to świadomie).

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
GrumpyRez
User
User
Posty: 224
Rejestracja: poniedziałek 04 cze 2018, 09:19

Re: Warning pointer targets in passing argument 2 of 'strlcpy' differ in signedness

Postautor: GrumpyRez » sobota 11 gru 2021, 15:49

gaweł pisze:Jak zauważył XOR wyżej, zachodzi tu konflikt typów. Jednak na każdą "koncepcję" kompilatora można znaleźć "anykoncepcję" programisty.
Dla człowieka ciąg znaków jest ciągiem bajtów i h...teczka go obchodzi, czy te bajty mają znak czy nie (w sensie liczb w kodzie U2). Po prostu znak jest znakiem i kropka. Ja osobiście używam znaków jako uint_8, bo to rodzi mniej problemów. Jeżeli znaki są jako int8_t to są problemy w ich komparacji. Przykładowo znaki o kodach >= 128, są zawsze mniejsze od normalnych znaków ASCII (bo liczba ujemna jest zawsze mniejsza od dodatniej → ot taki mały paradoks). Jednak kompilery się czepiają, że przetwarzasz ciągi bajtów ze znakiem czy bez znaku. By wszyscy byli "szczęśliwi" możesz zrobić rzutowanie typu i napisać:

Kod: Zaznacz cały

  strlcpy(USBDataRX, (int8_t *)Buf, (*Len) + 1); // Przekopiowanie danych do naszej tablicy

Buf jest obszarem określonym jako uint8_t *, skoro kompiler chce, by to było jako int8_t * to napisz swoje życzenie wyraźnie. Wtedy kompiler nie ma nic do powiedzenia i zrobi jak ty chcesz (wie, że robisz to świadomie).


Niestety to nic nie zmienia, wręcz pojawiają się kolejne warningi ;)


xor pisze:Komunikat dotyczy zmiennej Buf. strlcpy oczekuje typu char* a otrzymuje uint8_t* który jest typedefem do unsigned char*.
Strlcpy wymaga by string źródłowy był C-stringiem a zawartość Buf przekazywana do CDC_Receive_FS nim nie jest więc ta funkcja się nie nadaje.


Czym zastąpić tą funkcję?


PS. zastąpienie memcpy rozwiązało problem

Kod: Zaznacz cały

memcpy(USBDataRX, Buf, (*Len) + 1);

Awatar użytkownika
j23
Expert
Expert
Posty: 506
Rejestracja: czwartek 08 paź 2015, 18:40

Re: Warning pointer targets in passing argument 2 of 'strlcpy' differ in signedness

Postautor: j23 » niedziela 12 gru 2021, 20:23

0, 1, 2... A czy przypadkiem nie chodzi o to, że wskaźnik na Len ląduje "w krzakach"? tzn.że numerując argumenty kompilator zaczyna od zera...
Internet łączy ludzi, którzy dzielą się swoimi zainteresowaniami, pomysłami i potrzebami, bez względu na geograficzne (przeciwności).
BOB TAYLOR, PARC


Wróć do „Programowanie STM w C/C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości