Qual é o tipo correto a ser usado para declarar uma metavariável que possivelmente possa corresponder a variáveis ou membros em uma estrutura?
-
20-09-2019 - |
Pergunta
Qual é o tipo correto a ser usado para declarar uma metavariável que possivelmente possa corresponder a variáveis ou membros em uma estrutura?
Tomemos por exemplo o seguinte exemplo de código-fonte:
#include <stdio.h>
#include <stdlib.h>
struct some_struct {
int i;
char *s;
};
void test(void)
{
struct some_struct *ptr;
char *s;
s = malloc(100);
ptr = malloc(sizeof(struct some_struct));
ptr->s = malloc(100);
puts("done");
}
Com o seguinte patch semântico:
@@
identifier ptr;
//idexpression ptr;
//expression ptr;
expression E;
@@
ptr = malloc(E);
+if (ptr == NULL)
+ return;
o ptr->s
a alocação não é correspondida, a menos que expression ptr
é usado.Usar expression
pois isso me parece um pouco amplo demais.Isso está correto e é a única maneira de fazer isso?
Solução
Em geral, você deseja capturar qualquer ponteiro lvalue - mas como você está apenas combinando locais onde a expressão recebe um valor malloc
, uma expressão simples fará o trabalho bem (já que um não-ponteiro ou não-lvalue deve fazer o compilador reclamar).
O problema que você terá é se a expressão tiver efeitos colaterais, por exemplo:
struct some_struct *a[10];
int i = 0;
a[i++] = malloc(sizeof(struct some_struct));