Com uma estrutura como a seguinte
typedef struct
{
size_t StringLength;
char String[1];
} mySTRING;
e uso desta estrutura ao longo destas linhas
mySTRING * CreateString(char * Input)
{
size_t Len = strlen(Input);
int Needed = sizeof(mySTRING) + Len;
mySTRING * pString = malloc(Needed);
:
strcpy(pString->String, Input);
}
resultados, no compilador Red Hat Linux cc, no aviso a seguir, o que é justo.
strings.c:59:3: warning: âstrcpyâ writing 14 bytes into a region of size 1 overflows the destination [-Wstringop-overflow=]
strcpy(pString->String, Input);
Eu sei que, nesta instância do código, este aviso é algo que não preciso corrigir. Como posso dizer isso ao compilador sem desligar esses avisos que podem encontrar algo útil, em algum outro lugar, no futuro.
Que alterações posso fazer no código para mostrar ao compilador que isso está correto?
Você está usando o que é comumente chamado de "struct hack" para ter um array no final do struct com um tamanho variável. Esse método sempre foi duvidoso no que diz respeito ao padrão C.
A maneira correta de fazer isso, a partir do padrão C99, é com um membro de matriz flexível , o que deixa o tamanho da matriz não especificado:
Você também precisará adicionar 1 ao tamanho alocado, pois
sizeof(mySTRING)
não inclui oString
membro e você precisa de espaço para o byte de terminação nulo.Isso torna o restante do seu código compatível com o padrão C.