C ++ _get_pgmptr函数使崩溃

时间:2016-02-22 09:30:15

标签: c++

让我参考一下 https://msdn.microsoft.com/library/24awhcba(v=vs.100).aspx#Anchor_1

他们在说

  

如果成功则返回零;失败时的错误代码。如果pValue是   NULL,调用无效参数处理程序,如中所述   参数验证。 如果允许继续执行,请执行此操作   function将errno设置为EINVAL并返回EINVAL。

但是我的程序刚刚死了而不是返回errno。 有没有人知道如何让程序返回errno?

代码,

#include <stdlib.h>
char* pPath;

if( _get_pgmptr(&pPath) != 0 )
    return false;

2 个答案:

答案 0 :(得分:1)

除非我在帖子中遗漏了某些内容,否则这是一个可以更改的CRT安全功能。来自MSDN

  

大多数安全性增强的CRT功能和许多预先存在的功能验证了它们的参数。这可能包括检查指针为NULL,检查整数是否落入有效范围,或检查枚举值是否有效。找到无效参数时,将执行无效参数处理程序。

     

默认无效参数调用Watson崩溃报告,这会导致应用程序崩溃,并询问用户是否要将崩溃转储加载到Microsoft进行分析。

如果您希望在此之后继续而不是崩溃,则解决方案是使用_set_invalid_parameter_handler设置无效参数处理程序

来自MSDN的示例针对问题中的用例进行了调整:

// crt_set_invalid_parameter_handler.c
// compile with: /Zi /MTd
#include <stdio.h>
#include <stdlib.h>
#include <crtdbg.h>  // For _CrtSetReportMode
#include <errno.h>

void myInvalidParameterHandler(const wchar_t* expression,
   const wchar_t* function, 
   const wchar_t* file, 
   unsigned int line, 
   uintptr_t pReserved)
{
   // it's a good idea to keep some logging here:
   printf("Invalid parameter detected in function %s."
            L" File: %s Line: %d\n", function, file, line);
   printf("Expression: %s\n", expression);
   // no abort
}


int main()
{
   _invalid_parameter_handler oldHandler, newHandler;
   newHandler = myInvalidParameterHandler;
   oldHandler = _set_invalid_parameter_handler(newHandler);

   // Disable the message box for assertions.
   _CrtSetReportMode(_CRT_ASSERT, 0);

   _get_pgmptr(NULL);
   assert(EINVAL == errno());
   return 0;
}

但是,请记住,全局适用于您的程序中的所有参数验证,因此这可能不是一个好主意。在调用函数之前检查参数会好得多,因为这会在全局范围内保留更安全的参数验证。您可以通过这种方式获得相同的errno值:

if (pOut) 
{
    _get_pgmptr(pOut);
}
else
{
    _set_errno(EINVAL);
}

答案 1 :(得分:0)

看看这个。

https://developercommunity.visualstudio.com/content/problem/245223/-get-pgmptr-bad-value-after-windows-10-update-to-1.html

在Win10更新之后,似乎MS更改了VC运行时。 就我的情况而言,更新后, 使用VS2010 _get_pgmptr()很好。 VS2015会崩溃..

使用GetModuleFileName()代替_get_pgmptr()。