TL; DR
std::string GetVideoCardInfo(int & memoryVar)
{
memoryVar = m_videoCardMemory;
return m_videoCardDescription;;
}
bool writeGPUnameDesc() {
int cardMem;
std::string cardDesc = m_D3D->GetVideoCardInfo(cardMem);
std::ofstream myfile;
myfile.open("gpuNameAndDesc.txt");
myfile << "Graphics card name: " << cardDesc;
myfile << " - Graphics card memory: " << cardMem;
myfile.close();
return true;
}
Объяснение
strcpy_s(cardName, 128, m_videoCardDescription);
- вопиющая ложь.Размер cardName
составляет ровно один символ.Если вы врете strcpy_s
, то дополнительная проверка, чтобы убедиться, что буфер не переполнен, вам не поможет.
Низшие решения
Замените
char cardDesc;
на
char cardDesc[129];
Более эффективный подход полностью избавляет от магических чисел .
В верхней части файла
namespace // annonymous namespace. Contents will not leak out of the file
{
constexpr int MAX_CARD_NAME_LENGTH = 129 // 128 plus room for nul terminator
}
, а затем
void GetVideoCardInfo(int* memoryVar, char* cardName)
{
strcpy_s(cardName, MAX_CARD_NAME_LENGTH, m_videoCardDescription);
*memoryVar = m_videoCardMemory;
return;
}
и
bool writeGPUnameDesc() {
char cardDesc[MAX_CARD_NAME_LENGTH]; // now an array
int cardMem;
m_D3D->GetVideoCardInfo(&cardMem, cardDesc); // don't need to take address of array
std::ofstream myfile;
myfile.open("gpuNameAndDesc.txt");
myfile << "Graphics card name: " << cardDesc;
myfile << " - Graphics card memory: " << cardMem;
myfile.close();
return true;
}