我分析了一些用C语言编写的源代码,找到了以下代码片段:
#include <stdio.h>
struct base_args_t {
int a0;
};
struct int_args_t {
struct base_args_t base;
int a1;
};
struct uint_args_t {
struct base_args_t base;
unsigned int a1;
};
void print_int(struct int_args_t *a)
{
// print int
printf("%i\n", a->a1);
return;
}
void print_uint(struct uint_args_t *a)
{
// print unsigned int
printf("%u\n", a->a1);
return;
}
int main()
{
struct uint_args_t uint_args = {.a1 = 7};
typedef void (*f_print_type)(struct int_args_t *);
void (*print)(struct int_args_t *a) = (f_print_type)print_uint;
print((void *)&uint_args);
return 0;
}
我想知道是否可以将函数转换为各种类型的函数指针,就像在以下示例中所做的那样:
void (*print)(struct int_args_t *a) = (f_print_type)print_uint;
另外,我已测试启用CFI污点分析器的示例,它显示:
运行时错误:在间接函数调用期间,类型为“void(struct int_args_t *)”的控制流完整性检查失败
但很难说是否正确无误。
C
实现任何东西都不是非法的。C
是否具有特定的功能或能力作为自然属性是另一个问题。 - ryyker