警告 C26863
忽略日期时间处理函数
func
的返回值
此规则是在 Visual Studio 2022 17.8 中添加的。
注解
如果在未正确处理闰年的情况下操作年份、月份或日期输入参数,请务必验证用于转换日期结构的函数的返回值。 否则,该函数可能已失败,并且会使用包含无效数据的输出参数继续执行。
下面是此警告涵盖的函数的列表:
FileTimeToSystemTime
SystemTimeToFileTime
SystemTimeToTzSpecificLocalTime
SystemTimeToTzSpecificLocalTimeEx
TzSpecificLocalTimeToSystemTime
TzSpecificLocalTimeToSystemTimeEx
RtlLocalTimeToSystemTime
RtlTimeToSecondsSince1970
代码分析名称:DATETIME_MANIPULATION_FUNCTION_RETURN_IGNORED
示例
以下代码会尝试获取当前系统时间,将月份字段提前一个月,并通过 SystemTimeToFileTime
获取与更新后的系统时间相对应的文件时间。 但 SystemTimeToFileTime
可能会失败,因为更新后的系统时间可能变得无效:
#include <Windows.h>
void foo()
{
FILETIME ft;
SYSTEMTIME st;
GetSystemTime(&st);
st.wMonth++; // Advance month by one
// Get the file time
SystemTimeToFileTime(&st, &ft); // C26863
}
要解决此问题,请始终检查日期时间操作函数的返回值并正确处理失败:
#include <Windows.h>
void foo()
{
FILETIME ft;
SYSTEMTIME st;
GetSystemTime(&st);
st.wMonth++; // Advance month by one
// Get file time
if (SystemTimeToFileTime(&st, &ft))
{
// Use file time
}
}
启发
此规则仅识别 Windows SYSTEMTIME
结构和 C tm
结构。
无论在调用这些函数之前是否验证了输入参数,都会强制实施此规则。 如果在调用函数之前验证了所有输入参数,则此规则可以报告 false 警告。
此规则属于选择加入规则,这意味着代码分析应使用规则集文件,并且规则应显式包含在规则集文件中,并应为其启用以便应用。 有关为代码分析创建自定义规则集的详细信息,请参阅使用规则集指定要运行的 C++
规则。