gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:44:25 27 4
gpt4 key购买 nike

我们有一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com