Qual é o tipo correto a ser usado para declarar uma metavariável que possivelmente possa corresponder a variáveis ​​ou membros em uma estrutura?

StackOverflow https://stackoverflow.com/questions/2043787

  •  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?

Foi útil?

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));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top