Const char* - diversi comportamenti su Arduino e Esp32

Buona sera,
mi accade una cosa bizzarra. Lo stesso codice viene compilato correttamente su Arduino, mentre su Esp 32 non viene compilato con tanto di errore. Il codice riguarda la const char*.
Qualcuno saprebbe spiegarmi il motivo?
ecco un esempio:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  const char* cp = {"char pointer"};
  myfunction(cp);
}

void loop() {
  // put your main code here, to run repeatedly:

}

void myfunction(char* pointer){
  Serial.println(pointer);
}

E' vero che la scrittura non e' corretta, la funzione myfunction dovrebbe essere myfunction( const char*) ... pero' su arduino uno viene compiato senza errori.

E che errore ti dà?

invalid conversion from 'const char*' to 'char*' [-fpermissive]

L'errore e corretto, quello che non e' corretto e' che su arduino compila e funziona

anche selezionando arduino uno si ha un errore...solo che non è bloccante.

Quindi sulla uno è un warning
Su esp un errore

Tra le due cambia un fracco la toolchain, temo

sulla uno nemmeno warning

ho fatto una ricerca, e ho trovato una discussione su github riguardo alla flag permissive, pare che sul core avr, per i puntatori, la permissive sia stata diabilitata per poter far funzionare librerie non scritte bene (sara' vero?). Pero' e' vero che nella funzione ricevente (sulla uno) posso tranquillamente variare una char che era const, e questo secondo me non dovrebbe accadere

cos'hai impostato come livello di segnalazioni ?
se metto "nessuno" si comporta come dici tu...se già metto "pochi" anche la UNO mi da un warning per il const char*.

Buon giorno,
si e' vero anche a me, prima non avevo impostato i warnings. Comunque non e' un comportamento giusto.

@max_1312: che versione del "core" Arduino per ESP32 stai utilizzando? (se vai nel board manager e guardi cosa hai installato per ESP32 ti da la versione).

Guglielmo

ciao Guglielmo, avevo fatto l'aggiornamento alla 3.x se non sbaglio 3.3. Ma il problema non riguarda il core esp 32, tant'e' che lo stesso errore esce su wokwy, ed e' giusto che sia segnalato l'errore. Il problema e che non esce lo stesso errore sul core arduino. Questo avviene su tutti i puntatori nn solo sui char*. In pratica la toolchain di arduino permette di convertire una const in variabile. Non sarebbe un grosso problema se non ci fosse l'ottimizzazione del compilatore che non assegna una nuova posizione se esiste un puntatore con lo stesso valore, quindi cambiando il valore di una const si rischia di cambiare anche il valore di tutti gli altri.
Mi sono accorto di questo mentre stavo programmando una libreria per gestire menu a scorrimento su un display 3.5" dove uso degli array di puntatori anche molto grandi.
Ho letto su github che questo sembra essere dovuto alla flag -fpermissive che di fatto declassa l'errore a warning per mantenere la compatibilita' con alcune vecchie librerie.
Non mi sembra una valida ragione. Sarebbe opportuno inserire l'opzione -Fpermissive nelle impostazioni dell'Ide.

Nel file platform.txt c'è questo:

compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto

Dovrebbe bastare rimuovere -fpermissive

Ciao.

Grazie mille, ora provo per vedere se funziona... sperando che non ci siano aggiornamenti in futuro.