也许这是一个新手问题,但C / C ++中是否有一种方法可以防止函数接受指向局部变量的指针?
考虑以下代码:
int* fun(void)
{
int a;
return &a;
}
编译器将生成一个警告,指出无法返回指针。现在考虑一下:
int* g;
void save(int* a)
{
g = a;
}
void bad(void)
{
int a;
save(&a);
}
这会在没有警告的情况下通过编译器,这很糟糕。是否有某种属性或某些东西可以防止这种情况发生?即类似的东西:
void save(int __this_pointer_must_not_be_local__ * a)
{
g = a;
}
如果有人知道答案,请提前致谢。
答案 0 :(得分:2)
使用调试堆至少有一种调试构建方法(默认):
//d:\Program Files\Microsoft Visual Studio ?\VC\crt\src\dbgint.h
\#define nNoMansLandSize 4
typedef struct _CrtMemBlockHeader
{
struct _CrtMemBlockHeader * pBlockHeaderNext;
struct _CrtMemBlockHeader * pBlockHeaderPrev;
char * szFileName;
int nLine;
size_t nDataSize;
int nBlockUse;
long lRequest;
unsigned char gap[nNoMansLandSize];
/* followed by:
* unsigned char data[nDataSize];
* unsigned char anotherGap[nNoMansLandSize];
*/
} _CrtMemBlockHeader;
\#define pbData(pblock) ((unsigned char *)((_CrtMemBlockHeader *)pblock + 1))
有一个分配标题,以gap结尾,所以在指针之前没有很大的概率会有0xFDFDFDFD - 不完美,但可能有帮助...
if (\*((int\*)pointer-1) == 0xFDFDFD) { // stack pointer }
答案 1 :(得分:0)
不,没有可靠且可移植的方法来告诉指向堆对象的指针。也无法以声明的方式阻止这种情况。
有些黑客依赖于您的特定系统的内存布局,它们通过调用未指定的行为在运行时工作(例如,请参阅this answer),但如果您决定尝试,则可以自行处理。