5

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

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

4

2 回答 2

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))

有一个分配标头,以间隙结尾,因此指针之前出现 0xFDFDFDFD 的可能性不大 - 不完美,但可能会有所帮助......

if (\*((int\*)pointer-1) == 0xFDFDFD) { // stack pointer }
于 2012-09-10T10:41:42.377 回答
0

不,没有可靠且可移植的方法来区分指向本地的指针和指向堆对象的指针。也没有办法以声明方式阻止这种情况。

有一些依赖于特定系统的内存布局的技巧,它们在运行时通过调用未指定的行为来工作(请参阅此答案以获取示例),但是如果您决定尝试它们,您就得靠自己了。

于 2012-06-09T10:54:07.810 回答