使用 ENSURE 避免代码分析警告的最佳替代方法是什么?

What is the best alternative to using ENSURE to avoid code analysis warnings?

示例:

ENSURE(strTitle.LoadString(AFX_IDS_APP_TITLE));
ENSURE(strMainInstruction.LoadString(IDS_STR_SUBMIT_STATS_MAIN_TEXT));
ENSURE(strContent.LoadString(IDS_STR_SUBMIT_STATS_CONTENT_TEXT));
ENSURE(strAdditional.LoadString(IDS_STR_SUBMIT_STATS_ADDITIONAL_TEXT));
ENSURE(strFooter.LoadString(IDS_STR_TASK_DIALOG_FOOTER));
ENSURE(strVerification.LoadString(IDS_STR_SUBMIT_STATS_VERIFICATION_TEXT));
ENSURE(strExpand.LoadString(IDS_STR_FIND_OUT_MORE));
ENSURE(strCollapse.LoadString(IDS_STR_COLLAPSE));

定义:

#define ENSURE(cond) ENSURE_THROW(cond, ::AfxThrowInvalidArgException() )

这是一个 Microsoft 宏,虽然我看不到它的文档。当我注意到它在 Microsoft SDK 代码中使用时,我就开始使用它。恼人的是它触发了代码分析:

Warning C26496: The variable '__afx_condVal' does not change after construction, mark it as const (con.4).

我确实用 Microsoft 提出了它。底层宏 ENSURE_THROW:

#define ENSURE_THROW(cond, exception)   \
    do { int __afx_condVal=!!(cond); ASSERT(__afx_condVal); if (!(__afx_condVal)){exception;} } __pragma(warning(suppress:4127)) while (false)

...只需要const这个词就可以解决


有没有我可以做的替代调用,因为我知道 ASSERT 只适用于 DEBUG 构建。

您可以重新定义 ENSURE_THROW 并将其放入您的 stdafx.h:

#undef ENSURE_THROW
#define ENSURE_THROW(cond, exception)   \
    do { const int __afx_condVal=!!(cond); ASSERT(__afx_condVal); \
    if (!(__afx_condVal)){exception;} } while (false)

它与 afx.h 中的原始 MS 定义相同,但添加了 const

这可能会在 MFC 的未来版本中中断,尽管 MS 不太可能更改它。

更简洁的方法是从分析中排除某些头文件,但这取决于您的工具。

请注意 ENSUREASSERT 是非常不同的东西:

  • ASSERT(x) :在调试版本中,如果 x 为假,它将停止程序执行并显示一条消息,在发布版本中,它是一个 NOP,甚至不会评估 x
  • ENSURE(x) : x 将被评估,如果它为假,将抛出异常。在调试版本中,在抛出异常之前会显示一个诊断对话框。