我需要在源代码中找到所有这些位置,其中任何类型的指针都隐式转换为void *
或者是一种停止这些隐式转换的方法。
例如:
int *
至void *
char *
至void *
Base *
至void *
是否有 gcc 警告或错误标志,它会检测指针隐式转换为void *
的所有此类行?
答案 0 :(得分:4)
假设你有一个像
这样的简单程序#include <string.h>
int main()
{
char* apples = "apples and pears";
char fruit[1024];
void* avoid;
int aint;
float afloat;
avoid = &aint;
avoid = &afloat;
memcpy(fruit, apples, strlen(apples) + 1);
}
这是一个技巧,可以告诉你一些隐含的转换发生在哪里。在程序开头添加它
#define void double
您将收到大量编译错误:包括隐式转换发生的位置。它不会发现void * = double *所以你需要再次尝试
#define void int
发现其余部分。
答案 1 :(得分:0)
你可以试试这个:
gcc -Dvoid="struct doesnotexistanywhere" myfile.c
这会抱怨来自void*
的所有隐式转化。至少在这些情况下会出现误报:
void function( ...
int function(void) {
(void)statement;
可以使用grep
过滤掉相应的消息,或者您可以重构代码以排除这些情况。
毋庸置疑,即使编译以某种方式成功,也不应该使用生成的对象。在我的实验中,#include
stdio.h,memory.h和string.h编译得很干净,所以这确实是可行的,但标准明确禁止这个,谁知道编译器可以生成什么样的代码