Создайте функцию для получения имени пользователя, используя метод try and catch в C++

Я пытаюсь создать функцию для получения имени пользователя, используя метод try and catch в C++. К сожалению, этот код не работает, и мое приложение закрывается при попытке запуска.

QString UserInfo::getFullUserName()
{
  DBG_ENTERFUNC(getFullUserName);
  QString result;
  qDebug("trying to get the username");
  try
{
  struct passwd fullUserData=*getpwnam(getUserName().toLatin1());
  result = fullUserData.pw_gecos;
  // it is the first of the comma seperated records that contain the user name
  result = result.split(",").first();
  if (result.isEmpty())
  {
    result = getUserName();
  }
}
catch (...)
{
    qDebug("exception caught");
}
qDebug() << result;

#endif

  DBG_EXITFUNC;
  return result;
}

Проблема возникает в этой строке кода, так как я поместил распечатки после нее, которые никогда не достигаются.

struct passwd fullUserData=*getpwnam(getUserName().toLatin1());

Кто-нибудь знает в чем здесь проблема?

*Редактировать--------

Вот моя функция getUserName()

QString UserInfo::GetUserName()
{
  DBG_ENTERFUNC(GetUserName);
  QString result;
  foreach (QString environmentEntry, QProcess::systemEnvironment())
  {
    QString varName = environmentEntry.section('=',0,0);
    QString varValue = environmentEntry.section('=',1,1);

    if (varName == "USER" || varName == "USERNAME")
    {
      result = varValue;
    }
  }
  DBG_EXITFUNC;
  return result;
}

1 ответ

getpwnam() возвращается NULL когда имя пользователя не было найдено. Вы потенциально разыменовываете NULL указатель.

   *getpwnam(getUserName().toLatin1());
// ^ potential NULL pointer deref

Всегда проверяйте перед указанием потенциально недопустимого указателя:

struct passwd *fullUserData = getpwnam(getUserName().toLatin1());
//            ^ note pointer
if (fullUserData != NULL) {
    result = fullUserData->pw_gecos;
    //                   ^^ fullUserData is a struct pointer
} else { 
    // throw Exception
}

Если вас это смущает, вы можете прочитать о C++ и указателях.

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