IsBadStringPtr alternative

IsBadStringPtr alternative

本文关键字:alternative IsBadStringPtr      更新时间:2023-10-16

我继承了使用函数

的代码
#define CHECK_CSTRING_PTR(a,b)          (!IsBadStringPtrA(a,b))
#define INTERNAL_CHECK_CSTRING_PTR(a)   CHECK_CSTRING_PTR(a,1)
TCHAR CopyString (const TCHAR * szCopyMe )
{
    char * szResult = NULL;
    size_t tLength = 0;
    /*check the string pointer*/
    if ( INTERNAL_CHECK_TSTRING_PTR ( szCopyMe ) )
    {
        //blah blah
    }
 }

我在这里读到http://msdn.microsoft.com/en-us/library/windows/desktop/aa366714(v=vs.85).aspx, IsBadStringPtr不应该再使用了。

我应该使用什么替代方案?

我可以简单地使用?

if( szCopyMe != NULL )

谢谢。

正如他们所说,您无法验证指针。在这种情况下,您有两个选项来处理坏指针:

1。让坏指针使程序崩溃

这是Raymond Chen在MSDN博客文章末尾推荐的解决方案:

IsBadXxxPtr应该叫做crashprogramrandom

在这种情况下,你的修复是正确的。

2。使用SEH

捕获异常

如果你不想停止应用程序,结构化异常处理可以防止崩溃,但根据一些,这不是一个好主意:

结构化异常处理被认为有害。

没有什么是你可以真正使用的,没有同样的问题。

IsBadStringPtr的问题是,它通过扫描内存并查看是否有东西损坏来工作。但是,解引用随机指针虽然对操作系统是安全的,但对您的进程可能非常不安全,因为它可以解除对保护页面的保护。即使指针是"有效的",也不能保证它指向的数据是字符串,更不用说你期望的字符串了。除此之外,还有潜在的竞争条件。

如果一个字符串指针被解引用,并且指向无效的内存,你的程序应该崩溃,因为你知道有一个问题,可以修复它。如果你设置了一种情况,你不确定你的字符串指针是否是"真实的",那么你已经输了。你的操作系统会保护一个程序不受另一个程序的侵害,但它不会保护一个程序不受自己的侵害。您需要通过程序的设计来构建这种安全性。