防止本地指针

时间:2012-06-09 10:46:07

标签: c pointers compiler-warnings

也许这是一个新手问题,但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;
}

如果有人知道答案,请提前致谢。

2 个答案:

答案 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),但如果您决定尝试,则可以自行处理。