用于宣布可以匹配变量或结构中成员的METAVAR的正确类型是什么?
-
20-09-2019 - |
题
用于宣布可以匹配变量或结构中成员的METAVAR的正确类型是什么?
以以下示例源代码:
#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");
}
以下 语义补丁:
@@
identifier ptr;
//idexpression ptr;
//expression ptr;
expression E;
@@
ptr = malloc(E);
+if (ptr == NULL)
+ return;
这 ptr->s
除非分配不匹配,除非 expression ptr
用来。使用 expression
因为这对我来说似乎太广泛了。这是正确的,也是唯一的方法?
解决方案
通常,您想捕获任何LVALUE指针 - 但是,由于您只是匹配表达式分配值的位置 malloc
, ,平淡的表达方式将使工作罚款(因为非计算机或非价值应使编译器抱怨)。
您要遇到的问题是表达式是否具有副作用,例如:
struct some_struct *a[10];
int i = 0;
a[i++] = malloc(sizeof(struct some_struct));
不隶属于 StackOverflow