这个日志功能有什么不安全的地方吗?

问题描述 投票:0回答:1
void add_log(const char* format, ...)
{
    HANDLE filehandle;
    DWORD dwReadBytes;
    char buffer[2048];
    char writebuffer[2048];
    va_list args;
    va_start(args, format);
    vsprintf_s(buffer, format, args);
    filehandle = CreateFile("C:\\Log.txt", GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
    SetFilePointer(filehandle, 0, 0, FILE_END);
    time_t ltime;
    ltime = time(NULL);
    //sprintf_s(writebuffer, 2048, "%s: %s\n", asctime(localtime(&ltime)), buffer);
    sprintf_s(writebuffer, 2048, "%s", buffer);
    WriteFile(filehandle, writebuffer, strlen(writebuffer), &dwReadBytes, 0);
    CloseHandle(filehandle);
}

我有一个朋友介绍了这段代码,我已经在多个版本中使用了它。我主要用它来调试某些函数,但开始将它用作内部记录某些内容的常规方式,但我觉得它在某些情况下会导致问题,例如当我在经常调用的线程或函数中使用它们时。这个功能的工作原理有什么不安全的地方吗?

c winapi
1个回答
0
投票
  1. 您没有进行任何错误检查或错误处理,因此例如,如果
    CreateFile()
    失败并返回
    NULL
    ,那么该函数将在不久之后尝试取消引用
    NULL
    文件句柄指针而崩溃。
  2. 您在每次调用时都会打开一个新的文件句柄,将一行文本写入该文件,然后再次关闭该文件句柄。这可能效率低下,特别是如果经常调用该函数的话。
  3. 如果从多个线程调用该函数,则该文件将由多个线程并行写入,可能导致
    CreateFile()
    失败和/或文件中的数据出现乱码(取决于文件系统如何优雅地处理对文件的不同步写入)相同的文件)
  4. 如果您的格式字符串扩展到超过 2048 个字符,则
    sprintf_s()
    vsprintf_s()
    将调用 Win32 运行时的 invalid-parameter-handling function,默认情况下,该函数会中止您的程序并显示错误消息 - 可能不会你想要什么。
© www.soinside.com 2019 - 2024. All rights reserved.