C++ - ошибка sprintf "переменная может быть небезопасной" (C4996)... альтернативы?

Вот мой код:

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#pragma comment(lib,"ws2_32.lib")
#include "stdafx.h"
#include <assert.h>
#include "Bootpd.h"
#include <iostream>
#include <string>
#include <iphlpapi.h>


char *MAC() {
    PIP_ADAPTER_INFO AdapterInfo;
    DWORD dwBufLen = sizeof(AdapterInfo);
    char *mac_addr = (char*)malloc(20);

    AdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
    assert(AdapterInfo != NULL); //Error allocating memory

    // Make an initial call to GetAdaptersInfo to get the necessary size into the dwBufLen variable
    if (GetAdaptersInfo(AdapterInfo, &dwBufLen) == ERROR_BUFFER_OVERFLOW) {
        AdapterInfo = (IP_ADAPTER_INFO *)malloc(dwBufLen);
        assert(AdapterInfo != NULL);
    }

    if (GetAdaptersInfo(AdapterInfo, &dwBufLen) == NO_ERROR) {
        PIP_ADAPTER_INFO info = AdapterInfo; //Copy information
        sprintf(mac_addr, "%02X:%02X:%02X:%02X:%02X:%02X",
            info->Address[0], info->Address[1],
            info->Address[2], info->Address[3],
            info->Address[4], info->Address[5]);
    }
    free(AdapterInfo);
    return mac_addr;
}

Я использую VS 2015 в Windows 10. Я пытаюсь отформатировать информацию о MAC-адресе моего сетевого адаптера, чтобы она выглядела как MAC-адрес (aa:bb:cc:dd:ee:ff). Я уже пытался определить _CRT_SECURE_NO_WARNINGS и отключение предупреждения 4996 выше моего #include заявления без успеха. Есть ли что-то, что мне не хватает, или кто-нибудь знает другую работу, чтобы избавиться от sprintf ошибка variable may be unsafe? Благодарю.

1 ответ

Компилятор жалуется на возможность переполнения массива mac_addr. Дайте sprintf_s шанс. https://en.cppreference.com/w/c/io/fprintf

Другие вопросы по тегам