mfc - 使用不受信任的格式字符串安全地调用 strftime

标签 mfc validation strftime

我们有一个 C++/MFC 应用程序,它允许用户通过配置文件自定义日期格式。不想重新发明轮子,我将格式字符串传递给 CTime::Format("< format string >") 以进行实际格式化。在幕后,Format 调用了标准 C 函数 strftime() 的变体。

自然,用户可能会意外输入无效的格式字符串。 (例如,“%s”而不是“%S”。)发生这种情况时,C 运行时调用 Invalid Argument Handler默认情况下,它会退出应用程序。 (没有异常(exception) - 只是应用程序退出。)

我的问题是如何优雅地处理这种不受信任的输入。理论上,我可以为格式字符串编写自己的解析器/验证器,但这听起来像是在浪费时间。相反,我能想到的最好方法是设置我自己的(全局)无效参数处理程序,它不会退出,而是抛出一个无效参数异常:

void MyInvalidParameterHandler(
    const wchar_t* expression,
    const wchar_t* function, 
    const wchar_t* file, 
    unsigned int line, 
    uintptr_t pReserved)
{
    ::AfxThrowInvalidArgException();
}

这似乎确实有效,并且允许我在我“期望”它们发生的情况下明确捕获(并优雅地处理)无效参数异常。但是,我担心我正在覆盖大型应用程序中的全局运行时设置以解决相对“本地”的问题——我不希望此修复程序在其他地方引起其他问题。

这种方法是否明智?或者是否有更清洁的方法来解决这个问题?

最佳答案

如果您只想在特定时间捕获此错误,您可以暂时替换无效参数处理程序,然后在调用 Format 后将其设置回原处。

_invalid_parameter_handler oldHandler = _set_invalid_parameter_handler(MyInvalidParameterHandler);

// Your try/Format/catch code here

_set_invalid_parameter_handler(oldHandler);

当然,我认为如果您的程序中有多个线程,另一个线程可能会在设置时调用无效参数处理程序。您必须确定这有多大可能。

除了编写自己的验证函数之外,我不知道你还能怎么做。

关于mfc - 使用不受信任的格式字符串安全地调用 strftime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2326532/

相关文章:

c++ - 在 PreTranslateMessage 中按 Ctrl+C 时接收 Ctrl+R 消息

java - 使用 ArrayList 验证 UserInput 不为负数

Pandas : How to get timestamp. 天和 timestamp.month 填充零

python - 如何更改 Pandas 中的日期时间格式

c++ - 在 MFC 窗体中围绕控件创建边框

c++ - MFC中m_pMainWnd改为NULL

c++ - 使用 MFC 在 2 个监视器上扩展 GUI

json - 验证异常映射器不返回 JSON 格式

jquery - ASP.NET MVC 4 中的自定义验证摘要

python-3.x - 使用 Selenium 收集的 cookie 的到期日期格式