Quindi, so che questo è stato già risposto, ma ho visto il tuo commento in risposta Pretorio:
E 'un driver bug OpenGL che si traduce nel valore di ritorno per la stringa lunghezza massima di essere rotto. Vedi https://forums.geforce.com/default/topic/531732/glgetactiveattrib-invalid/. glGetActiveAttrib non tenterà di scrivere sul puntatore restituito dalla chiamata nuova [] con l'allocazione della dimensione 0, ma la stringa non è nullo terminata. Quindi, più avanti nel codice, la stringa terminata non nulla è copiata in una std :: string per l'archiviazione, che risulta in un overflow del buffer di lettura . Molto confusionario anche a me, e sto solo controllando qui per vedere se std :: string renderebbe le cose più facili da seguire.
Uhm ... mi perdoni, ma se questo è il vostro problema, allora tutte queste soluzioni sembrano essere eccessivamente complicato.Se il problema si riduce al fatto che si ottiene uno 0 come dimensione del buffer che è necessario (il che significa che si finirà con una stringa che non è terminata con NULL, poiché non c'è spazio per il terminatore NULL) quindi semplicemente assicurarsi un terminatore NULL è sempre presente:
int arraySize;
/* assume arraySize is set to the length we need */
...
/* overallocate by 1 to add an explicit NULL terminator. Just in case. */
char *ptr = malloc(arraySize + 1);
if(ptr != NULL)
{
/* zero out the chunk of memory we got */
memset(ptr, 0, arraySize + 1);
/* call OpenGL function */
cStyleAPI(ptr, arraySize);
/* behold, even if arraySize is 0 because of OpenGL, ptr is still NULL-terminated */
assert(ptr[arraySize] == 0);
/* use it */
...
/* lose it */
free(ptr);
}
Questo sembra, per me, per essere la soluzione più sana più semplice.
fonte
2013-05-07 18:46:29
c_str() restituisce un const char * e devo essere in grado di ricevere l'output nella stringa. Va bene farlo senza usare const_cast e c_str()? – masrtis
@masrtis No, non lo è ancora, ma allora perché non usi 'char buf [BUFSIZE]'? –
@masrtis Beh, praticamente sulla maggior parte delle implementazioni ragionevoli? Sì! Ma teoricamente garantito dallo standard? Sicuramente no! –