You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Funções que alocam memória (malloc(), calloc(), strdup(), etc.) e funções de manipulação de string terminadas em nulo (printf(), sprintf(), snprintf() etc.) são muito úteis, mas bastante perigosas se usadas sem tratamentos. Por exemplo:
esse pequeno trecho de código acima pode retornar segmentation fault em três situações:
crash na linha 1., se por algum motivo a for nulo;
crash na linha 2., se ocorrer falta de memória durante a chamada a strdup() na linha 1., e memcpy tentar copiar s apontado para memória inválida;
crash na linha 3., ser por algum motivo b vir nula.
Precisamos tratar toda e qualquer função caso as standards nos peça para tomarmos cuidado. Uma maneira fácil e elegante de resolver esse problema seria criando funções próprias inline (quando possível, claro!) mapeando as originais da libc ou afins. Uma possível correção do código mostrado, seria:
if (!a)
return<avisarque"a"estánulo> ...
s=ptg_dup(a);
if (!s)
return<avisarquenãoháespaçoemmemória> ...
memcpy(b, s, sizeof(s));
if (!b)
return<avisarquenãofoipossívelcriarobuffer> ...
printf("%s", b).
...
char*ptg_dup(constchar*str) {
returnstr ? strdup(str) : strdup("");
}
onde os tratamentos comentados entre <...> seriam resolvidos conforme issue #12.
The text was updated successfully, but these errors were encountered:
Funções que alocam memória (
malloc()
,calloc()
,strdup()
, etc.) e funções de manipulação de string terminadas em nulo (printf()
,sprintf()
,snprintf()
etc.) são muito úteis, mas bastante perigosas se usadas sem tratamentos. Por exemplo:esse pequeno trecho de código acima pode retornar
segmentation fault
em três situações:1.
, se por algum motivoa
for nulo;2.
, se ocorrer falta de memória durante a chamada astrdup()
na linha1.
, ememcpy
tentar copiars
apontado para memória inválida;3.
, ser por algum motivob
vir nula.Precisamos tratar toda e qualquer função caso as standards nos peça para tomarmos cuidado. Uma maneira fácil e elegante de resolver esse problema seria criando funções próprias
inline
(quando possível, claro!) mapeando as originais da libc ou afins. Uma possível correção do código mostrado, seria:onde os tratamentos comentados entre
<...>
seriam resolvidos conforme issue #12.The text was updated successfully, but these errors were encountered: